找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机通过串口显示按键数值问题

[复制链接]
ID:307214 发表于 2019-12-20 22:23 | 显示全部楼层 |阅读模式
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
51hei图片_20191220222216.jpg

最佳答案

查看完整内容

因为你的串口发送是在串口中断里的,但是按照你的想法是按一下串口发一个数,但是从一开始直到按键按下串口始终没有接收到外部发送的数据,那怎么会进入串口中断函数呢,所以你应该把你这个串口中断函数改为普通函数,然后把这个程序加在每个按键程序有按下情况的判断后面,这样就可以了。
回复

使用道具 举报

ID:638320 发表于 2019-12-20 22:23 来自手机 | 显示全部楼层
因为你的串口发送是在串口中断里的,但是按照你的想法是按一下串口发一个数,但是从一开始直到按键按下串口始终没有接收到外部发送的数据,那怎么会进入串口中断函数呢,所以你应该把你这个串口中断函数改为普通函数,然后把这个程序加在每个按键程序有按下情况的判断后面,这样就可以了。
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就可以了
回复

使用道具 举报

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:638320 发表于 2019-12-21 13:12 来自手机 | 显示全部楼层
因为你的串口发送是在串口中断里的,但是按照你的想法是按一下串口发一个数,但是从一开始直到按键按下串口始终没有接收到外部发送的数据,那怎么会进入串口中断函数呢,所以你应该把你这个串口中断函数改为普通函数,然后把这个程序加在每个按键程序有按下情况的判断后面,这样就可以了。
回复

使用道具 举报

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 单片机教程网

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