#include<reg51.h>
#include<INTRINS.h>
#define u16 unsigned int
#define u8 unsigned char
#define Pin0 0x01
#define Pin1 0x02
#define Pin2 0x04
#define Pin3 0x08
#define Pin4 0x10
#define Pin5 0x20
#define Pin6 0x40
#define Pin7 0x80
sbit k1=P3^3;
sbit k2=P3^4;
sbit k3=P3^5;
#define K1 Pin0
#define K2 Pin1
#define K3 Pin2
u8 key=0xff;//消抖后的有效按键值
u8 key_down=0x00;//按键下降沿扫描结果,1有效
u8 key_up=0x00; //上升沿扫描结果,1有效
u8 key_sc=0xff;//上次扫描的按键值
//按键扫描程序
void scanKey(){
static u8 temp0;
static u8 ms;
u8 temp=0;
if(k1==1)temp|=K1;
if(k2==1)temp|=K2;
if(k3==1)temp|=K3;
if(temp==temp0){// 按键消抖
if(++ms>=5){//连续5次扫描的值一样,则认为是稳定状态
key=temp;
ms=0;
}
}else {
temp0=temp;
ms=0;
}
key_down=key_sc&(~key);//下降沿扫描
key_up=(~key_sc)&key;//下降沿扫描
key_sc=key;
}
u8 readPIN(u8 port,u8 pin){
return ((port&pin)==0?0:1);
}
u8 ds[4]; //数码管显示缓存
code u8 w[]={0x01,0x02,0x04,0x08,}; //位码
code u8 d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//断码
code u8 dand[]={0xff,0x7f,0xff,0xff};
void dispaly(){//显示函数
static u8 a;
a++;
if(a>3)a=0;
P0=0xff;
P2=w[a];
P0=d[ds[a]]&dand[a];
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void init() //初始化函数
{ Timer0Init();
}
u16 js_ms=0;
u8 flag=0;
u16 count=0;
void main()//主函数
{
init();
TR0=1;
while(1){
ds[0]=count/1000%10;//将当前分值送到数码管缓存
ds[1]=count/100%10;
ds[2]=count/10%10;
ds[3]=count%10;
scanKey();//扫描按键
if(readPIN(key_down,K1)==1){//k1,开始
flag=1;
}
if(readPIN(key_down,K2)==1){//k2,停止
flag=0;
}
if(readPIN(key_down,K3)==1){//k3,复位
count=0;
}
}
}
void timer0() interrupt 1//定时器,实现倒计时
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
dispaly();
if(++js_ms>=10&&flag!=0){
js_ms=0;
if(count<5999)count++;
}
}
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/bd3eb13533fa828b51d418d8f41f4134970a5a12?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
追问有点问题 。。板子上蜂鸣器一直再响 数码管上显示不全
追答你蜂鸣器接哪个脚,数码管共阴共阳有没有接其它芯片
还要把定时器的初始化和重载值换成stc的
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}