找回密码
 立即注册

QQ登录

只需一步,快速开始

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

液晶LCD1602滚动显示程序(单个字符,显示所有三种方式)

[复制链接]
跳转到指定楼层
楼主
ID:80436 发表于 2015-5-20 18:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
头文件:
  1. #ifndef __LCD1602_H__
  2. #define __LCD1602_H__
  3. #include <reg51.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <intrins.h >
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. sbit RS = P2^6;
  11. sbit RW = P2^5;
  12. sbit EN = P2^7;
  13. void delay(uint t);
  14. void busy_wait();
  15. void write_LCD_command(uchar cmd);
  16. void write_LCD_data(uchar dat);
  17. void initialize_LCD();
  18. void LCD_showstring(uchar r,uchar c,uchar *str);
  19. #endif
复制代码



主程序:
  1. #include "LCD1602.h"
  2. void delay50us(uint x)
  3. {
  4. uint i;
  5. for(;x>0;x--)
  6. for(i=19;i>0;i--);
  7. }
  8. void delay(uint t)
  9. {
  10. uint i;
  11. while(t--)
  12. {
  13. for(i=0;i<120;i++) ;
  14. }
  15. }
  16. void busy_wait()
  17. {
  18. uint LCD_status;
  19. do
  20. {
  21. P0 = 0XFF;
  22. EN = 0;
  23. RS = 0;
  24. RW = 1;

  25. EN = 1;
  26. LCD_status = P0;
  27. EN = 0;
  28. }while(LCD_status&0x80)        ;
  29. }
  30. void write_LCD_command(uchar cmd)
  31. {
  32. busy_wait();
  33.     EN = 0;
  34. RS = 0;
  35. RW = 0;
  36. P0 = cmd;
  37. _nop_();
  38. _nop_();
  39. _nop_();
  40. EN = 1;
  41. _nop_();
  42. _nop_();
  43. _nop_();
  44. _nop_();
  45. EN = 0;
  46. }
  47. void write_LCD_data(uchar dat)
  48. {
  49. busy_wait();
  50.     EN = 0;
  51. RS = 1;
  52. RW = 0;
  53. P0 = dat;
  54. EN = 1;
  55. _nop_();
  56. EN = 0;
  57. }
  58. void initialize_LCD()
  59. {
  60. write_LCD_command(0x38); delay(1);
  61. write_LCD_command(0x01); delay(1);
  62. write_LCD_command(0x06); delay(1);
  63. write_LCD_command(0x0c); delay(1);

  64. }
  65. void LCD_showstring(uchar r,uchar c,uchar *str)
  66. {
  67. uchar i = 0;
  68. code uint DDRAM[] = {0X80,0Xc0};

  69.    write_LCD_command(DDRAM[r]|c);
  70. for(i = 0; str[i]&&i<16;i++)
  71. {
  72.   write_LCD_data(str[i]) ;
  73. }
  74.     for(;i<16;i++)
  75.     write_LCD_data(' ') ;
  76. }  

  77. #include "LCD1602.h"
  78. sbit k1 = P0^6;
  79. sbit k2 = P0^7;
  80. sbit k3 = P0^5;
  81. uchar   msg[]="happy everyday";
  82. uchar   table1[]= "studing";
  83. void H_scroll_display()             //字符滚动输出
  84. {
  85. uint i;
  86. write_LCD_command(0X0C);
  87.     LCD_showstring(0,0,table1);
  88. delay(500);
  89. loop1:

  90.     for(i=0;i<=13;i++)
  91. {
  92. LCD_showstring(1,0,msg+i);
  93. delay(500);
  94.        if(k1 == 1)
  95. {
  96. return;
  97. }
  98. }

  99. delay(1000);
  100. goto loop1;  
  101. }
  102. void show_all_chars()          //显示LCD1602  字符编码表中的所有的字符
  103. {
  104.     uint i,j=0;
  105. write_LCD_command(0X0C);
  106.     LCD_showstring(0,0,"studing");
  107.     LCD_showstring(1,0,"               ");
  108. loop2:
  109. write_LCD_command(0Xc0);
  110. for(i=0x20;i!=0x00;i++)
  111. {
  112. if(i>=0x80&&i<=0x9f)
  113. continue;
  114. if((++j)%16 == 0)
  115. {
  116. delay(500);
  117. LCD_showstring(1,0,"               ");
  118.    write_LCD_command(0X0C);
  119. j=0;
  120. write_LCD_command(0Xc0);
  121. }
  122. write_LCD_data(i) ;
  123.    delay(20);
  124.       if(k2 == 0)
  125. {
  126. return;
  127. }  
  128. }
  129. delay(500);
  130. goto loop2;
  131. }
  132. uchar CGRAM1[][8]=
  133. {
  134. {0x80,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00}, // 年
  135. {0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x00}, // 月
  136. {0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00}  // 日

  137. };
  138. void write_CGRAM(uchar g[][8],uchar n)          //自定义的字符显示
  139. {
  140. uchar i,j;
  141. write_LCD_command(0X40);
  142. for(i=0;i<n;i++)
  143. for(j=0;j<8;j++)
  144. write_LCD_data(g[i][j]) ;
  145. }
  146. void display_chars()
  147. {
  148. uchar i;
  149. LCD_showstring(1,0,"               ");
  150. write_CGRAM(CGRAM1,3)        ;
  151. write_LCD_command(0Xc0);
  152. loop3:
  153. for(i=0;i<3;i++)
  154. {
  155.    write_LCD_data(i) ;
  156.     write_LCD_data(0x3f) ;
  157. delay(100);
  158. }
  159. if(k3 == 0)
  160. {
  161. return;
  162. }
  163. delay(500);
  164. goto loop3

  165. }
  166. void main()
  167. {       
  168. initialize_LCD();
  169. write_LCD_command(0X80);
  170.     LCD_showstring(0,0,"hello");
  171. while(1)
  172. {
  173.   P0 = 0XFF;
  174. if(k1 == 0)   H_scroll_display();
  175. if(k2 == 0)        show_all_chars();
  176. if(k3 == 0)          display_chars();  
  177. }

  178. }
复制代码




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

使用道具 举报

沙发
ID:479854 发表于 2019-4-4 20:08 | 只看该作者
亲,没有注释,
回复

使用道具 举报

板凳
ID:440312 发表于 2019-6-25 09:17 | 只看该作者
为什么p0口传输数据地址,怎么还将他设置成按键控制,有点蒙
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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