找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3477|回复: 2
收起左侧

单片机驱动1602显示屏的练习,备注详细!

[复制链接]
ID:350006 发表于 2018-6-27 23:18 | 显示全部楼层 |阅读模式
之前自己练习1602液晶显示的成果,1602的驱动编写和调用里面解释很详细了
结合我的解释,仔细看我编程的结构和思路
慢慢的你会对1602的使用有所了解
自己专研下肯定会让你收益颇丰,
发出来也是对自己学习的鼓励吧!加油各位!!
P]_0}3E~@7`O]3V`A@6DKWX.png

TIM截图20180627230656.png
  1. /**************************************************/
  2. /*
  3.                         1602 模拟显示车辆速度、温度、油量
  4.         1.欢迎语句 Welcome GXUST    第二行car system
  5.         2.        place select 1 2 3    功能选项
  6.         3.轮流显示1.speed
  7.                           2.temperatuer
  8.                           3.oil mass
  9.                           
  10. 我一直认为单片机是开放的,可以思考的,我做的这份
  11. 是个引子,读者看懂了自然可以快速自己加入自己想显示的字符。
  12. ***************************************************/
  13. #include<reg52.h>
  14. #include<stdio.h>
  15. #include<intrins.h>
  16. #define Data P0//数据端口
  17. #define GPIO_KEY P1 //键盘口
  18. sbit RS = P2^0; //Pin4
  19. sbit RW = P2^1; //Pin5
  20. sbit E = P2^2; //Pin6
  21. unsigned char KeyValue;
  22. unsigned char kk=0;        
  23. char TimeNum[16]="Welcome GXUSt";
  24. char Test1[16]="car systen";
  25. char Test2[16]="place select 123";
  26. char speed[16]="    1.speed";
  27. char temperatuer[16]="   2.temperatuer";
  28. char oil[16]="    3.oil mass";        /*这些是定义字符串,方便显示调用*/
  29. void DelayUs(unsigned char us)//微秒级延时函数
  30. {
  31.         unsigned char uscnt;
  32.         uscnt=us>>1;
  33.         while(--uscnt);
  34. }
  35. void DelayMs(unsigned int ms) //毫秒级延时函数
  36. {
  37.         while(--ms)
  38. {
  39.         DelayUs(250);
  40.         DelayUs(250);
  41.         DelayUs(250);
  42.         DelayUs(250);
  43. }
  44. }
  45. void WriteCommand(unsigned char c)//写命令函数
  46. {
  47.         DelayMs(5);//操作前短暂延时,保证信号稳定
  48.         E=0;           //使能清零
  49.         RS=0;           //选择写命令
  50.         RW=0;           //选择写入
  51. //        _nop_();   //延时一会
  52. //        E=1;
  53.         Data=c;           //送数
  54.         DelayMs(1);
  55.         E=1;
  56.         DelayMs(5);//等待写入完成
  57.         E=0;
  58. }

  59. void WriteData(unsigned char c) //写数据函数
  60. {
  61.         DelayMs(5);//操作前短暂延时,保证信号稳定
  62.         E=0;
  63.         RS=1;
  64.         RW=0;
  65.         _nop_();
  66.         E=1;
  67.         Data=c;
  68.         E=0;
  69.         RS=0;
  70. }
  71. void ShowChar(unsigned char pos,unsigned char c)//写字符函数  哪个位置写
  72. {
  73.         unsigned char p;
  74.         if (pos>=0x10)
  75.         p=pos+0xb0; //是第二行则命令代码高4位为0xc     从第二行开始写
  76.         else
  77.         p=pos+0x80; //是第二行则命令代码高4位为0x8     从第一行的POS开始写
  78.         WriteCommand (p);//写命令
  79.         WriteData (c);//写数据
  80. }
  81. void lcd_sfm(unsigned char add,unsigned char date)//显示位置和数据 在哪里add显示 显示数据date
  82. {
  83.         unsigned char shi,ge;
  84.         shi=date/10;
  85.         ge=date%10;
  86.         WriteCommand(0x80+0x40+add);
  87.         WriteData(0x30+shi);
  88.         WriteData(0x30+ge);
  89.         }
  90. void ShowString (unsigned char line,char *ptr)//写字符串函数         line:行
  91. {
  92.         unsigned char l,i;
  93.         l=line<<4;//若line=0,则地址的高四位为0;若line=1.则地址的高四位为1 写哪一行
  94.         for (i=0;i<16;i++)
  95.         ShowChar (l++,*(ptr+i));//循环显示16个字符
  96. }

  97. void InitLcd()//初始化函数
  98. {
  99.         DelayMs(15);
  100.         WriteCommand(0x38); //display mode
  101.         WriteCommand(0x38); //display mode
  102.         WriteCommand(0x38); //display mode
  103.         WriteCommand(0x06); //显示光标移动位置
  104.         WriteCommand(0x0c); //显示开及光标设置 不显示光标
  105.         WriteCommand(0x01); //显示清屏
  106. //        WriteCommand(0x80+0x10);  //设定数据指针起始点
  107. }


  108. unsigned char keyscan() //键盘扫描函数
  109. {
  110.         char a=0;
  111.                 GPIO_KEY=0x0f;   //P1口值准备
  112.                         if(GPIO_KEY!=0x0f)
  113.                         {
  114.                                 DelayMs(10);   //延时消抖
  115.                                 if(GPIO_KEY!=0x0f)//再次判断
  116.                                 {
  117.                                         GPIO_KEY=0x0f;  //再次装值准备
  118.                                         switch(GPIO_KEY)  //测试行
  119.                                         {
  120.                                                 case(0x07):KeyValue=0;break; //第一行
  121.                                                 case(0x0b):KeyValue=1;break; //第二行
  122.                                                 case(0x0d):KeyValue=2;break; //第三行
  123.                                                 case(0x0e):KeyValue=3;break; //第四行                                                        
  124.                                         }
  125.                                         GPIO_KEY=0xf0;   //高四位赋1,判断准备
  126.                                         switch(GPIO_KEY) //测试行
  127.                                         {
  128.                                                 case(0x70):KeyValue=KeyValue;break;           //0-3
  129.                                                 case(0xb0):KeyValue=KeyValue+4;break;  //4-7
  130.                                                 case(0xd0):KeyValue=KeyValue+8;break;  //8-11
  131.                                                 case(0xe0):KeyValue=KeyValue+12;break; //12-15               
  132.                                         }
  133.                                         while((GPIO_KEY!=0x0f)&&(a<20)) //判断是否松手,假若没有松手,一段延时后依旧判断松手完成
  134.                                         {
  135.                                                 DelayMs(5);
  136.                                                 a++;
  137.                                         }
  138.                                         a=0;               
  139.                                 }
  140.                         }         
  141.                         return KeyValue;
  142. }
  143. void cjm()   //初始界面
  144. {
  145.         ShowString(1,Test2);            //显示plaace
  146.         DelayMs(1000);
  147.         WriteCommand(0x01); //显示清屏
  148.         
  149.         ShowString(0,speed);            //显示speed
  150.         DelayMs(1000);
  151.         WriteCommand(0x01); //显示清屏
  152.         
  153.         ShowString(0,temperatuer);//显示temperatuer
  154.         DelayMs(1000);
  155.         WriteCommand(0x01); //显示清屏
  156.         ShowString(0,oil);            //显示oil
  157.         DelayMs(1000);
  158.         WriteCommand(0x01); //显示清屏               
  159. }
  160. void jin()//进入界面
  161. {
  162.         DelayMs(15);//延时保证信号稳定
  163.         ShowString(0,TimeNum); //写字符串
  164.         DelayMs(15);
  165.          ShowString(1,Test1);//写字符串
  166.         DelayMs(2000);
  167.         WriteCommand(0x01); //显示清屏

  168. }
  169. void Intput0() //外部中断
  170. {
  171.         IT0=1;   //跳变沿触发
  172.         EX0=1;   //开外部中断允许
  173.         EA=1;    //开总中断
  174. }
  175. void main(void)//主函数
  176. {
  177.                         
  178.         InitLcd();        //初始化
  179.         jin();      //进入界面
  180.         while(1)
  181.         {         
  182.         kk=keyscan();
  183.         cjm();           
  184.         }
  185. }
  186. void exit0() interrupt 0//中断处理
  187. {
  188.         if(kk==1)
  189.           {        
  190.                   kk=0;
  191.                   WriteCommand(0x01); //显示清屏
  192.                 ShowString(0, "the speed is:");
  193.                 ShowString(1, "        0.return");
  194.                 DelayMs(2000);
  195.                 WriteCommand(0x01); //显示清屏
  196.           }        
  197.           if(kk==2)
  198.           {        
  199.                   kk=0;
  200.                   WriteCommand(0x01); //显示清屏
  201.                 ShowString(0, "temperatuer is:");
  202.                 ShowString(1, "        0.return");
  203.                 DelayMs(2000);
  204.                 WriteCommand(0x01); //显示清屏
  205.           }
  206.           if(kk==3)
  207.           {        
  208.                   kk=0;
  209.                   WriteCommand(0x01); //显示清屏
  210.                 ShowString(0,"the oil is:     ");
  211.                 ShowString(1, "        0.return");
  212.                 DelayMs(2000);
  213.                 WriteCommand(0x01); //显示清屏
  214.           }
  215.           if(kk==0)                   //返回界面
  216.           {         
  217.                   WriteCommand(0x01); //显示清屏
  218.                 cjm();
  219.                  jin();
  220.           }               
  221.         kk=0;        
  222. }
复制代码





TIM截图20180627230656.png

1602液晶显示显示屏显示.rar

91.72 KB, 下载次数: 18, 下载积分: 黑币 -5

1602显示

1602液晶资料.pdf

261.92 KB, 下载次数: 11, 下载积分: 黑币 -5

1602的数据手册

评分

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

查看全部评分

回复

使用道具 举报

ID:68429 发表于 2018-6-28 22:25 来自手机 | 显示全部楼层
很好的资料
回复

使用道具 举报

ID:627828 发表于 2019-10-22 14:47 | 显示全部楼层
谢谢分享,赶紧学习下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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