找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8188|回复: 8
收起左侧

详细LCD1602串行或者并行数据传输51单片机程序(自编)

[复制链接]
ID:195660 发表于 2017-7-28 10:38 | 显示全部楼层 |阅读模式
详细LCD1602串行或者并行数据传输51单片机程序(自编)
0.png

单片机串行源程序如下:
  1. #include "reg52.h"  
  2. #include <intrins.h>  
  3.    
  4. //LCD1602接口定义              
  5. #define    LCD_DATA    P1  //P1口(P14~P17)与LCD高四位(D4~D7)对应相接  
  6. sbit   LCD1602_RS=P1^2;        //数据指令  
  7. sbit   LCD1602_EN=P1^3;        //使能  
  8.    
  9. //延时函数,12mhz 6t延迟时间10*255us  
  10. void LCD_init(void);  
  11. void LCD_en_write(void);  
  12. void LCD_write_command(unsigned char command) ;  
  13. void LCD_write_data(unsigned char Recdata);  
  14. void LCD_set_xy (unsigned char x, unsigned char y);  
  15. void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);  
  16. void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata);  
  17. void delay_nus(unsigned int n);  
  18. void delay_nms(unsigned int n);  
  19.    
  20. //以下函数用于输出字符串和数字  
  21. int LCD_PutNum(unsigned long num,int XS,int pos);  
  22. int LCD_PutStr(unsigned char *DData,int pos);  
  23.    
  24. //-------------------------1us延时函数---------------------------------  
  25. void delay_1us(void)   
  26. {  
  27.     _nop_();  
  28. }  
  29. //------------------------N us延时函数---------------------------------  
  30. void delay_nus(unsigned int n)   
  31. {  
  32. unsigned int i=0;  
  33. for (i=0;i<n;i++)  
  34. delay_1us();  
  35. }  
  36.   //-----------------------1ms延时函数----------------------------------  
  37. void delay_1ms(void)  
  38. {  
  39. unsigned int i;  
  40. for (i=0;i<1140;i++);  
  41. }  
  42.   //-----------------------N ms延时函数---------------------------------  
  43. void delay_nms(unsigned int n)  
  44. {  
  45. unsigned int i=0;  
  46. for (i=0;i<n;i++)  
  47. delay_1ms();  
  48. }  
  49.   //------------------------液晶初始化-----------------------------------  
  50. void LCD_init(void)  
  51. {  
  52. LCD_write_command(0x28);  
  53. delay_nus(40);   
  54. LCD_write_command(0x28);  
  55. delay_nus(40);   
  56. LCD_write_command(0x28);  
  57. delay_nus(40);   
  58.    
  59. LCD_en_write();  
  60. delay_nus(40);  
  61. LCD_write_command(0x28); //4位显示  
  62. LCD_write_command(0x0c); //显示开  
  63. LCD_write_command(0x01); //清屏  
  64. delay_nms(2);  
  65. }  
  66.    
  67.   //----------------------液晶使能函数-------------------------------------  
  68. void LCD_en_write(void)  
  69. {                       //EN由高电平跳变到低电平时液晶使能  
  70. LCD1602_EN=1;  
  71. delay_nus(1);  
  72. LCD1602_EN=0;  
  73. }  
  74. //------------------------写指令函数--------------------------------------  
  75. void LCD_write_command(unsigned char command)   
  76. {  
  77. delay_nus(16);  
  78. LCD1602_RS=0; //RS=0  
  79. LCD_DATA &=0X0f; //清高四位  
  80. LCD_DATA|=command&0xf0; //写高四位  
  81. LCD_en_write();  
  82. command=command<<4; //低四位移到高四位  
  83. LCD_DATA&=0x0f; //清高四位  
  84. LCD_DATA|=command&0xf0; //写低四位  
  85. LCD_en_write();  
  86. }  
  87.    
  88. //------------------------写数据函数--------------------------------------  
  89. void LCD_write_data(unsigned char Recdata)   
  90. {  
  91. delay_nus(16);  
  92. LCD1602_RS=1; //RS=1  
  93. LCD_DATA&=0X0f; //清高四位  
  94. LCD_DATA|=Recdata&0xf0; //写高四位  
  95. LCD_en_write();  
  96. Recdata=Recdata<<4; //低四位移到高四位  
  97. LCD_DATA&=0X0f; //清高四位  
  98. LCD_DATA|=Recdata&0xf0; //写低四位  
  99. LCD_en_write();                                                                                                                                                                                                                                                                                                                                                                                                
  100. }  
  101.    
  102. //-----------------------地址定位函数-------------------------------------  
  103. void LCD_set_xy( unsigned char x, unsigned char y )   
  104. {  
  105.     unsigned char address;  
  106.     if (y == 0) address = 0x80 + x;  
  107.     else address = 0xc0 + x;  
  108.     LCD_write_command(address);  
  109. }  
  110.    
  111.    
  112. //----------------------在某个地址处,写一个字符----------------------------  
  113. void LCD_write_char(unsigned char X,unsigned char Y,unsigned char Recdata) //列x=0~15,行y=0,1  
  114. {  
  115.     LCD_set_xy(X, Y); //写地址  
  116.     LCD_write_data(Recdata);  
  117. }  
  118. //----------------------------输出字符串-------------------------------------  
  119. int LCD_PutStr(unsigned char *DData,int pos)  //pos表示字符显示位置,0~31  
  120. {   
  121.     unsigned char i;   
  122.     if(pos==-1)  
  123.     {  
  124.         LCD_write_command(0x01); //清屏  
  125.         delay_nms(2);  
  126.         pos=0;   
  127.     }   
  128.     while((*DData)!='\0')  
  129.     {      
  130.         switch(*DData)  
  131.         {   
  132.             case '\n': //如果是\n,则换行   
  133.             {   
  134.                 if(pos<17)  
  135.                 {  
  136.                     for(i=pos;i<16;i++) LCD_write_char(i%16, i/16,' ');  
  137.                     pos=16;  
  138.                 }  
  139.                 else  
  140.                 {   
  141.                     for(i=pos;i<32;i++) LCD_write_char(i%16, i/16,' ');  
  142.                     pos=0;  
  143.                 }   
  144.                 break;   
  145.             }  
  146.    
  147.             case '\b': //如果是\b,则退格  
  148.             {  
  149.                 if(pos>0) pos--;  
  150.                 LCD_write_char(pos%16, pos/16, ' ');   
  151.                 break;   
  152.             }  
  153.    
  154.             default:   
  155.             {   
  156.                 if((*DData)<0x20)  //小于0x20的显示不了?  
  157.                 {  
  158.                     *DData=' ';  
  159.                 }  
  160.    
  161.                 LCD_write_char(pos%16, pos/16,*DData);  
  162.                 pos++;   
  163.                 break;   
  164.             }   
  165.         }   
  166.         DData++;   
  167.     }  
  168.     return(pos);  
  169. }  
  170. //----------------------------输出数字---------------------------------  
  171. //这段程序写法我的理解大致是这样:num为去掉小数点之后的数字,XS为小数点  
  172. //从左数第几位,pos为显示的位置  
  173. //---------------------------------------------------------------------  
  174. int LCD_PutNum(unsigned long num,int XS,int pos)  
  175. {   
  176.     unsigned long tmp=0;   
  177.     unsigned char numbits=0; //总数字位数  
  178.     if(pos==-1)  
  179.     {   
  180.         LCD_write_command(0x01);  
  181.         delay_nms(2);   
  182.         pos=0;   
  183.     }   
  184.    
  185.     if(num==0)  
  186.     {  
  187.         LCD_write_char(pos%16, pos/16, '0');  
  188.         pos++;  
  189.     }  
  190.     else  
  191.     {  
  192.         if(num<0)  
  193.         {   
  194.             LCD_write_char(pos%16, pos/16, '-');   
  195. ……………………

  196. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

主函数还没有写,大家可以按自己写需求写,程序存在问题还很多,请多多指教,一起进步:
LCD1602.zip (61.29 KB, 下载次数: 100)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:266711 发表于 2018-3-16 15:32 | 显示全部楼层
学到了很多,让我受益很多谢谢
回复

使用道具 举报

ID:442599 发表于 2019-3-7 18:47 | 显示全部楼层
没有主函数啊
回复

使用道具 举报

ID:398105 发表于 2019-3-9 10:59 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:770247 发表于 2020-12-9 14:06 | 显示全部楼层
请问串行的电路图是什么样子的啊?
回复

使用道具 举报

ID:770247 发表于 2020-12-9 14:07 | 显示全部楼层
请问串行的电路图是什么样子的啊,下载了压缩包只有程序
回复

使用道具 举报

ID:328014 发表于 2020-12-9 16:18 | 显示全部楼层
zhenzhenyah 发表于 2020-12-9 14:07
请问串行的电路图是什么样子的啊,下载了压缩包只有程序

看程序顶部有端口定义,按端口定义接线就可以了,如果以前没有接过这种电路 最好去51hei先找一个电路图,搜索"1602 4线"或者"1602 四线"这几个字即可,有很多人分享http://www.51hei.com/bbs/dpj-52853-1.html
http://www.51hei.com/bbs/dpj-167284-1.html
回复

使用道具 举报

ID:857626 发表于 2020-12-9 18:43 | 显示全部楼层

谢谢分享,写的很详细!!
回复

使用道具 举报

ID:770247 发表于 2020-12-23 14:24 | 显示全部楼层
51hei团团 发表于 2020-12-9 16:18
看程序顶部有端口定义,按端口定义接线就可以了,如果以前没有接过这种电路 最好去51hei先找一个电路图,搜 ...

好的,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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