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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
50黑幣
我想做一個按下按鍵能通過1602顯示按鍵數值,并且通過串口顯示在電腦上的程序
現在的問題是,我用的開發板,我先是定義了開發板上面的4個獨立按鍵3.0  3.1  3.2  3.3 但是下載后,能顯示數值,但是只有一個按鍵顯示數值,而且是錯誤的  后來我想著是不是3.0  3.1  RXD  TXD沖突了   就把按鍵減少到兩個,但是似乎還是不行,而且定義的按鍵按下沒有反應,反到是沒有定義的3.1按下有反應 不過顯示的數值似乎也不正確。希望大神看到能指點一下!


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar anjian=10;

sbit k1=P3^2;
sbit k2=P3^3;
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;

uchar code a[]="ABCDEFGH";
uchar code b[]="  KEY VALUE;";

void delay(uint i)
{
   while(i--);
}  
               
void lcd_wcom(uchar com)   
{
        rs=0;
        rw=0;
        P0=com;
        delay(5);
        en=1;
        en=0;
}

void lcd_wdat(uchar dat)
{
        rs=1;
        rw=0;
        P0=dat;
        delay(5);
        en=1;
        en=0;
}

void lcd_init()
{
        lcd_wcom(0x38);
        lcd_wcom(0x0c);
        lcd_wcom(0x06);
        lcd_wcom(0x01);
}

void UsartInit()
{
        SCON=0X50;
        TMOD=0X20;
        PCON=0X80;
        TH1=0XF3;
        TL1=0XF3;
        ES=1;
        EA=1;
        TR1=1;
}

void keypros1()
{
    if(k1==0)
        {
        delay(1000);
        if(k1==0)
            {
            anjian=1;
            }
    while(!k1);
         }
}

void keypros2()
{

    if(k2==0)
        {
        delay(1000);
        if(k2==0)
            {
            anjian=2;
            }
        while(!k2);
        }
}
               
void Usart() interrupt 4
{
        uchar receiveData;
        receiveData=(a[anjian]);
        RI = 0;
        SBUF=receiveData;
        while(!TI);
        TI=0;
}

void main()
{
        uchar m=0;
        P3=0xff;
        lcd_init();
        UsartInit();
        lcd_wcom(0x80);
        for(m=0;m<12;m++)
        {
                lcd_wdat(b[m]);
          delay(200);
        }
        while(1)
        {
                keypros1();
                keypros2();
                lcd_wcom(0x8d);
                lcd_wdat(a[anjian]);
                delay(200);
        }
}

51hei圖片_20191220222210.jpg (152.63 KB, 下載次數: 67)

51hei圖片_20191220222210.jpg

51hei圖片_20191220222216.jpg (1.22 MB, 下載次數: 75)

51hei圖片_20191220222216.jpg

最佳答案

查看完整內容

因為你的串口發送是在串口中斷里的,但是按照你的想法是按一下串口發一個數,但是從一開始直到按鍵按下串口始終沒有接收到外部發送的數據,那怎么會進入串口中斷函數呢,所以你應該把你這個串口中斷函數改為普通函數,然后把這個程序加在每個按鍵程序有按下情況的判斷后面,這樣就可以了。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:638320 發表于 2019-12-20 22:23 來自手機 | 只看該作者
因為你的串口發送是在串口中斷里的,但是按照你的想法是按一下串口發一個數,但是從一開始直到按鍵按下串口始終沒有接收到外部發送的數據,那怎么會進入串口中斷函數呢,所以你應該把你這個串口中斷函數改為普通函數,然后把這個程序加在每個按鍵程序有按下情況的判斷后面,這樣就可以了。

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

1576905479516..jpg
回復

使用道具 舉報

板凳
ID:235200 發表于 2019-12-21 00:54 | 只看該作者
液晶上顯示B就是按下K1后的結果,按下K2將顯示C,這是對的,因為你顯示的內容是數組a[]中的內容,按下K1后,anjian=1,對應字母B,按下K2后,anjian=2,對應字母C
回復

使用道具 舉報

地板
ID:655793 發表于 2019-12-21 10:22 | 只看該作者
按鍵延時消抖的時間是不是長了,10ms就可以了
回復

使用道具 舉報

5#
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
回復

使用道具 舉報

6#
ID:638320 發表于 2019-12-21 13:12 來自手機 | 只看該作者
因為你的串口發送是在串口中斷里的,但是按照你的想法是按一下串口發一個數,但是從一開始直到按鍵按下串口始終沒有接收到外部發送的數據,那怎么會進入串口中斷函數呢,所以你應該把你這個串口中斷函數改為普通函數,然后把這個程序加在每個按鍵程序有按下情況的判斷后面,這樣就可以了。
回復

使用道具 舉報

7#
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. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 五月综合激情婷婷 | 成人午夜网站 | 在线天堂免费中文字幕视频 | 亚洲高清av | 日日天天 | 国产精品一区久久久 | 欧美日韩在线一区二区 | 色精品 | 午夜精品视频在线观看 | 日本久久一区二区三区 | 国产成人免费视频网站视频社区 | 在线成人 | 91资源在线 | 欧美日韩亚洲一区 | 日韩精品成人 | 正在播放国产精品 | 黄色国产在线视频 | 一区二区三区视频在线观看 | 日韩在线中文 | 日本精品一区二区三区在线观看视频 | 国产精品久久久久久久久久久久 | 亚洲国产精品成人 | 国产成人免费 | 一级毛片视频 | 欧美高清视频一区 | 91福利网 | 国产自产21区 | 天天插天天操 | 欧美嘿咻 | 成人在线一区二区 | 亚洲精品视频在线观看免费 | 亚洲人成人一区二区在线观看 | 国产精品综合久久 | 最新一级毛片 | 久久久国产一区 | 精品亚洲一区二区三区四区五区高 | 欧美日韩视频在线播放 | 国产精品美女久久久久aⅴ国产馆 | 国产精品一区二区在线免费观看 | 国产成人免费在线 | 亚洲一区二区三区在线观看免费 |