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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4496|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)通過串口顯示按鍵數(shù)值問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:307214 發(fā)表于 2019-12-20 22:23 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
50黑幣
我想做一個(gè)按下按鍵能通過1602顯示按鍵數(shù)值,并且通過串口顯示在電腦上的程序
現(xiàn)在的問題是,我用的開發(fā)板,我先是定義了開發(fā)板上面的4個(gè)獨(dú)立按鍵3.0  3.1  3.2  3.3 但是下載后,能顯示數(shù)值,但是只有一個(gè)按鍵顯示數(shù)值,而且是錯(cuò)誤的  后來我想著是不是3.0  3.1  RXD  TXD沖突了   就把按鍵減少到兩個(gè),但是似乎還是不行,而且定義的按鍵按下沒有反應(yīng),反到是沒有定義的3.1按下有反應(yīng) 不過顯示的數(shù)值似乎也不正確。希望大神看到能指點(diǎn)一下!


#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, 下載次數(shù): 67)

51hei圖片_20191220222210.jpg

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

51hei圖片_20191220222216.jpg

最佳答案

查看完整內(nèi)容

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

使用道具 舉報(bào)

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

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

1576905479516..jpg
回復(fù)

使用道具 舉報(bào)

板凳
ID:235200 發(fā)表于 2019-12-21 00:54 | 只看該作者
液晶上顯示B就是按下K1后的結(jié)果,按下K2將顯示C,這是對的,因?yàn)槟泔@示的內(nèi)容是數(shù)組a[]中的內(nèi)容,按下K1后,anjian=1,對應(yīng)字母B,按下K2后,anjian=2,對應(yīng)字母C
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

5#
ID:307214 發(fā)表于 2019-12-21 12:15 | 只看該作者
csmyldl 發(fā)表于 2019-12-21 00:54
液晶上顯示B就是按下K1后的結(jié)果,按下K2將顯示C,這是對的,因?yàn)槟泔@示的內(nèi)容是數(shù)組a[]中的內(nèi)容,按下K1后,anji ...

這個(gè)我已經(jīng)修改了   按照開發(fā)板原理圖RXD=k1 TXD=K2   我把K1定義3.0 TXD定義3.1 但是按鍵顯示在1602的就是不對  K1按下顯示B  K2 按下顯示A 我不知道是不是原理圖錯(cuò)了  把K1 K2調(diào)換就對了  手里有沒有萬用表  現(xiàn)在的問題是串口可以顯示字符了  不過只有K2按下可以直接顯示字符  B  其他按鍵  需要按下后 再按下K2鍵才能顯示對應(yīng)字符   如按下K3 后  再按下K2才能顯示K3的字符C
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

7#
ID:213173 發(fā)表于 2019-12-21 14:29 | 只看該作者
給你改寫成4個(gè)獨(dú)立按鍵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;                        //按鍵自鎖標(biāo)志
  60.         static uint count=0;                //消抖計(jì)數(shù)變量                       
  61.         uchar num=0;                                //臨時(shí)變量
  62.         P3|=0x0f;
  63.         num=P3&0x0f;
  64.         if(num!=0x0f)                                //檢測有按鍵按下
  65.         {
  66.                 count++;                                //消抖計(jì)數(shù)
  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;                //按鍵自鎖標(biāo)志清0
  84.                         TR1=1;                //開定時(shí)器
  85.                         delay(100); //延時(shí)
  86.                         SBUF=anjian;//串口發(fā)送鍵值
  87.                         while(!TI); //等待發(fā)送完成
  88.                         TI=0;                 //發(fā)送標(biāo)志清0
  89.                         TR1=0;                //關(guān)定時(shí)器
  90.                 }
  91.                 count=0;                        //消抖計(jì)數(shù)清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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 二区高清 | 成人免费视频观看 | 99re视频这里只有精品 | 最近中文字幕在线视频1 | 中文字幕在线电影观看 | 欧美一区在线视频 | 亚洲国产一区二区三区 | 久草视频观看 | 九色91视频 | a精品视频 | 亚洲视频在线一区 | 精品一区二区久久久久久久网站 | 欧美区在线 | 成人性视频在线 | 国产三级在线观看播放 | 成人免费看电影 | 欧美日韩亚洲视频 | 欧美狠狠操 | 日韩av一区二区在线观看 | 黑人一级黄色大片 | 亚洲精品专区 | 草久视频 | 亚洲欧美国产精品一区二区 | 国产精品成人一区二区三区夜夜夜 | 特一级毛片 | 亚洲精品免费视频 | 中文字幕加勒比 | 欧美在线a | 波多野结衣精品在线 | 国产精品99免费视频 | 午夜视频免费在线观看 | 国产精品久久久久久久久久免费看 | 不用播放器看的av | 中文字幕在线看第二 | 精品九九在线 | 国产日韩一区二区三区 | 99精品视频在线观看免费播放 | 亚洲成人精选 | 国产一级一级毛片 | 中文一区二区 | 少妇性l交大片免费一 |