找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3235|回复: 6
收起左侧

怎么在原单片机程序加两个按键分别控制显示和清屏 求思路

[复制链接]
ID:701099 发表于 2020-4-9 14:26 | 显示全部楼层 |阅读模式
  1. #include<reg51.h>
  2. sbit RS=P2^0; //1602的数据/指令选择控制线
  3. sbit RW=P2^1; //1602的读写控制线
  4. sbit E=P2^2; //1602的使能控制线
  5. unsigned char code tab1[]=“welcome AT89S51!”;
  6. unsigned char code tab2[]=“LCD1602test..OK”;
  7. bit lcd1602_read_status();
  8. void lcd1602_write_cmd(unsigned char cmd);
  9. void lcd1602_write_dat(unsigned char dat);
  10. void lcd1602_init();
  11. void delay(unsigned int i);
  12. void delay(unsigned int i)

  13. {while(i--);}
  14. bit lcd1602_read_status() //读1602状态
  15. { unsigned char temp;
  16. RS=0; //选择输入指令
  17. RW=1; //选择读
  18. temp=P0; //把命令字送入P0
  19. delay(20);
  20. E=1; //写入时序,一个下降沿,将命令传达到LCD
  21. delay(20);
  22. E=0;
  23. return (bit)(temp&0x80);
  24. }
  25. void lcd1602_write_dat(unsigned char dat) //1602写数据函数
  26. {
  27. while(lcd1602_read_status()!=0);//读取1602状态
  28. E=0;//根据时序图使能清零
  29. RS=1; //选择数据寄存器
  30. RW=0; //选择写
  31. P0=dat; //把要显示的数据送入P0
  32. delay(20); //延时一小会儿,让1602准备接收数据
  33. E=1; //使能线电平变化,数据送入1602的8位数据口
  34. delay(20);
  35. E=0;
  36. }
  37. void lcd1602_write_cmd(unsigned char cmd) //1602写命令函数
  38. {
  39. while(lcd1602_read_status()!=0);//读取1602状态
  40. E=0;//根据时序图使能清零
  41. RS=0; //选择输入指令
  42. RW=0; //选择写
  43. P0=cmd; //把命令字送入P0
  44. delay(20); //延时一小会儿,让1602准备接收数据
  45. E=1; //写入时序,一个下降沿,将命令传达到LCD
  46. delay(20);
  47. E=0;
  48. }
  49. void lcd1602_init()/ // 液晶初始化
  50. { {
  51. E=0;//由时序图可知开始时使能端E为低电平
  52. lcd1602_write_cmd(0x38); //8位数据,显示2行,5*7点阵/字符
  53. lcd1602_write_cmd(0x0c); //开启显示屏,关光标,光标不闪烁
  54. lcd1602_write_cmd(0x01; );/ // 清屏
  55. lcd1602_write_cmd(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
  56. delay(200);
  57. }
  58. void lcd1602_display()//液晶显示
  59. {
  60. unsigned char i,j;
  61. lcd1602_write_cmd(0x80+0x00); //第一行显示
  62. for(i=0;i<15;i++) //将table1[]中的数据依次写入1602显示
  63. {lcd1602_write_dat(tab1[i]);delay(20);}
  64. lcd1602_write_cmd(0x80+0x40); //第二行显示
  65. for(j=0;j<14;j++) //将table2[]中的数据依次写入1602显示
  66. {lcd1602_write_dat(tab2[j]);delay(20);}
  67. }
  68. void main()//主函数
  69. {
  70. lcd1602_init();
  71. lcd1602_display();
  72. while(1);//动态停机
  73. }
复制代码
回复

使用道具 举报

ID:677928 发表于 2020-4-9 16:39 | 显示全部楼层
在主函数中加按键扫描的函数,之后用case来进入各种工作状态,在工作状态里写你要显示,停止的函数就好
  1. void ini()//定时器
  2. {
  3.         seccnt=0;       
  4.         msta=tzsta=0;
  5.         TMOD=0x01;
  6.         TH0=0xFF;
  7.         TL0=0x9C;
  8.         TR0=1;         //开启定时器0
  9.        
  10. }
  11. void keyscan()//独立按键
  12. {
  13.     if(K1==0)
  14.                 {
  15.                         delay(5);
  16.                         if(K1==0)
  17.                         {
  18.                                 msta=1;
  19.                         }
  20.                 }
  21.                 if(K2==0)
  22.                 {
  23.                         delay(5);
  24.                         if(K2==0)
  25.                         {
  26.                                 msta=2;
  27.                         }
  28.                 }
  29.           if(K3==0)
  30.                 {
  31.                         delay(5);
  32.                   if(K3==0)
  33.                         {
  34.                                 msta=3;
  35.                         }
  36.                 }
  37.                 if(K4==0)
  38.                 {
  39.                         delay(5);
  40.                         if(K4==0)
  41.                         {
  42.                                 msta=4;
  43.                         }
  44.                 }
  45. }
  46. void main()
  47. {        
  48.         ini();//初始化

  49.   while(1)//闭环
  50.                 {                               
  51.                         while(TF0==0);//启动主循环               
  52.                       TL0=0x9C;
  53.                         TH0=0xFF;
  54.                             TF0=0;
  55.                         keyscan();        //        键扫描
  56.                         KeyScan1();
  57.                         m = m+1;
  58.       switch(msta)
  59.                 {
  60.                   case 1: work0(); //工作状态0                        
  61.                          break;
  62.                   case 2: work1();// 工作状态1
  63.                          break;
  64.                   case 3: work2(); //工作状态2
  65.                           break;
  66.                                   case 4: work3();
  67.                                                   break;
  68.                   default: break;
  69.                  }
复制代码

回复

使用道具 举报

ID:213173 发表于 2020-4-9 17:07 | 显示全部楼层
无标题.jpg

楼主这个程序抄的有不少问题,给你改好了并加按键。

  1. #include<reg51.h>
  2. sbit RS=P2^0; //1602的数据/指令选择控制线
  3. sbit RW=P2^1; //1602的读写控制线
  4. sbit E=P2^2; //1602的使能控制线

  5. sbit key1=P2^6;
  6. sbit key2=P2^7;

  7. unsigned char code tab1[]="welcome AT89S51!";
  8. unsigned char code tab2[]="LCD1602test...OK";

  9. void lcd1602_read_status();
  10. void lcd1602_write_cmd(unsigned char cmd);
  11. void lcd1602_write_dat(unsigned char dat);
  12. void lcd1602_init();
  13. void delay(unsigned int i);

  14. void delay(unsigned int i)
  15. {
  16.         while(i--);
  17. }

  18. void lcd1602_read_status()           //忙检测函数,判断bit7是 0执行 1禁止
  19. {
  20.         unsigned char sta;      //
  21.         P0 = 0xff;
  22.         RS = 0;
  23.         RW = 1;
  24.         do
  25.         {
  26.                 E = 1;
  27.                 sta = P0;
  28.                 E = 0;    //使能
  29.         }while(sta & 0x80);
  30. }

  31. void lcd1602_write_dat(unsigned char dat) //1602写数据函数
  32. {
  33.         lcd1602_read_status();
  34.         E=0;//根据时序图使能清零
  35.         RS=1; //选择数据寄存器
  36.         RW=0; //选择写
  37.         P0=dat; //把要显示的数据送入P0
  38.         delay(20); //延时一小会儿,让1602准备接收数据
  39.         E=1; //使能线电平变化,数据送入1602的8位数据口
  40.         delay(20);
  41.         E=0;
  42. }
  43. void lcd1602_write_cmd(unsigned char cmd) //1602写命令函数
  44. {
  45.         lcd1602_read_status();
  46.         E=0;//根据时序图使能清零
  47.         RS=0; //选择输入指令
  48.         RW=0; //选择写
  49.         P0=cmd; //把命令字送入P0
  50.         delay(20); //延时一小会儿,让1602准备接收数据
  51.         E=1; //写入时序,一个下降沿,将命令传达到LCD
  52.         delay(20);
  53.         E=0;
  54. }
  55. void lcd1602_init() // 液晶初始化
  56. {
  57.         E=0;//由时序图可知开始时使能端E为低电平
  58.         lcd1602_write_cmd(0x38); //8位数据,显示2行,5*7点阵/字符
  59.         lcd1602_write_cmd(0x0c); //开启显示屏,关光标,光标不闪烁
  60.         lcd1602_write_cmd(0x01); // 清屏
  61.         lcd1602_write_cmd(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
  62.         delay(200);
  63. }

  64. void lcd1602_display()//液晶显示
  65. {
  66.         unsigned char i,j;
  67.         lcd1602_write_cmd(0x80+0x00); //第一行显示
  68.         for(i=0;i<16;i++) //将table1[]中的数据依次写入1602显示
  69.         {
  70.                 lcd1602_write_dat(tab1[i]);
  71. //                delay(20);
  72.         }
  73.         lcd1602_write_cmd(0x80+0x40); //第二行显示
  74.         for(j=0;j<16;j++) //将table2[]中的数据依次写入1602显示
  75.         {
  76.                 lcd1602_write_dat(tab2[j]);
  77. //                delay(20);
  78.         }
  79. }
  80. void main()//主函数
  81. {
  82.         lcd1602_init();
  83.         lcd1602_display();
  84.         while(1)
  85.         {
  86.                 if(!key1)
  87.                 {
  88.                         delay(100);
  89.                         if(!key1)
  90.                         {
  91.                                 lcd1602_write_cmd(0x01); // 清屏
  92.                                 while(!key1);
  93.                         }
  94.                 }
  95.                 if(!key2)
  96.                 {
  97.                         delay(100);
  98.                         if(!key2)
  99.                         {
  100.                                 lcd1602_display();
  101.                                 while(!key2);
  102.                         }
  103.                 }
  104.         }
  105. }
复制代码



回复

使用道具 举报

ID:701099 发表于 2020-4-10 09:45 | 显示全部楼层
wulin 发表于 2020-4-9 17:07
楼主这个程序抄的有不少问题,给你改好了并加按键。

感谢大神
回复

使用道具 举报

ID:726754 发表于 2020-4-11 10:20 | 显示全部楼层
wulin 发表于 2020-4-9 17:07
楼主这个程序抄的有不少问题,给你改好了并加按键。

厉害!!
回复

使用道具 举报

ID:149451 发表于 2020-4-11 11:15 | 显示全部楼层
收藏,学习,
回复

使用道具 举报

ID:817491 发表于 2020-11-19 16:31 来自手机 | 显示全部楼层
大佬,为啥用按键分行清零时有时候会同时清零?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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