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

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

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

图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);
	}
}		


  • 44
    点赞
  • 194
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加
好的,以下是一个基于51单片机的数码管数字加减的完整代码示例。这里使用了共阳数码管和4个按键,分别对应加、减、清零和退出。 ```C #include <reg51.h> #define uchar unsigned char #define uint unsigned int // 数码管显示数字,0-9为数字,10为负号,11为空 uchar code ledChar[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40, 0x00}; // 数码管位选信号,4位 uchar code ledPos[] = {0xfe, 0xfd, 0xfb, 0xf7}; // 按键对应的IO口,4个 sbit keyAdd = P1^0; sbit keySub = P1^1; sbit keyClr = P1^2; sbit keyExit = P1^3; // 当前显示数字 int num = 0; // 显示数字的函数 void display() { uchar i; uchar pos = 0; // 分离出每一位数字 uchar digit[4] = {num % 10, num / 10 % 10, num / 100 % 10, num / 1000 % 10}; // 逐个显示每一位数字 for (i = 0; i < 4; i++) { // 选择位选信号 P2 = ledPos[pos]; // 发送数字信号 P0 = ledChar[digit[i]]; // 延时一段时间,使数字能够被肉眼观察到 delay(5); // 清空数字信号 P0 = 0x00; // 移动到下一个位选信号 pos++; } } // 延时函数 void delay(uint t) { uint i, j; for (i = 0; i < t; i++) for (j = 0; j < 100; j++); } // 主函数 void main() { // 初始化IO口 P0 = 0x00; P2 = 0xff; // 循环检测按键 while (1) { // 加 if (!keyAdd) { delay(10); if (!keyAdd) { num++; if (num > 9999) num = 9999; display(); } } // 减 if (!keySub) { delay(10); if (!keySub) { num--; if (num < -999) num = -999; display(); } } // 清零 if (!keyClr) { delay(10); if (!keyClr) { num = 0; display(); } } // 退出 if (!keyExit) { delay(10); if (!keyExit) { break; } } } } ``` 这个程序中,使用了一个循环来不断检测按键,根据按键状态实现加、减、清零和退出等功能。在每个功能中,先通过一个延时函数对按键进行去抖处理,然后根据需要修改当前显示数字并调用display函数显示出来。在display函数中,先将当前数字分离出每一位,然后逐个选择位选信号并发送数字信号,最后通过延时函数使数字能够被肉眼观察到。 需要注意的是,这个程序中使用了一些特定的IO口和延时函数,需要根据具体的硬件环境进行修改。同时,这个程序中没有使用中断,如果需要使用中断来实现按键检测等功能,需要对程序进行一定的修改。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值