原本想實現的功能是:按按鍵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;}
}
}
|