请问用这个图编写keil工程代码,使用外部中断和定时器知识,实现gif图中的功能:按键第一次按下,数码管数值自动每秒加一(按16进制从0加到F),加到F自动清零。用按键接到外部中断0的引脚(P3^2),用外部中断控制计数开启/停止。另外,在计数时,LED亮,计数停止时LED灭。 | 有点问题,哪位好心人帮我改一改!
#include"reg51.h"
#define m P0
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
u8 i=0,k=0,j=0,T;
sbit led=P2^5;
sbit anjian=P3^2;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void delay1ms() //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void display()
{
led=0;
while(j<16)
{
P0=smgduan[j];
delay1ms();
if(i==15)
{
i=0;
j++;
}
}
// delay1ms();
}
void kk()
{
if(anjian==0)
{
delay1ms();
if(anjian==0)
{
TR0=!TR0;
while(anjian==0)
display();
}
}
}
void zhongduan()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0; //定时50ms
//设置INT0
// IT0=1;//跳变沿出发方式(下降沿)
// EX0=1;//打开INT0的中断允许。
//设置INT1
TR1=1;
ET1=1;
EA=1;//打开总中断
}
/*
void Int0() interrupt 0 //外部中断0的中断函数
{
delay1ms(); //延时消抖
while(1)
{
kk();
}
}
*/
void main()
{
zhongduan();
P0=smgduan[0];
while(1)
{
// display();
kk();
}
}
void timer_0() interrupt 1 //定时器中断函数
{
TH0=0x3c;
TL0=0xb0; //定时50ms
k++;
if(k==20)
{
i++;
k=0;
}
}
|