欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3546|回復: 6
打印 上一主題 下一主題
收起左側

怎么在原單片機程序加兩個按鍵分別控制顯示和清屏 求思路

[復制鏈接]
跳轉到指定樓層
樓主
  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. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 | 只看該作者


樓主這個程序抄的有不少問題,給你改好了并加按鍵。

  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
樓主這個程序抄的有不少問題,給你改好了并加按鍵。

感謝大神
回復

使用道具 舉報

5#
ID:726754 發表于 2020-4-11 10:20 | 只看該作者
wulin 發表于 2020-4-9 17:07
樓主這個程序抄的有不少問題,給你改好了并加按鍵。

厲害!!
回復

使用道具 舉報

6#
ID:149451 發表于 2020-4-11 11:15 | 只看該作者
收藏,學習,
回復

使用道具 舉報

7#
ID:817491 發表于 2020-11-19 16:31 來自觸屏版 | 只看該作者
大佬,為啥用按鍵分行清零時有時候會同時清零?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表