找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1528|回复: 8
打印 上一主题 下一主题
收起左侧

单片机程序按键按了没有反应,编译无问题 Switch语句没能正常执行吗?

[复制链接]
跳转到指定楼层
楼主
个人感觉是Switch语句没能正常执行
但找不到原因

单片机C语言源程序如下:
#include <REG52.H>

sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;
unsigned char Key_Val,Key_Down,Key_Old,Key_Up;//按键专用变量

unsigned char Key_read()
{
        unsigned char temp = 0;
        if(P3^0 == 0) temp = 1;//S7
        if(P3^1 == 0) temp = 2;//S6
        if(P3^2 == 0) temp = 3;//S5
        if(P3^3 == 0) temp = 4;//S4
        return temp;
}

void main ()
{
        LSC=1;
        LSB=0;
        LSA=0;
        while(1)
        {        
        Key_Val = Key_read();//实时读取键码值
  Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
  Key_Up = ~Key_Val & (Key_Old ^ Key_Val);//捕捉按键上降沿
  Key_Old = Key_Val;//辅助扫描变量
                        switch(Key_Down)
                        {
                        case 1:
                                P0=0XFE;
                        break;
                  case 2:
                                P0=0XFD;
                        break;
                  case 3:
                                P0=0XFB;
                        break;
                  case 4:
                                P0=0XF7;
                        break;
                }
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2024-1-25 08:18 | 只看该作者

回复

使用道具 举报

板凳
ID:883242 发表于 2024-1-25 14:58 | 只看该作者
P3^0 == 0
的写法是正确的,然而楼主认为的功能是完全错误的。
回复

使用道具 举报

地板
ID:1110071 发表于 2024-1-25 17:15 | 只看该作者
别人的回答,已解决

大概率是你的头文件定义的P0和P2端口的地址不一样(猜的),用国信长天的板子的话就定义15系列的头文件吧,写好了一个示例,你自己看看。我定义的是<STC15F2K60S2.H>,然后改了一下P3的端口,其它都没改,程序就正常了。

回复

使用道具 举报

5#
ID:458247 发表于 2024-1-25 17:35 | 只看该作者
Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
  Key_Up = ~Key_Val & (Key_Old ^ Key_Val);//捕捉按键上降沿

不知道你哪里学来的写法,我验证了下是存在问题的,比如old值是2,新值是3,Key_Down 算出来是1,不是3。另外你这个程序运行很快的,按键一松开,运行的第二轮就被覆盖掉了,并没有检测下降沿功能
回复

使用道具 举报

6#
ID:1110071 发表于 2024-1-25 20:18 | 只看该作者
已解决,头文件的问题
回复

使用道具 举报

7#
ID:1110071 发表于 2024-1-26 22:13 | 只看该作者
yzw846562238 发表于 2024-1-25 17:35
Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
  Key_Up = ~Key_Val & (Key_Old ^ Key_Val) ...


跟一个up主学的
个人感觉这个帖子说的挺明白的
https://blog.csdn.net/qq_43935020/article/details/114108489
回复

使用道具 举报

8#
ID:213173 发表于 2024-1-27 07:13 | 只看该作者
316396226 发表于 2024-1-26 22:13
跟一个up主学的
个人感觉这个帖子说的挺明白的
https://blog.csdn.net/qq_43935020/article/details/ ...

从楼主的按键代码来看,按楼主目前的认知还不足以理解用“三行代码”写按键程序的精髓,盲目套用反倒弄巧成拙。
回复

使用道具 举报

9#
ID:1110071 发表于 2024-1-27 17:34 | 只看该作者
wulin 发表于 2024-1-27 07:13
从楼主的按键代码来看,按楼主目前的认知还不足以理解用“三行代码”写按键程序的精髓,盲目套用反倒弄巧 ...

能具体指点一下精髓是什么吗
像你举得这个例子
旧值是2,新值是3,怎么才能做到呢,2和3是不同的按键,不松手同时按下嘛?(这个没考虑)
不断检测,当旧值与新值不同的瞬间,异或才能通过,再跟新值比较,判断是否为抖动
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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