#include <REGX51.H> //包含51单片机的头文件,定义了一些寄存器和位变量
sbit key=P3^0; //定义按键连接的端口位,P3.0
unsigned char i; //定义一个无符号字符型变量i,用于循环计数
unsigned char count; //定义一个无符号字符型变量count,用于记录按键次数
unsigned int flag; //定义一个无符号整型变量flag,用于定时器计数
unsigned char sec; //定义一个无符号字符型变量sec,用于记录秒数
unsigned char code seg[]={ //定义一个储存在代码区的无符号字符型数组seg,用于存放0~9的7段显示码
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
};
unsigned char code dig[]={ //定义一个储存在代码区的无符号字符型数组dig,用于选择显示的位数
0x01,0x02,0x04,0x08};
void delay(unsigned int xms) //@11.0592MHz //定义一个延时函数,参数为延时的毫秒数
{
unsigned char data i, j; //定义两个储存在数据区的无符号字符型变量i和j,用于延时循环
while(xms--) //当xms不为0时,执行以下操作,并将xms减1
{
i = 2; //将i赋值为2
j = 199; //将j赋值为199
do
{
while (--j); //将j减1,直到j为0时跳出循环
} while (--i); //将i减1,直到i为0时跳出循环
}
}
void timeinit() //定义一个定时器初始化函数
{
EA=1; //开启总中断
ET0=1; //开启定时器0中断
TMOD=0x01; //设置定时器0为工作方式1,16位定时/计数
TH0=(65536-50000)/256; //设置定时器0的高8位,使其每50毫秒产生一次中断
TL0=(65536-50000)%256; //设置定时器0的低8位,使其每50毫秒产生一次中断
TR0=0; //关闭定时器0
}
void keynum() //定义一个按键处理函数
{
if(count==1) //如果按键次数为1,执行以下操作
{
for(i=0;i<4;i++) //循环4次,分别显示“1”、“2”、“3”和“4”
{
P2=dig[i]; //选择要显示的位数,依次为第一位,第二位,第三位和第四位
P0=seg[i+1]; //显示对应的数字,依次为“1”、“2”、“3”和“4”
delay(1); //延时1毫秒,防止显示闪烁
}
}
else
if(count==2) //如果按键次数为2,执行以下操作
{
TR0=1; //启动定时器0
P2=dig[0]; //选择第一位显示
P0=seg[sec/10]; //显示秒数的十位
delay(1); //延时1毫秒,防止显示闪烁
P2=dig[1]; //选择第二位显示
P0=seg[sec%10]; //显示秒数的个位
delay(1); //延时1毫秒,防止显示闪烁
}
else //如果按键次数为0或其他值,执行以下操作
{
TR0=0; //关闭定时器0
P0=seg[1]; //显示“1”
P2=dig[0]; //选择第一位显示
}
}
void timer0() interrupt 1 //定义定时器0的中断服务程序
{
TH0=(65536-50000)/256; //重新加载定时器0的高8位,使其每50毫秒产生一次中断
TL0=(65536-50000)%256; //重新加载定时器0的低8位,使其每50毫秒产生一次中断
flag++; //将flag的值加1
if(flag==20) //如果flag的值达到20,执行以下操作
{
flag=0; //将flag的值清零,以便下一次计数
sec++; //将sec的值加1,表示秒数增加
sec %= 60; //将sec的值用60取模,得到0~59的秒数
}
}
void main() //定义主函数
{
timeinit(); //调用定时器初始化函数
while(1) //无限循环
{
if(key==0) //如果按键被按下,执行以下操作
{
delay(1); //延时1毫秒,消除抖动
if(key==0) //再次判断按键是否被按下,如果是,执行以下操作
{
count++; //将count的值加1,表示按键次数增加
while(key==0); //等待按键释放
}
if(count==3) //如果按键次数达到3,执行以下操作
count=0; //将count的值清零,重新开始计数
}
keynum(); //调用按键处理函数
}
}
萌新关于c51 单片机 数码管的知识