用按键作显示模式选择键,实现上述实验中3个显示画面的切换,即上电显示“1”,按1次键显示“1234”,按第2次键显示2位秒计数器,按3次键又显示“1”……。

#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 单片机 数码管的知识

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值