4个独立按键实现对数码管数字显示的加减清零等

本文详细介绍了使用独立按键进行程序设计的实验过程,包括按键功能实现、数码管显示逻辑以及相应的程序代码。实验内容涉及从原理图解读到程序编写及功能验证,旨在深入理解按键输入与数码管显示的交互作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        之前写了键盘的介绍和原理等。接下来根据电路图来写程序,做实验啦!

        首先,是一个关于独立按键的小程序。下面是开发板的原理图:

图1  独立键盘原理图

        程序实现功能:数码管前两位显示十进制数,00~59,开始为00。按下S1,数值+1,按下S2,数值-1,按下S3,清零,按下S4一次,自动+1,再按一次停止。

       下面附上程序:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit du=P2^6;
sbit we=P2^7;
uchar counter,num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };

uchar code list[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   //数码管的段选

delay_ms(uint ms)
{
	uint i;
	uint j;
    for(i=0;i<ms;i++)
    {
        for(j=0;j<200;j++);
        	for(j=0;j<102;j++);
    }
}

void display(uchar i)
{
	uchar shi,ge;
	shi = i / 10; //取十位
	ge  = i % 10; //求余,取各位
	
	P0 = 0xff;
	we = 1;
	P0 = list[0]; //点亮第一位数码管
	we = 0;

	du = 1;
	P0 = table[shi];
	du = 0;
	delay_ms(1);

	P0 = 0xff;
	we = 1;
	P0 = list[1];//点亮第二位数码管
	we = 0;

	du = 1;
	P0 = table[ge];
	du = 0;
	delay_ms(1);	
}
void init()
{
	TMOD=0x10; //定时器1,工作模式1,16位模式定时器
	TH1=(65535-45827)/256;
	TL1=(65535-45827)%256;  //定时50ms
	//TR1=1;     //启动定时器
}

void key()
{
	if(k1==0)
	{
		delay_ms(10);
		if(k1==0)
		{
			num++;
			if(num==60)
				num=0;
			while(!k1); //等待按键释放
		}
	}
	if(k2==0)
	{
		delay_ms(10);
		if(k2==0)
		{
			if(num==0)
				num=60;
			num--;
			while(!k2); //等待按键释放
		}
	}
	if(k3==0)
	{
		delay_ms(10);
		if(k3==0)
		{
			num=0;
			while(!k3); //等待按键释放
		}
	}
	if(k4==0)
	{
		delay_ms(10);
		if(k4==0)
		{	
			TMOD=0x10;
			TH1=(65535-45827)/256;
			TL1=(65535-45827)%256;
			TR1=1;
			while(1)
			{	if(TF1==1)
				{
	
					TF1=0;
					TH1=(65535-45827)/256;
					TL1=(65535-45827)%256;  //定时50ms
					counter++;
				}
				if(counter==20)
			 	{
					counter=0;
					num++;
				}
				if(num==60)
				{
					num=0;
				}
				display(num);	
			}
			while(!k4);	  //等待按键释放
			{
                            TR1=~TR1; 
			}
		}
	}
}

void main()
{
	init();
	while(1)
	{	
		key();
		display(num);
	}
}		


中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值