#i nclude <reg52.H> #i nclude <intrins.H>#define uchar unsigned char #define uint unsigned int uchar code datas1[] = {"1 2 3 4--14 15 L"}; uchar idata datas2[] = {"U 380.5 P 142.0"}; uchar idata datas3[] = {"I 250.7 Q 82.3"}; uchar idata datas4[] = {"PF 0.966 f 50.4"}; unsigned char dat[]={" "}; //延時約2us void delayUs() { _nop_();_nop_(); } //延時 a * 1ms void delayMs(uint a) { uint i, j; for(i = a; i > 0; i--) for(j = 100; j > 0; j--); }
//檢測LCD是否處于忙狀態(tài), 若忙返回1, 空閑返回0 bit checkBusy() { bit busy; RS = 0; RW = 1; E = 1; delayUs(); busy = (bit)(LCD_DATA&0x80); E = 0; return busy; } //等待LCD到空閑 void wait() { while(checkBusy()); } //寫命令 void writeCmd(uchar cmd) { wait(); RS = 0; RW = 0; E = 0; delayUs(); LCD_DATA = cmd; delayUs(); E = 1; delayUs(); E = 0; } //寫數(shù)據 void writeData(uchar dat) { wait(); RS = 1; RW = 0; E = 0; delayUs(); LCD_DATA = dat; delayUs(); E = 1; delayUs(); E = 0; } //初始化LCD void init() { PSB = 1; //并口方式 writeCmd(0x30); //基本指令, 擴充指令為34H delayMs(10); writeCmd(0x0c); //顯示開, 關光標 delayMs(10); writeCmd(0x01); //清屏 delayMs(10); } void setPosition(uchar x, uchar y) { uchar p; switch(x%4) { case 0: p = 0x80; break; //第一行開始地址 case 1: p = 0x90; break; //第二行 case 2: p = 0x88; break; //第三行 case 3: p = 0x98; break; //第四行 } p += y; writeCmd(p); } void writeString(uchar * str) { uchar i = 0; while(str[i] != '\0') { writeData(str[i++]); } } void main(){ dula = wela = 0; init(); setPosition(0, 0); writeString(datas1); setPosition(1, 0); writeString(datas2); setPosition(2, 0); writeString(datas3); setPosition(3, 0); writeString(datas4);while(1);} |