原本想实现的功能是:按按键1加一,按键2减一,按键三清零,按键4定时器定时一秒自动加一,按键5灯全亮,蜂鸣器响,再按就关了,按键6为P3.2口是中断,中断一次实行流水灯程序
可问题就出在当按了中断后,灯没有执行流水灯程序,反而数码管依次轮流闪亮,灯只亮了两展,不知道问题出在哪
以下是本人的程序,求大侠指点!!!!谢谢啊!!!!!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned int
#define led P2
uint code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0,1,2,3,4,5,6,7,8,9
uint code btm[]={0xe7,0xc3,0x81,0x00} ;
uint code mtb[]={0x7e,0x3c,0x18,0x00} ;
sbit smg1=P1^0;
sbit smg2=P1^1;
sbit smg3=P1^2;
sbit smg4=P1^3;
sbit key1=P3^7;
sbit key2=P3^6;
sbit key3=P3^5;
sbit key4=P3^4;
sbit key5=P3^3;
sbit sb=P1^5;
uint ge,shi,bai,qian,num,tt;
uint count=0;
void dely(uint);
void display(uint);
void ltr()
{led=0x7f;
for(count=0;count<8;count++)
{
led=led>>1;
dely(500);
}
return;
}
void rtl()
{led=0xfe;
for(count=0;count<8;count++)
{
led=led<<1;
dely(500);
}
return;
}
void bothtomiddle()
{led=0xff;
for(count=0;count<5;count++)
{led=btm[count];
dely(500);
}
return;
}
void middletoboth()
{led=0xff;
for(count=0;count<5;count++)
{led=mtb[count];
dely(500);
}
return;
}
void dely(uint t)
{ uint x,y;
for(x=0;x<t;x--)
for(y=0;y<110;y--)
{}
}
void init() //初始化T0和INT0
{ EA=1;
ET0=1;
EX0=1;
IT0=0;
TMOD=0X01;
TH0=(65536-45872)/256;
TL0=(65536-45872)/256;
}
void keyscan()
{
if(key1==0) //按键1加一
{
dely(10);
if(key1==0)
{ num++;
if(num==10000)
{
num=0;
sb=0;
dely(1000);
sb=1;
}
while(!key1);
}
}
if(key2==0) //按键2减一
{
dely(10);
if(key2==0)
{
if(num==0)
{
num=10000;
sb=0;
dely(1000);
sb=1;
}
num--;
while(!key2);
}
}
if(key3==0) //按键3清零作用
{
dely(10);
if(key3==0)
{
num=0;
while(!key3);
}
}
if(key4==0)
{
dely(10);
if(key4==0) //定时器工作
{
while(!key4);
TR0=~TR0;
}
}
if(key5==0) //按键5功能
{
dely(10);
if(key5==0)
{
while(!key5) ;
dely(5); //LED全亮,蜂鸣器响
led=~led;
sb=~sb;
dely(100);
}
}
}
void display(uint number) //显示数据函数
{ qian=number/1000;
bai=number%1000/100;
shi=number%100/10;
ge=number%10;
smg1=0;
P0=table[qian];
dely(5);
P0=0xff;
smg1=1;
smg2=0;
P0=table[bai];
dely(5);
P0=0xff;
smg2=1;
smg3=0;
P0=table[shi];
dely(5);
P0=0xff;
smg3=1;
smg4=0;
P0=table[ge];
dely(5);
P0=0xff;
smg4=1;
}
void zhongduan() interrupt 0 //中断函数内容
{
ltr();
rtl();
bothtomiddle();
middletoboth();
led=0xff;
}
void main() //主函数入口
{ num=0;
init(); //初始化定时中断函数
while(1)
{
keyscan();
display(num);
}
}
void timet0() interrupt 1 //定义计数器功能
{
TH0=(65536-45872)/256;
TL0=(63336-45872)/256;
tt++;
if(tt==20)
{
tt=0;
num++;
if(num==10000)
{num=0;}
}
}
|