初学者:救命!!!很着急呀!!各位DX,我编了一个键盘程序,很简单的,可是不知道为什么总是无法正确执行。请大家帮
帮忙。以下是我的程序:
#include <reg51.h>
unsigned char oldkey1, KeyVal=0,Key1,Key2,Key3,oldKey1, oldKey2,
oldKey3,ch;
unsigned int cn;
unsigned char buffer[3];
unsigner char table[41]={,,,,,}//显示数据
void wait_free(uchar k){
uchar t;
t=k;
while(--t);
}
void ShowKeyInit(void) {
uchar i;
scan=0;
KeyVal=0;
Key1=0;
Key2=0;
Key3=0;
oldKey1=1;
oldKey2=1;
oldKey3=1;
cn=0;
ch=0;
KeyCounter=0; //键值计数器
for(i=0;i<3;i++)
buffer[i]=i*10; //显示缓冲区清
fKey=0;
}
void HardwareInit(void){
TMOD=0x21; // 初始化Timer0模式1,Timer1模式2,
TH0=-TH0_HIGH; //for 2.5ms,3个数码管
TL0=-TL0_LOW;
ET0=1;
TR0=1;
EA=1;
}
#pragma disable
void display(uint ShowData){
uint tmp; // 计算显示结果
uchar i;
tmp=ShowData;
for(i=0;i<3;i++){
buffer[i]=(uchar)(tmp)%10+10*i;
tmp=tmp/10;
}
if(buffer[2]==20){ //屏蔽无效0
buffer[2]=41;
if(buffer[1]==10)
buffer[1]=41;
}
}
void KeyAlter(void){
if(KeyVal==ADDKEY){ //增量键处理
cn++;
if(cn>=56)
cn=2;
}
else { //减量键处理
cn--;
if(cn==0)
cn=56;
}
display(cn);
return ;
}
void keyManage(void){
if(fKey){
fKey=0;
KeyAlter();
wait_free(50000);
wait_free(50000);
wait_free(50000);
}
else{
KeyCounter=0;
KeyMark=0;
}
}
timerint () interrupt 1 using 3{
TR0=0;
TL0=-TL0_LOW;
TH0=-TH0_HIGH; // for 2.5ms
TR0=1;
data_display=0x00; //
data_display=table[ch]; //依次显示6位
if(scan==1&&!fKey) { // 扫描减量键
ScanAir=air_signal;
Key1=(~ScanAir)&0x10;
if(Key1==0x10&&oldKey1){
fKey=1;
KeyVal=CUTKEY;
}
}
if(scan==0&&!fKey){ // 扫描增量键
ScanAir=air_signal;
Key2=(~ScanAir)&0x10;
if(Key2==0x10&&oldKey2){
fKey=1;
KeyVal=ADDKEY;
}
}
oldKey1=Key1;
oldKey2=Key2;
scan++;
if(scan==3)
scan=0;
}
int main(void){
ShowKeyInit();
HardwareInit();
while(1){
keyManage();
}
return 0;
}
这是按键和显示程序,键盘扫描和显示都放在中断里,LED 是动态显示。我的原意
是要按键一次,做加1或减1,可是我在执行程序的时候总是按一次键,加或者减的得数总是
不一样,也就是加或者减的数据总是大于1,而且很不规则,我不知道问题出现在哪里,请
给位指点。