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