久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

51單片機通過串口顯示按鍵數值問題

查看數: 4680 | 評論數: 6 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2019-12-20 22:23

正文摘要:

我想做一個按下按鍵能通過1602顯示按鍵數值,并且通過串口顯示在電腦上的程序 現在的問題是,我用的開發板,我先是定義了開發板上面的4個獨立按鍵3.0  3.1  3.2  3.3 但是下載后,能 ...

回復

ID:213173 發表于 2019-12-21 14:29
給你改寫成4個獨立按鍵P3.0 、P3.1 、P3.2 、P3.3 與串口共用P3.0 、P3.1 ,1602顯示鍵值的示例。
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit k1=P3^0;
  5. sbit k2=P3^1;
  6. sbit k3=P3^2;
  7. sbit k4=P3^3;
  8. sbit rs=P2^6;
  9. sbit rw=P2^5;
  10. sbit en=P2^7;

  11. uchar code a[]="ABCDEFGH";
  12. uchar code b[]=" KEY VALUE:  ";

  13. uchar anjian;

  14. void delay(uint i)
  15. {
  16.         while(i--);
  17. }  
  18.                
  19. void lcd_wcom(uchar com)   
  20. {
  21.         rs=0;
  22.         rw=0;
  23.         P0=com;
  24.         delay(10);
  25.         en=1;
  26.         delay(10);
  27.         en=0;
  28. }

  29. void lcd_wdat(uchar dat)
  30. {
  31.         rs=1;
  32.         rw=0;
  33.         P0=dat;
  34.         delay(100);
  35.         en=1;
  36.         delay(10);
  37.         en=0;
  38. }

  39. void lcd_init()
  40. {
  41.         lcd_wcom(0x38);
  42.         lcd_wcom(0x0c);
  43.         lcd_wcom(0x06);
  44.         lcd_wcom(0x01);
  45. }

  46. void UsartInit()
  47. {
  48.         SCON=0X50;
  49.         TMOD=0X20;
  50.         PCON=0X80;//比特率加倍
  51.         TH1=0XF3;//比特率4800
  52.         TL1=0XF3;
  53. //        ES=1;
  54. //        EA=1;
  55. //        TR1=1;
  56. }

  57. void keypros1()
  58. {
  59.         static bit sign=0;                        //按鍵自鎖標志
  60.         static uint count=0;                //消抖計數變量                       
  61.         uchar num=0;                                //臨時變量
  62.         P3|=0x0f;
  63.         num=P3&0x0f;
  64.         if(num!=0x0f)                                //檢測有按鍵按下
  65.         {
  66.                 count++;                                //消抖計數
  67.                 if((count>=50)&&(sign==0))
  68.                 {                       
  69.                         sign=1;       
  70.                         switch(num)
  71.                         {
  72.                                 case 0x0e: anjian=1; break;
  73.                                 case 0x0d: anjian=2; break;
  74.                                 case 0x0b: anjian=3; break;
  75.                                 case 0x07: anjian=4; break;
  76.                         }
  77.                 }
  78.         }
  79.         else                                        //鍵抬起
  80.         {
  81.                 if(sign==1)
  82.                 {
  83.                         sign=0;                //按鍵自鎖標志清0
  84.                         TR1=1;                //開定時器
  85.                         delay(100); //延時
  86.                         SBUF=anjian;//串口發送鍵值
  87.                         while(!TI); //等待發送完成
  88.                         TI=0;                 //發送標志清0
  89.                         TR1=0;                //關定時器
  90.                 }
  91.                 count=0;                        //消抖計數清0
  92.         }
  93. }
  94. /*
  95. void keypros2()
  96. {
  97.         if(k2==0)
  98.         {
  99.                 delay(1000);
  100.                 if(k2==0)
  101.                 {
  102.                         anjian=2;
  103.                 }
  104.                 while(!k2);
  105.         }
  106. }*/
  107. /*               
  108. void Usart() interrupt 4
  109. {
  110.         uchar receiveData;
  111.         receiveData=(a[anjian]);
  112.         RI = 0;
  113.         SBUF=receiveData;
  114.         while(!TI);
  115.         TI=0;
  116. }*/

  117. void main()
  118. {
  119.         uchar m=0;
  120.         P3=0xff;
  121.         lcd_init();
  122.         UsartInit();
  123.         lcd_wcom(0x80);
  124.         for(m=0;m<11;m++)
  125.         {
  126.                 lcd_wdat(b[m]);
  127.                 delay(200);
  128.         }
  129.         while(1)
  130.         {
  131.                 keypros1();
  132.                 lcd_wcom(0x80+12);
  133.                 lcd_wdat(anjian+'0');
  134.                 delay(200);
  135.         }
  136. }
復制代碼
ID:638320 發表于 2019-12-21 13:12
因為你的串口發送是在串口中斷里的,但是按照你的想法是按一下串口發一個數,但是從一開始直到按鍵按下串口始終沒有接收到外部發送的數據,那怎么會進入串口中斷函數呢,所以你應該把你這個串口中斷函數改為普通函數,然后把這個程序加在每個按鍵程序有按下情況的判斷后面,這樣就可以了。
ID:307214 發表于 2019-12-21 12:15
csmyldl 發表于 2019-12-21 00:54
液晶上顯示B就是按下K1后的結果,按下K2將顯示C,這是對的,因為你顯示的內容是數組a[]中的內容,按下K1后,anji ...

這個我已經修改了   按照開發板原理圖RXD=k1 TXD=K2   我把K1定義3.0 TXD定義3.1 但是按鍵顯示在1602的就是不對  K1按下顯示B  K2 按下顯示A 我不知道是不是原理圖錯了  把K1 K2調換就對了  手里有沒有萬用表  現在的問題是串口可以顯示字符了  不過只有K2按下可以直接顯示字符  B  其他按鍵  需要按下后 再按下K2鍵才能顯示對應字符   如按下K3 后  再按下K2才能顯示K3的字符C
ID:655793 發表于 2019-12-21 10:22
按鍵延時消抖的時間是不是長了,10ms就可以了
ID:235200 發表于 2019-12-21 00:54
液晶上顯示B就是按下K1后的結果,按下K2將顯示C,這是對的,因為你顯示的內容是數組a[]中的內容,按下K1后,anjian=1,對應字母B,按下K2后,anjian=2,對應字母C
ID:638320 發表于 2019-12-20 22:23
因為你的串口發送是在串口中斷里的,但是按照你的想法是按一下串口發一個數,但是從一開始直到按鍵按下串口始終沒有接收到外部發送的數據,那怎么會進入串口中斷函數呢,所以你應該把你這個串口中斷函數改為普通函數,然后把這個程序加在每個按鍵程序有按下情況的判斷后面,這樣就可以了。

1576905479516..jpg (2.01 MB, 下載次數: 74)

1576905479516..jpg

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩在线观看一区二区三区 | 亚洲日本成人 | 国产日韩欧美一区二区 | 手机在线不卡av | 国产一区二区三区四区三区四 | 久久精品亚洲精品国产欧美 | 欧州一区二区 | 91观看 | 久久久久国产精品一区三寸 | 欧美日韩国产在线观看 | 黄视频网站免费观看 | 亚洲国产精品久久久 | 亚洲精品一区二区在线观看 | 国产日韩视频 | 欧美一级二级三级视频 | 国产精品美女 | 国产美女视频一区 | 欧美成人免费 | 伊人免费在线观看 | 亚洲欧美一区二区三区在线 | 黄网站色大毛片 | 一区二区三区在线免费观看视频 | 久久国产精品-国产精品 | 亚洲 欧美 日韩 在线 | 97色在线视频 | 国产一区免费 | 美女操网站 | 日韩精品一区二区三区视频播放 | 亚洲444eee在线观看 | 日本精品视频 | 国产免费一二三区 | 亚洲一区二区三区免费在线观看 | yeyeav| 大陆一级毛片免费视频观看 | 91资源在线观看 | 成人网视频 | 久久精品色欧美aⅴ一区二区 | 免费观看羞羞视频网站 | 午夜在线观看免费 | 国产精品久久久久久久午夜 | 亚洲福利一区 |