用STC8H8K64U驱动2.4寸tft屏,IC是HX8347I,采用16bit模式,初始化的命令和数据均低8位有效,P0接低八位,P2接高八位,不需要LCM中断,我用io模拟能驱动,说明接线,初始化都没有问题。下面是改的硬件LCM驱动屏,最后的效果就是红色和青色正反方向循环刷屏。
- #include "STC8H.H"
- #include "IO_int.H"
- #include "uart.H"
-
-
- //液晶屏IC所需要的信号线的接口定义
-
- sbit CS0=P1^3; //CS
- sbit reset=P1^4; //RES
-
- sbit DC0=P4^5; //RS(A0)
- sbit WR0=P4^2; //R/W
- sbit RD0=P4^4; //E
-
- void Delay(unsigned int xms) //11.0MHz 1ms
- {
- unsigned char i, j;
-
- while(xms--)
- {
- i = 15;
- j = 90;
- do
- {
- while (--j);
- } while (--i);
-
-
- }
-
- }
-
- void delay_us(int i)
- {
- int j,k;
- for(j=0;j<i;j++);
- for(k=0;k<1;k++);
- }
-
- void lcmint()
- {
- P_SW2 |= 0x80; //扩展寄存器访问使能
-
- LCMIFCFG=0X02;
-
- LCMIFCFG2=0X00;
-
- LCMIFCR=0X80;
-
- LCMIFSTA = 0x00;
- }
-
- //void WriteComm(int com1)
- //{
- // CS0 = 0;
- // DC0 = 0;
- // RD0 = 1;
- // P0=com1;
- // WR0 = 0;
- // delay_us(1);
- // WR0 = 1;
- // CS0 = 1;
- //}
- //void WriteData(int data1)
- //{
- // CS0 = 0;
- // DC0 = 1;
- // RD0 = 1;
- // P0=data1;
- // WR0 = 0;
- // WR0 = 1;
- // CS0 = 1;
- //}
-
- void WriteComm(char com1)
- {
-
- LCMIFDATL=com1;
- CS0 = 0;
- LCMIFCR=0x84;
-
- CS0 = 1;
-
- }
- void WriteData(char data1)
- {
-
- LCMIFDATL=data1;
- CS0 = 0;
- LCMIFCR=0X85;
- CS0 = 1;
-
- }
-
- //连写2个字节(即16位)数据到LCD模块
- //void transfer_data_16(int data_16bit)
- //{
-
- // CS0 = 0;
- // DC0 = 1;
- // RD0 = 1;
- // P2=data_16bit>>8; //P2口接高位
- // P0=data_16bit; //P0口接低位
- // WR0 = 0;
- // WR0 = 1;
- // CS0 = 1;
- //}
-
- void transfer_data_16(int data_16bit)
- {
-
- LCMIFDATH=data_16bit>>8; //P2口接高位
- LCMIFDATL=data_16bit; //P0口接低位
- CS0 = 0;
- LCMIFCR=0X85;
-
-
- CS0 = 1;
-
- }
-
-
-
-
- //void LCD_reg(unsigned char command,unsigned char dat)
- //{
- // WriteComm(command); //
- // WriteData(dat);
- //}
-
- //************* 初始化程序HX8347I 成功**********//
- void lcd_initial()
- {
-
-
- //Delay(200);
- //reset=0;
- //Delay(200);
- //reset=1;
-
- WriteComm(0x01); //软复位
-
- Delay(200); //必须有50ms以上的延时
-
- WriteComm(0xB9);
- WriteData(0xFF);
- WriteData(0x83);
- WriteData(0x47);
- Delay(50);
-
- WriteComm(0xB1); // Set BT[2:0] = 4 before sleep out
- WriteData(0x00);
- WriteData(0x04); // BT[2:0] = 4
-
- WriteComm(0x11); // Sleep Out
- Delay(120);
-
- WriteComm(0x3A); //SET COLOR
- WriteData(0x05); // 06 262k//05 65k
-
- WriteComm(0xBF); //
- WriteData(0x00);
- WriteData(0x26);
-
- WriteComm(0xCC);
- WriteData(0x09); // BGR
-
- WriteComm(0xB0); //
- WriteData(0x88); //
-
-
- WriteComm(0xB1); //
- WriteData(0x00);
- WriteData(0x01); //
- WriteData(0x1C); // VREG1OUT
-
- WriteComm(0xB4); //
- WriteData(0x11);
- WriteData(0xFF);
- WriteData(0x00);
- WriteData(0x02);
- WriteData(0X02);
- WriteData(0x04);
- WriteData(0x80);
-
- WriteComm(0xB5); //
- WriteData(0x0b); // Vref
-
- WriteComm(0xB6); //
- WriteData(0x23); // vcomh
- WriteData(0x63); // vcoml
-
- WriteComm(0xFD); //
- WriteData(0x6A); // VCOM_Offset
-
- WriteComm(0xE3); // EQ
- WriteData(0x20);
- WriteData(0x10);
- WriteData(0x10);
- WriteData(0x20);
- WriteData(0x20);
- WriteData(0x20);
-
- WriteComm(0xE0); // Gamma
- WriteData(0x00);
- WriteData(0x00);
- WriteData(0x04);
- WriteData(0x11);
- WriteData(0x0F);
- WriteData(0x28);
- WriteData(0x0E);
- WriteData(0x53);
- WriteData(0x09);
- WriteData(0x13);
- WriteData(0x17);
- WriteData(0x18);
- WriteData(0x1A);
- WriteData(0x17);
- WriteData(0x30);
- WriteData(0x2E);
- WriteData(0x3B);
- WriteData(0x3F);
- WriteData(0x3F);
- WriteData(0x2C);
- WriteData(0x71);
- WriteData(0x05);
- WriteData(0x07);
- WriteData(0x08);
- WriteData(0x0C);
- WriteData(0x16);
- WriteData(0x88);
-
- WriteComm(0x29); // Display On
- Delay(5);
-
- //WriteComm(0x2C); // Write Ram
-
-
- }
-
- //定义窗口坐标:开始坐标(XS,YS)以及窗口大小(x_total,y_total)
- void lcd_address(unsigned int XS,unsigned int YS,unsigned int x_total,unsigned int y_total)
- { // 0 0 240 320
- int XE,YE;
- XE=XS+x_total-1;
- YE=YS+y_total-1;
- WriteComm(0x2a);
- // 设置X开始及结束的地址
- transfer_data_16(XS); // X 开始地址(16 位)
- transfer_data_16(XE); // X 结束地址(16 位)
- WriteComm(0x2b);
- // 设置Y开始及结束的地址
- transfer_data_16(YS); // Y 开始地址(16 位)
- transfer_data_16(YE); // Y 结束地址(16 位)
- WriteComm(0x2c);
- }
- // 写数据开始
-
- void mono_transfer_data_16(int mono_data,int font_color,int back_color)
- {
- int i;
- for(i=0;i<8;i++)
- {
- if(mono_data&0x80)
- {
- transfer_data_16(font_color);
- //当数据是1时,显示字体颜色
- }
- else
- {
- transfer_data_16(back_color); //当数据是0时,显示底色
- }
- mono_data<<=1;
- }
- }
-
-
- //全屏显示一种颜色
- void display_color(int color_data)
- {
- int i,j;
- lcd_address(0,0,240,320);
- for(i=0;i<240;i++)
- {
- for(j=0;j<320;j++)
- {
- transfer_data_16(color_data);
-
- }
- }
- }
-
-
-
-
-
-
-
-
- void main(void)
- {
-
- <blockquote> P0M0 = 0x00; P0M1 = 0x00;
复制代码
|