找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4142|回复: 2
打印 上一主题 下一主题
收起左侧

LCD1602 2×16 字符型液晶驱动程序的研究与试写

[复制链接]
跳转到指定楼层
楼主
ID:71407 发表于 2014-12-31 00:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       这段时间放假,因此终于有时间来做些小东西了,最近准备做一个恒温烙铁,要用到LCD液晶,由于以前买了一个一直没用过,所以在液晶模块编程方面的经验为0.刚好了,今天花了半天的时间研究终于有了研究成果。




        本人研究步骤如下:
        1、翻箱底,找出多年前买的液晶模块。
        2、查询模块的数据手册(datasheet),确定信号引脚
        3、根据手册信息建立供电电路连接和数据信号的链接
        4、阅读模块手册中的时序操作,编写出读写底层函数
        5、阅读命令控制字描述,确定控制字数值
        6、参考网络上其他人的程序,验证自己的阅读结果是否有方向性错误
        7、编写测试程序,让液晶模块显示出想要显示的数值、
以下即为研究结果。
  1. #include <reg51.h>
  2. sbit rs=P3^3;//指令数据选择
  3. sbit rw=P3^4;//读写选择
  4. sbit clk=P3^5;//使能脉冲
  5. unsigned char code Code1[]="0123456789ABCDEF";//文字数组
  6. sbit clear = P2^0;//清屏按钮
  7. sbit key1 = P2^1;//写第一行按钮
  8. sbit key2 = P2^2;//写第二行按钮
  9. sbit key3 = P2^3;//显示模式变更测试按钮
  10. void delay2ms()//2064周期延时
  11. {
  12. unsigned char temp1;
  13. while(--temp1);
  14. while(--temp1);
  15. while(--temp1);
  16. while(--temp1);
  17. }
  18. void check_busy()//忙检测
  19. {
  20. unsigned char busy;//临时字节
  21. do
  22. {
  23. rs=0;//选择寄存器
  24. rw=1;//读取
  25. clk=1;//LCD将数据放到总线
  26. busy=P1;//读入总线数据
  27. clk=0;//关闭总线
  28. busy=busy&0x80;//保留最高位
  29. }while(busy);//判断是否为忙
  30. }
  31. void instructions(unsigned char INS)//写指令函数
  32. {
  33. check_busy();//写之前检测忙
  34. rs=0;//选择指令寄存器
  35. rw=0;//写操作
  36. clk=1;//准备下降沿
  37. P1=INS;//数据放到总线上
  38. clk=0;//下降沿,数据写入LCD
  39. }
  40. void write_data(unsigned char dat)//写数据函数
  41. {
  42. check_busy();//写之前检测忙
  43. rs=1;//选择数据寄存器
  44. rw=0;//写操作
  45. clk=1;//准备下降沿
  46. P1=dat;//数据放到总线上
  47. clk=0;//下降沿,数据写入LCD
  48. }
  49. void lcd_clear()//清除显示函数
  50. {
  51. instructions(0x01);//清除显示
  52. delay2ms();//清屏后,按手册至少应延时1.53ms
  53. }
  54. void lcd_init()
  55. {
  56. rw=0;//写操作
  57. instructions(0x38);//设置显示模式为2行,16字符,5×8点阵
  58. delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
  59. instructions(0x0f);//设置输入模式为8位数据总线,光标增量移动,显示不移位
  60. delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
  61. instructions(0x06);//开显示,关闭光标,不闪烁
  62. delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
  63. }
  64. void main()
  65. {
  66. unsigned char m;//辅助寻址指针变量
  67. lcd_init();//LCD初始化
  68. while(1)
  69. {
  70. if(!key1)//判断按键是否按下
  71.     {
  72. instructions(0x80+0x00);//写入显示缓冲区起始地址为1行1列
  73.     delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
  74. for(m=0;m<16;m++)//将预先定义好的字符连续发送到LCD
  75.    {
  76.    write_data(Code1
  77. ????);//通过辅助变量查询数组并写入LCD
  78.    }
  79. }
  80. if(!key2)//判断按键是否按下
  81.     {
  82. instructions(0x80+0x40);//写入显示缓冲区起始地址为2行1列
  83.     delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
  84. for(m=0;m<16;m++)//将预先定义好的字符连续发送到LCD
  85.    {
  86.    write_data(Code1
  87. ??);//通过辅助变量查询数组并写入LCD
  88.    }
  89. }
  90. if(!clear)//判断按键是否按下
  91.     {
  92. lcd_clear();//调用清屏函数
  93. }
  94. if(!key3)//判断按键是否按下
  95.     {
  96. instructions(0x0c);//改变显示模式
  97.     delay2ms();//按手册应至少延时39us,但由于执行次数不多,统一使用2ms延时
  98. }
  99. }
  100. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:72901 发表于 2015-1-28 12:23 | 只看该作者
不错值得学习
回复

使用道具 举报

板凳
ID:43559 发表于 2015-3-7 20:02 | 只看该作者
编译烧录试验。
在按钮控制下俩行咋都显示“j”?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表