各位大侠,帮忙看看:用Keil编写的程序,编译没有错误,下载到51单片机开发板上没有结果

在矩阵键盘上按一个按键,在一位共阳极数码管上显示对应的数字
#include<reg52.h>
unsigned char kayma();
unsigned char kayscan();
unsigned char disp(unsigned char );
void delay();//ms级别
unsigned char biaozhi=0;//用于标志
unsigned char m;//m用于接收键值
void Init_INT0(void); //外部中断0初始化和
unsigned char code duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
// 显示数值表0-9

main(){

void Init_INT0();
while(1){
P1=0xf0;//赋值用于中断检测,高四位必须是全一
P0=0x40;
if(biaozhi==1){
biaozhi=0;//标志位清零,以便下次使用
m=kayma();
if(m!=0xff){
P0=duanma[m];
delay();
}
}
}
}
void Init_INT0(void)
{
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=1; //边沿触发
}
void delay(){
unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
unsigned char keyscan(){//反转扫描
unsigned char h,l;
P1=0xf0;
l=P1;
if(l!=0xf0){
delay();//延时去抖
if((P1&0xf)!=0xf0){//确有按键按下
l=P1&0xf0;//取出列值
P1=l|0x0f;
h=P1&0x0f;//取行值
while((P1&0x0f)!=0x0f);//等待松开并输出

return(l+h);
}

}return(0xff);
}
unsigned char keyma(){
switch(keyscan()){
case 0x77:return 0;break;
case 0x7e:return 1;break;
case 0xbe:return 2;break;
case 0xde:return 3;break;
case 0x7d:return 4;break;
case 0xbd:return 5;break;
case 0xdd:return 6;break;
case 0x7b:return 7;break;
case 0xbb:return 8;break;
case 0xdb:return 9;break;
default:return 0xff;break;
}
}
void ISR_INT0(void) interrupt 0
{
biaozhi=1; //表明按键有动作,可以进行按键扫描
}

你好 看了一下,利用外部中断来处理键盘,在没有重要资源的时候,还是不错的选择,但在1ms及以下级的脉冲输出的时候,就要把中断留给定时器。以防止int0阻止t0的中断。好言归正传,首先靠int0,来控制键盘,在硬件上要有触发条件,因为int0是硬件触发的,再说软件,其实键盘的扫描,除了你程序中编程的键值确定外,更重要的是你没有在键盘一旦中断,就要关闭int0的中断,然后程序进入键盘的确认功能,在执行相应程序,完成后从新打开int0,你的程序,isr_int0只有一条语句,这样你的程序就会在陷阱里出不来,按键首先进入int0服务,从中断服务跳出,有键按下,再进入中断服务,如此周而复始,根本进入不了键盘确认程序,程序其他地方没仔细看,个人感觉,你用int0来做键盘处理,就不要在程序的其他部分有处理了,因为int0是硬件触发,触发后进入中断服务,第一步关闭中断,延时,再判,处理键盘所要求的功能(程序),开中断,返回主循环。再说,现在的单片机一般工作在12M,一个键的处理也就是几十条语句,1个毫秒都不到。直接在int0里处理就行了,在程序中,多段操作只会加大难度,及调试困难。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-11
unsigned char kayma();
unsigned char kayscan();
unsigned char disp(unsigned char );

unsigned char keyscan(){//反转扫描
unsigned char keyma(){

这是从你上面的程序中摘录下来的几句话。
你看看有没有错。

将你的程序改一下发给你,很容易,
但是,你最好还是先检查一下你的程序。
第2个回答  2011-12-11
因为你用边沿触发中断设置标志位扫描按键,中断了,按键动作也结束了,再扫描也没有键值,建议你用主循环扫描按键。