求解答:使用51
单片机数码管的前两位显示一个十进制数,变化范围是00~59,开始时显示00,每按下s2键一次,数值增加一次,每按下s3键一次,数值减一,每按下s4键一次,数值归0,每按下s5键一次,利用定时器功能使数值开始自动每秒加1,再次按下s5,数值停止加1,保持显示原数。
我写的程序代码如下:
#include<reg51.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit key1=P1^4;
sbit key2=P1^5;
sbit key3=P1^6;
sbit key4=P1^7;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code smg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num,numt;
void delayms(uint);
void display(uint numdis)//显示子程序
{
uchar shi,ge; //分离为个位和十位
shi=numdis/10;
ge=numdis%10;
LSA=0;LSB=0;LSC=0; //十位赋值
P0=smg[shi];
P0=0xff;
delayms(5);
LSA=1;LSB=0;LSC=0; //个位赋值
P0=smg[ge];
P0=0xff;
delayms(5);
}
void delayms(uint xms) //延时程序
{
uint i,j;
for(i=xms;i>0;i--)
{
for(j=110;j>0;j--);
}
}
void init() //初始化程序
{
TMOD=0x01; //定时器0工作方式1
TH0=0x3c;
TL0=0xb0;
EA=1; //开总中断
ET0=1; //开定时器中断
}
void keyscan()
{
if(key1==0)
{
delayms(10); //去抖动
if(key1==0)
{
num++;
if(num==60) //当到60时重新归0
num=0;
while(!key1); //等待键盘释放
}
}
if(key2==0)
{
delayms(10);
if(key2==0)
{
if(num==0) //当num到0时重新置60
num=60;
num--;
while(!key2);
}
}
if(key3==0)
{
delayms(10);
if(key3==0)
{
num=0; //直接清零
while(!key3);
}
}
if(key4==0)
{
delayms(10);
if(key4==0)
{
while(!key4);
TR0=~TR0; //启动或停止定时器0
}
}
}
void main()
{
init(); //初始化函数
while(1)
{
keyscan();
display(num);
}
}
void
timer() interrupt 1
{
TH0=0x3c; //重装初值(50ms)
TL0=0xb0;
numt++;
if(numt==20) //一秒时间
{
numt=0; //清零
num++;
if(num==60)
num=0;
}
}
-
单片机的接线图
一周热门 更多>