标题:
大佬帮我看看,这单片机定时器扫描按键怎么不行啊?
[打印本页]
作者:
qsj00000
时间:
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;
}
********************************************
作者:
qsj00000
时间:
2022-5-15 15:13
测试发现main函数里的 P2=0xF0;就不能实现,不知道是不是Key_GetNum函数有问题
作者:
hhh402
时间:
2022-5-15 18:54
没有Timer0Init();函数。按键值使用后必须手动清零。
void Time0(void) interrupt 1
{
unsigned int count=0;改为:static unsigned int count=0;
作者:
qsj00000
时间:
2022-5-15 19:37
定时器没有是写了没有粘贴过来,就是按键值没有手动清零的缘故,已经搞定了,谢谢大佬!
作者:
qsj00000
时间:
2022-5-15 19:40
hhh402 发表于 2022-5-15 18:54
没有Timer0Init();函数。按键值使用后必须手动清零。
void Time0(void) interrupt 1
{
谢谢大佬!
作者:
yaoyao2022
时间:
2022-5-15 20:37
unsigned int count=0;这条语句加static
作者:
hy47566398
时间:
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条件都能达成。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1