[求助]使用RA8835控制的MS320240A液晶模块驱动问题 小弟最近在做MS320240A的驱动程序,时序为8080时序,单片机为AT89s51,一直未能调通。由于首次接触这类的液晶屏,对RA8835的显示区和每个显示区的地址设定弄不明白,希望各位大哥大姐多多指点。以下是我的测试程序,运行后,有四分之一没有显示,有四分之三为块状全显示。 #include <REG51.h> #include <INTRINS.H> #define uchar unsigned char #define uint unsigned int #define LCM_DATA P0 sbit W_R=P1^3; sbit R_D=P1^2; sbit CS=P1^0; sbit A0=P3^4; sbit RES=P3^2; #define CR 39 /*定义显示窗口的长度,以字节为单位*/ #define TCR 52 /*定义LCD的时间常数*/ #define LF 239 /*定义LCD的行数*/ #define APL 40 /*定义LCD一行所占缓冲区的字节数,低8位*/ #define APH 0 /*定义LCD一行所占缓冲区的字节数,高8位*/ #define SAD1 0x0000/**/ #define SAD1L 0x00/**/ #define SAD1H 0x00/**/ #define SL1 20/**/ #define SAD2 0x2800/**/ #define SAD2L 0x00/**/ #define SAD2H 0x28/**/ #define SL2 20/**/ #define SAD3 0x5000/**/ #define SAD3L 0x00/**/ #define SAD3H 0x50/**/ #define SAD4 0x2800/**/ #define SAD4L 0x00/**/ #define SAD4H 0x28/**/ unsigned char code LCMSYSINIT[8]={0x30,0x87,0x07,CR,TCR,LF,APL,APH}; unsigned char code LCMSCRINIT[10]={SAD1L,SAD1H,SL1,SAD2L,SAD2H,SL2,SAD3L,SAD3H,SAD4L,SAD4H}; //****************************************************************** //***************************************************************************************************************** /********************************** * 函数原型:void Delay_nop() * 功 能:nop语句 ***********************************/ void Delay_nop() { uchar i; for(i=5;i> 0;i--)i=i; // for(i=0;i <5;i++)i=i; } /********************************** * 函数原型:void DelayXus(void) * 功 能:延时Xus,未实际测试 ***********************************/ void DelayXus(uchar dt) { uchar i; for(i=5*dt;i> 0;i--); } /*************************************** * 函数原型:void DelayXms(uint dt) * 功 能:延时Xms,经过实际测试 ***************************************/ void DelayXms(uint dt) { uint i,j; for(i=0;i <dt;i++) for(j=0;j <2370;j++); } /*******写命令*********/ void LCM_WrCmd(unsigned char CMD) { CS=0; A0=1; _nop_();_nop_();_nop_(); LCM_DATA=CMD; _nop_();_nop_();_nop_(); R_D=1; W_R=0;_nop_(); W_R=1;_nop_(); CS=1;_nop_(); } /********写数据********/ void LCM_WrData(unsigned char DATA) { CS=0; A0=0; _nop_();_nop_();_nop_(); LCM_DATA=DATA; _nop_();_nop_();_nop_(); R_D=1; W_R=0;_nop_(); W_R=1;_nop_(); CS=1;_nop_(); } /****************/ void LCM_Init() { unsigned char xdata counter; LCM_WrCmd(0x40); for(counter=0;counter <8;counter++) {LCM_WrData(LCMSYSINIT[counter]);DelayXus(10);} LCM_WrCmd(0x44); for(counter=0;counter <10;counter++) {LCM_WrData(LCMSCRINIT[counter]);DelayXus(10);} LCM_WrCmd(0x59);//DelayXus(10);//开显示 LCM_WrData(0x54);//DelayXus(10);// LCM_WrCmd(0x5A);//DelayXus(10);//水平移动 LCM_WrData(0x00);//DelayXus(10);//不移动 LCM_WrCmd(0x4F);//DelayXus(10);//光标移动方向:向左0x4D,向右0x4C,向上0x4E,向下0x4F LCM_WrCmd(0x5B);//DelayXus(10);//重叠显示 LCM_WrData(0x0E);//DelayXus(10); LCM_WrCmd(0x5D);//DelayXus(10);// LCM_WrData(0x07);//DelayXus(10); LCM_WrData(0x87);//DelayXus(10); } //****************************************************************** /***************系统主函数*******************/ void main(void) { unsigned int i; RES=1; DelayXms(500); LCM_Init(); DelayXms(100); for(i=0;i <50;i++) { LCM_WrCmd(0x46);DelayXus(10); LCM_WrData(0x80);DelayXus(10); LCM_WrData(0x80);DelayXus(10); LCM_WrCmd(0x42);DelayXus(10); LCM_WrData(0x30);DelayXus(10); if(i> 120)i=0; } } [详细内容] |