紧急求助
各位大家好,小弟近期遇到一个有关C51的问题,望各位高手赐教。程序稍微有点长,对不住了。希望您保持一点耐心,因为实在有点即急。
程序的任务是在89C51的p0口输出0xf0,以响应键盘中断。一旦键盘中断被响应,数码管输出有所改变(从p2口输出代码)。
现在的问题是如果斜体语句加入(其中3,4只能加一句),则在p0口输出信号不是所预期的0xf0,而是全为高电平,键盘中断也因此无法响应。如果只加入1,2句,问题依旧。
但如果将这几句去掉,则一切正常,实在费解。
我怀疑是否与dispnum的类型有关,是否不能取为全局变量,但无法应证。恳请各位哥哥姐姐帮帮忙,小弟先此谢过。
谢谢!谢谢!
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
bit flag; //设置中断标志位,键盘按下则flag=1
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2; //p10、p12在该段程序中没起作用,但应该对程序的运行无影响
sbit led1=P1^3; //数码管的片选信号输出端
sbit led2=P1^4;
sbit led3=P1^5;
[U][I]uchar dispnum; //1[/I][/U]
uchar code table[11]={0x08,0x3b,0x14,0x11,0x23,0x41,0x40,0x1b,0x00,0x01,0x7f};
void prodisp(void);
void disp(void);
void dlms(uchar);
void keyinterrupt(void);
void main(void)
{
P0=0xf0; //在p0口送11110000
p10=0;
p11=0;
p12=0;
EA=0;
EX0=0;
[U][I] dispnum=0; //2[/I][/U]
flag=0;
EX0=1;
EA=1;
while(1)
{
p11=!p11; //不断输出喂狗信号
dlms(5);
if(flag)
{
[U][I][B] POST
disp();
}
else prodisp();
}
}
void dlms(uchar thetime) //延时程序
{
uchar i;
while(thetime!=0){
for(i=0;i <113;i++){}
thetime--;
}
}
void prodisp(void) //初始显示值000
{
led1=1;led2=0;led3=0;
P2=0x08;dlms(10);
led1=0;led2=1;led3=0;
P2=0x08;dlms(10);
led1=0;led2=0;led3=1;
P2=0x08;dlms(1);
}
void disp(void) //由主函数看出若有中断,则显示此处值:234
{
// if(sel=0) prodisp();
// else{
led1=1;led2=0;led3=0;
P2=0x11;dlms(10);
led1=0;led2=1;led3=0;
P2=0x23;dlms(10);
led1=0;led2=0;led3=1;
P2=0x41;dlms(1);
// }
}
void keyinterrupt(void) interrupt 0 using 0
{
EX0=0;
flag=1;
p12=flag;
[U][I] dispnum++; //4[/I][/U]
EX0=1;
}
发表时间:2003年7月29日15:42:59