ili9341液晶屏51单片机驱动讨论

2019-07-18 08:40发布

proteus 8.4 中有 avr(andrino)驱动液晶屏ili9341例子
我按照该例子连接51单片,使用瑞生网 3线spi的程序,无法点亮ili9341
1 连线是否有问题?特别是3.6接wd 和程序里说的不一致
2 程序是否有问题?例程上是stc12c5a60s2

51_ili9341.jpg
avr_ili9341.jpg

附件内容: 3线spi例程;8.4 自带avr 9341仿真; 有问题的51 9341仿真
ili9341_proteus.rar (2.99 MB, 下载次数: 274)

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
linuxcso
2019-07-18 09:03
51 例程 3线spi
#include "stc12c5a60s2.h"
#include <intrins.h>

#define     RED          0XF800          //ºìÉ«
#define     GREEN        0X07E0          //ÂÌÉ«
#define     BLUE         0X001F          //À¶É«
#define     WHITE        0XFFFF          //°×É«

#define DATA_H P2
#define DATA_L P0

sbit LCD_CS = P3^2;
sbit LCD_RESET = P3^6;
sbit LCD_MOSI = P1^5;
sbit LCD_MISO = P1^6;
sbit LCD_SCK = P1^7;//¾ÍÊÇTFTÉϵÄLCD_RSÒý½Å

void Delay1ms()                //@12.000MHz
{
        unsigned char i, j;

        i = 12;
        j = 169;
        do
        {
                while (--j);
        } while (--i);
}

void delay_ms(unsigned int ms)
{
        while(ms--)
        {
                Delay1ms();
        }
}

unsigned char SPI_RW(unsigned char byte)
{
        unsigned char bit_ctr;
       
        for(bit_ctr=0;bit_ctr<8;bit_ctr++) // Êä³ö8λ
        {
                LCD_SCK=0;
                LCD_MOSI=(byte&0x80); // MSB TO MOSI
                byte=(byte<<1);        // shift next bit to MSB
                LCD_SCK=1;
                byte|=LCD_MISO;                // capture current MISO bit
        }
        return byte;
}

void LCD_WR_DATA(unsigned char val)
{
        LCD_CS=0;
        LCD_SCK=0;
        LCD_MOSI=1;
        LCD_SCK=1;
        SPI_RW(val);
        LCD_CS=1;
}

void LCD_WR_REG(unsigned char reg)
{
        LCD_CS=0;
        LCD_SCK=0;
        LCD_MOSI=0;
        LCD_SCK=1;
        SPI_RW(reg);
        LCD_CS=1;
}

void LCD_Init()
{
        P0=0;
        P2=0;
        LCD_RESET=0;
        delay_ms(10);
        LCD_RESET=1;
        delay_ms(120);
        LCD_WR_REG(0xCF);  
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0xC1);
        LCD_WR_DATA(0X30);
        LCD_WR_REG(0xED);  
        LCD_WR_DATA(0x64);
        LCD_WR_DATA(0x03);
        LCD_WR_DATA(0X12);
        LCD_WR_DATA(0X81);
        LCD_WR_REG(0xE8);  
        LCD_WR_DATA(0x85);
        LCD_WR_DATA(0x10);
        LCD_WR_DATA(0x7A);
        LCD_WR_REG(0xCB);  
        LCD_WR_DATA(0x39);
        LCD_WR_DATA(0x2C);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x34);
        LCD_WR_DATA(0x02);
        LCD_WR_REG(0xF7);  
        LCD_WR_DATA(0x20);
        LCD_WR_REG(0xEA);  
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_REG(0xC0);    //Power control
        LCD_WR_DATA(0x1B);   //VRH[5:0]
        LCD_WR_REG(0xC1);    //Power control
        LCD_WR_DATA(0x01);   //SAP[2:0];BT[3:0]
        LCD_WR_REG(0xC5);    //VCM control
        LCD_WR_DATA(0x30);          //3F
        LCD_WR_DATA(0x30);          //3C
        LCD_WR_REG(0xC7);    //VCM control2
        LCD_WR_DATA(0XB7);
        LCD_WR_REG(0x36);    // Memory Access Control
        LCD_WR_DATA(0x48);
        LCD_WR_REG(0x3A);   
        LCD_WR_DATA(0x55);
        LCD_WR_REG(0xB1);   
        LCD_WR_DATA(0x00);   
        LCD_WR_DATA(0x1A);
        LCD_WR_REG(0xB6);    // Display Function Control
        LCD_WR_DATA(0x0A);
        LCD_WR_DATA(0xA2);
        LCD_WR_REG(0xF2);    // 3Gamma Function Disable
        LCD_WR_DATA(0x00);
        LCD_WR_REG(0x26);    //Gamma curve selected
        LCD_WR_DATA(0x01);
        LCD_WR_REG(0xE0);    //Set Gamma
        LCD_WR_DATA(0x0F);
        LCD_WR_DATA(0x2A);
        LCD_WR_DATA(0x28);
        LCD_WR_DATA(0x08);
        LCD_WR_DATA(0x0E);
        LCD_WR_DATA(0x08);
        LCD_WR_DATA(0x54);
        LCD_WR_DATA(0XA9);
        LCD_WR_DATA(0x43);
        LCD_WR_DATA(0x0A);
        LCD_WR_DATA(0x0F);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);                  
        LCD_WR_REG(0XE1);    //Set Gamma
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x15);
        LCD_WR_DATA(0x17);
        LCD_WR_DATA(0x07);
        LCD_WR_DATA(0x11);
        LCD_WR_DATA(0x06);
        LCD_WR_DATA(0x2B);
        LCD_WR_DATA(0x56);
        LCD_WR_DATA(0x3C);
        LCD_WR_DATA(0x05);
        LCD_WR_DATA(0x10);
        LCD_WR_DATA(0x0F);
        LCD_WR_DATA(0x3F);
        LCD_WR_DATA(0x3F);
        LCD_WR_DATA(0x0F);
        LCD_WR_REG(0x2B);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x01);
        LCD_WR_DATA(0x3f);
        LCD_WR_REG(0x2A);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0xef);         
        LCD_WR_REG(0x11); //Exit Sleep
        delay_ms(120);
        LCD_WR_REG(0x29); //display on       
}

void LCD_SetArea(unsigned int stx,unsigned int sty,unsigned int endx,unsigned int endy)
{
        LCD_WR_REG(0x2A);  
        LCD_WR_DATA(stx>>8);   
        LCD_WR_DATA(stx&0xff);           
        LCD_WR_DATA(endx>>8);
        LCD_WR_DATA(endx&0xff);       

        LCD_WR_REG(0x2B);
        LCD_WR_DATA(sty>>8);
        LCD_WR_DATA(sty&0xff);       
        LCD_WR_DATA(endy>>8);
        LCD_WR_DATA(endy&0xff);       
}

void LCD_Clear(unsigned int color)
{  
        unsigned int i,j;

        LCD_SetArea(0,0,239,319);
  LCD_WR_REG(0x2C);
        for(i=0;i<320;i++)
        {
                for(j=0;j<240;j++)
                {
                        LCD_WR_DATA(color>>8);
                        LCD_WR_DATA(color);
                }
        }
}

void main()
{
        delay_ms(100);
        LCD_Init();
       
        while(1)
        {
                LCD_Clear(RED);
                delay_ms(300);
                LCD_Clear(WHITE);
                delay_ms(300);
                LCD_Clear(BLUE);
                delay_ms(300);
                LCD_Clear(GREEN);
                delay_ms(300);
        }
}

一周热门 更多>