找回密码
 立即注册

QQ登录

只需一步,快速开始

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

大佬帮我看看,这单片机定时器扫描按键怎么不行啊?

[复制链接]
ID:1020154 发表于 2022-5-15 15:02 | 显示全部楼层 |阅读模式
#include <REGX52.H>
#include "Time0.H"
#include "Key.H"

unsigned char Number;

void main()
{
        Timer0Init();
        P2=0x00;
        while(1)
        {
                Number=Key_GetNum();
                if(Number)
                {
                        P2=0xF0;
                if(Number==1)
                        P2=~P2;
                }
        }
}

void Time0(void)                interrupt 1
{
        unsigned int count=0;
        TL0 = 0xA4;                //设置定时初值
        TH0 = 0xA4;                //设置定时重载值
        count++;
        if(count>=200)
        {
                count=0;
                Key_Loop();
        }
}
************************************************
#include <REGX52.H>

unsigned char KeyNumber;

unsigned char Key_Return()
{
        unsigned char Num=0;
        if(P3_1==0){Num=1;}
        return Num;
}

void Key_Loop()
{
        static unsigned char Before_Num;
        static unsigned char Now_Num;
        
        Before_Num=Now_Num;
        Now_Num=Key_Return();
        
        if(Before_Num==1 && Now_Num==0){KeyNumber=1;}
        if(Before_Num==2 && Now_Num==0){KeyNumber=2;}
        if(Before_Num==3 && Now_Num==0){KeyNumber=3;}
        if(Before_Num==4 && Now_Num==0){KeyNumber=4;}
}

unsigned char Key_GetNum()
{
        unsigned char tmp=0;
        tmp=KeyNumber;
        return tmp;
}
********************************************
回复

使用道具 举报

ID:1020154 发表于 2022-5-15 15:13 | 显示全部楼层
测试发现main函数里的  P2=0xF0;就不能实现,不知道是不是Key_GetNum函数有问题
回复

使用道具 举报

ID:491577 发表于 2022-5-15 18:54 | 显示全部楼层
没有Timer0Init();函数。按键值使用后必须手动清零。
void Time0(void)                interrupt 1
{
        unsigned int count=0;改为:static unsigned int count=0;
回复

使用道具 举报

ID:1020154 发表于 2022-5-15 19:37 | 显示全部楼层
定时器没有是写了没有粘贴过来,就是按键值没有手动清零的缘故,已经搞定了,谢谢大佬!
回复

使用道具 举报

ID:1020154 发表于 2022-5-15 19:40 | 显示全部楼层
hhh402 发表于 2022-5-15 18:54
没有Timer0Init();函数。按键值使用后必须手动清零。
void Time0(void)                interrupt 1
{

谢谢大佬!
回复

使用道具 举报

ID:1026496 发表于 2022-5-15 20:37 | 显示全部楼层
unsigned int count=0;这条语句加static
回复

使用道具 举报

ID:1012735 发表于 2022-5-16 05:01 | 显示全部楼层
count也可设成全局变量。

当P3_1高电平时,key_loop()中,Now_Num=Key_Return()返回值0,Before_Num=Now_Num,也是0

因声明时没有给KeyNumber赋初值,所以,此时调用Key_Loop()时,KeyNumber值是不定的,

主函数中Number=Key_GetNum(); Number中的值也是不定的,P2大概率的:P2=0xF0

当P3_1低电平后,再次高电平时,KeyNumber=1,

因Now_Num=Key_Return()返回值要么0要么1,Before_Num值也只能是0或1,

if中Before_Num==2/3/4值不知从何而来

所以,长时间运行,KeyNumber=1值应是不变的,主函数中Number=Key_GetNum();Number也一直是1,

P2=~P2一直定时翻转下去,与P3_1引脚电平无关了

Key_GetNum()函数直接一句:return KeyNumber;即可。

如果把:Before_Num=Now_Num;
改成:   Before_Num += Now_Num;
然后加一句:if(Before>4) Before = 1;
这样下面的if条件都能达成。


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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