例子有 http://blog.21ic.com/user1/1347/archives/2006/13422.html 使用北京青云的LCM128645ZK液晶模块的总结 sillboy 发表于 2006-4-11 17:26:00
lanfeng008 发表于 2006-4-7 10:03 技术交流 ←返回版面
使用北京青云的LCM128645ZK液晶模块的总结
本人因作毕业设计,其中使用了北京青云的LCM128645ZK液晶模块,网上查找资料较少所以就算给大家提个醒。 最重要的一点是,如果你使用串行方式进行控制则一定要注意串/并方式选择。资料中说在模块背面有个跳线进行选择,但是其制作时并非标准的有跳线针而是简单的三个焊盘之间使用个“0”欧的贴片电阻进行了短接。这一点一定要注意你的模块是跳在哪一边的,一般出厂是在S/P的P端。有的可能线路板上标记不清如我的就只写了“S1”,害得我好找。如果不能确定是打在哪边的则可以给模块上电的情况下用表量下PSB(15脚)的电压为“1”时为并行模式,否则为串行,则可以将跳线改接到合适位置。但是贴片不容易焊接,完全可以用细的金属如电阻的边角直接进行短接。 以下是我的调试程序: #i nclude<reg51.h> #i nclude<absacc.h> #i nclude<INTRINS.H> #define uchar unsigned char
sbit SID=P1^1; sbit SCLK=P1^0; sbit RST=P1^2; void delay_1ms() { uchar j; for(j=0;j<50;j++){} } //串行数据输入一字节 void s_SendByte(uchar s_data) { uchar i; SID=0; SCLK=0; for(i=0;i<8;i++) { SID=(bit)(s_data & 0x80); _nop_(); //必须添加,否则会影响传输数据的准确性。 SCLK=1; _nop_(); //必须添加,否则会影响传输数据的准确性。 s_data<<=1; _nop_(); //必须添加,否则会影响传输数据的准确性。 SCLK=0; _nop_(); } } //命令输入 void send_comm(uchar comm_data) { uchar i; _nop_(); s_SendByte(0xF8 & 0xFF); //send 1 1 1 1 1 RW=0 RS=0 0 _nop_(); s_SendByte(comm_data & 0xF0); //send D7 D6 D5 D4 0 0 0 0 _nop_(); s_SendByte((comm_data & 0x0F)<<4); //send D3 D2 D1 D0 0 0 0 0 for(i=0;i<3;i++) delay_1ms(); } //数据输入 void send_data(uchar send_data) { uchar i; s_SendByte(0xFA & 0xFF); // 1 1 1 1 1 RW=0 RS=1 0 _nop_(); s_SendByte(send_data & 0xF0); //send D7 D6 D5 D4 0 0 0 0 _nop_(); s_SendByte((send_data & 0x0F)<<4); //send D3 D2 D1 D0 0 0 0 0 for(i=0;i<100;i++); //delay 100us } //初始化 void LCD_init(void) { uchar i; RST=0; for(i=0;i<20;i++) delay_1ms(); RST=1; RST=1; SCLK=0; for(i=0;i<40;i++) //延时40ms delay_1ms(); send_comm(0x30); //功能设置,一次送8位数据,基本指令集 for(i=0;i<100;i++); send_comm(0x30); //功能设置,一次送8位数据,基本指令集 for(i=0;i<100;i++); send_comm(0x0c); //0000,1100 整体显示,游标off,游标位置off for(i=0;i<100;i++); send_comm(0x01); //0000,0001 清DDRAM for(i=0;i<10;i++); delay_1ms(); send_comm(0x06); //0000,0010 DDRAM地址归位 delay_1ms(); send_comm(0x80); //1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC delay_1ms(); send_comm(0x04); //点设定,显示字符/光标从左到右移位,DDRAM地址加 一 delay_1ms(); //send_comm(0x0F); //显示设定,开显示,显示光标,当前显示位反白闪动 //delay_1ms(); //send_comm(0x06); for(i=0;i<5;i++); delay_1ms(); }
void display(uchar x_add,uchar dat1,uchar dat2) { send_comm(x_add); delay_1ms(); send_data(dat1); _nop_(); send_data(dat2); _nop_(); } //构建显示介面 void disp_form(void) { uchar i,place,chann; for(i=0;i<8;i++) { place=0x80+4*i; chann=i+0x31; display(place,0x43,0x48); display(place+1,chann,0x3A); display(place+3,0x25,0x20); } }
main() { uchar i,j,p,m,n,num1,num2; LCD_init(); send_comm(0x81); send_comm(0x30); send_comm(0x01); send_comm(0x36); send_comm(0x30); disp_form(); while(1) { delay_1ms(); if(p>99)p=0; m=p/10;n=(p-10*m); display(0x82,(0x30+m),(0x30+n)); //显示数据 for(j=0;j<100;j++) for(i=0;i<100;i++) delay_1ms(); //send_comm(0x01); delay_1ms(); p++; } }
本程序主要是实现在液晶屏上显示八个数据采集通道“CH1-CH8”,和一个改变的通道1CH1的数据。本程序仅用于调试显示数据等没有什么特殊意义。 这是本人在贵论坛的第一次举手发言请大家指教。 |