| 
 
| 本帖最后由 oufuqiang 于 2010-4-4 11:15 编辑 
 LCD1602 2×16 字符型液晶驱动程序的研究与试写
 
 这段时间放假,因此终于有时间来做些小东西了,最近准备做一个恒温烙铁,要用到LCD液晶,由于以前买了一个一直没用过,所以在液晶模块编程方面的经验为0.刚好了,今天花了半天的时间研究终于有了研究成果。         本人研究步骤如下:
 1、翻箱底,找出多年前买的液晶模块。
 2、查询模块的数据手册(datasheet),确定信号引脚
 3、根据手册信息建立供电电路连接和数据信号的链接
 4、阅读模块手册中的时序操作,编写出读写底层函数
 5、阅读命令控制字描述,确定控制字数值
 6、参考网络上其他人的程序,验证自己的阅读结果是否有方向性错误
 7、编写测试程序,让液晶模块显示出想要显示的数值、
 以下即为研究结果。
 #include <reg51.h>
 sbit rs=P3^3;//指令数据选择
 sbit rw=P3^4;//读写选择
 sbit clk=P3^5;//使能脉冲
 unsigned char code Code1[]="0123456789ABCDEF";//文字数组
 sbit clear = P2^0;//清屏按钮
 sbit key1 = P2^1;//写第一行按钮
 sbit key2 = P2^2;//写第二行按钮
 sbit key3 = P2^3;//显示模式变更测试按钮
 void delay2ms()//2064周期延时
 {
 unsigned char temp1;
 while(--temp1);
 while(--temp1);
 while(--temp1);
 while(--temp1);
 }
 void check_busy()//忙检测
 {
 unsigned char busy;//临时字节
 do
 {
 rs=0;//选择寄存器
 rw=1;//读取
 clk=1;//LCD将数据放到总线
 busy=P1;//读入总线数据
 clk=0;//关闭总线
 busy=busy&0x80;//保留最高位
 }while(busy);//判断是否为忙
 }
 void instructions(unsigned char INS)//写指令函数
 {
 check_busy();//写之前检测忙
 rs=0;//选择指令寄存器
 rw=0;//写操作
 clk=1;//准备下降沿
 P1=INS;//数据放到总线上
 clk=0;//下降沿,数据写入LCD
 }
 void write_data(unsigned char dat)//写数据函数
 {
 check_busy();//写之前检测忙
 rs=1;//选择数据寄存器
 rw=0;//写操作
 clk=1;//准备下降沿
 P1=dat;//数据放到总线上
 clk=0;//下降沿,数据写入LCD
 }
 void lcd_clear()//清除显示函数
 {
 instructions(0x01);//清除显示
 delay2ms();//清屏后,按手册至少应延时1.53ms
 }
 void lcd_init()
 {
 rw=0;//写操作
 instructions(0x38);//设置显示模式为2行,16字符,5×8点阵
 delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
 instructions(0x0f);//设置输入模式为8位数据总线,光标增量移动,显示不移位
 delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
 instructions(0x06);//开显示,关闭光标,不闪烁
 delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
 }
 void main()
 {
 unsigned char m;//辅助寻址指针变量
 lcd_init();//LCD初始化
 while(1)
 {
 if(!key1)//判断按键是否按下
 {
 instructions(0x80+0x00);//写入显示缓冲区起始地址为1行1列
 delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
 for(m=0;m<16;m++)//将预先定义好的字符连续发送到LCD
 {
 write_data(Code1[m]);//通过辅助变量查询数组并写入LCD
 }
 }
 if(!key2)//判断按键是否按下
 {
 instructions(0x80+0x40);//写入显示缓冲区起始地址为2行1列
 delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
 for(m=0;m<16;m++)//将预先定义好的字符连续发送到LCD
 {
 write_data(Code1[m]);//通过辅助变量查询数组并写入LCD
 }
 }
 if(!clear)//判断按键是否按下
 {
 lcd_clear();//调用清屏函数
 }
 if(!key3)//判断按键是否按下
 {
 instructions(0x0c);//改变显示模式
 delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
 }
 }
 }
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |