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

在矩阵键盘上按一个按键,在一位共阳极数码管上显示对应的数字#include<reg52.h>unsignedcharkayma();unsignedcharkayscan... 在矩阵键盘上按一个按键,在一位共阳极数码管上显示对应的数字
#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; //表明按键有动作,可以进行按键扫描
}
展开
 我来答
smokeghost
2011-12-11 · TA获得超过544个赞
知道小有建树答主
回答量:354
采纳率:100%
帮助的人:342万
展开全部
你好 看了一下,利用外部中断来处理键盘,在没有重要资源的时候,还是不错的选择,但在1ms及以下级的脉冲输出的时候,就要把中断留给定时器。以防止int0阻止t0的中断。好言归正传,首先靠int0,来控制键盘,在硬件上要有触发条件,因为int0是硬件触发的,再说软件,其实键盘的扫描,除了你程序中编程的键值确定外,更重要的是你没有在键盘一旦中断,就要关闭int0的中断,然后程序进入键盘的确认功能,在执行相应程序,完成后从新打开int0,你的程序,isr_int0只有一条语句,这样你的程序就会在陷阱里出不来,按键首先进入int0服务,从中断服务跳出,有键按下,再进入中断服务,如此周而复始,根本进入不了键盘确认程序,程序其他地方没仔细看,个人感觉,你用int0来做键盘处理,就不要在程序的其他部分有处理了,因为int0是硬件触发,触发后进入中断服务,第一步关闭中断,延时,再判,处理键盘所要求的功能(程序),开中断,返回主循环。再说,现在的单片机一般工作在12M,一个键的处理也就是几十条语句,1个毫秒都不到。直接在int0里处理就行了,在程序中,多段操作只会加大难度,及调试困难。
xiaopc001
2011-12-11 · TA获得超过1954个赞
知道小有建树答主
回答量:578
采纳率:0%
帮助的人:224万
展开全部
unsigned char kayma();
unsigned char kayscan();
unsigned char disp(unsigned char );

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

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

将你的程序改一下发给你,很容易,
但是,你最好还是先检查一下你的程序。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tdfzq
2011-12-11 · TA获得超过839个赞
知道小有建树答主
回答量:771
采纳率:75%
帮助的人:199万
展开全部
因为你用边沿触发中断设置标志位扫描按键,中断了,按键动作也结束了,再扫描也没有键值,建议你用主循环扫描按键。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式