51单片机按键控制数码管显示0-9

实验题目:使用51单片机设计两个按键控制数码管显示0-9,当K1按下减1,当K2按下加1.

理解程序可参考我的另外两个文章;

51单片机数码管显示0-9_学习笔记吧的博客-CSDN博客

51单片机独立按键控制合集_学习笔记吧的博客-CSDN博客

两个文章一结合就是一个新的产物,所以51单片机玩来玩去就是各种简单程序的相加。他套他,再套他,加个数码管加按键,加各种东西,重点是要理解,怎么让他们结合起来不会报错。

实验程序:

#include<REGX52.H>

unsigned char code Tab[]=     //共阴数码管段码表0-9
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void Delay1ms(unsigned int xms)  //延时1ms函数
{
unsigned char i,j;
while(xms)
{
i = 2 ;
j = 239 ;
do
{
while (--j);
}
while (--i);
xms--;
}
}

	void main ()    //主函数
	{
		unsigned char rge		= 0 ;   //局部变量计位数rge是段码表的位置
		P0= 0x3f;    //定义初始值显示0
		while(1)
		{

			if(P3_1 ==0)		//判断按键是否按下
			{
				Delay1ms(20);    //消抖
				while(P3_1 ==0);  //再次判断
				Delay1ms(20);     //消抖
				
				rge++;   //数字加1
				if(rge>=10)  //控制加的位数别超出段码表了
				{
					rge = 0 ;   //如果超出就让他回0去
				}
				 P0=Tab[rge];  //把第rge的段码赋值给P0口
			   Delay1ms(500);  //延时500ms
				}
				
				
				if(P3_0 ==0)		//判断按键是否按下
			{
				Delay1ms(20);    //消抖
				while(P3_0 ==0);  //再次判断
				Delay1ms(20);     //消抖
				
			if(rge==0)   //因为我们定义的变量led是无符号型,如果直接减减不可能减为负数
				rge = 9 ;  //所以判断如果减到0就重新给他赋值
			else
				rge--;   //如果没减到0就继续减减
			
				P0=Tab[rge];  //把第reg的段码赋值给P0口
			  Delay1ms(500);  //延时500ms
				}
			}
		}

实验原理图:

 

  • 36
    点赞
  • 343
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是51单片机按键输入数码管数字代码的示例,具体实现方法可能因硬件平台而异: ```c #include <reg52.h> // 数码管段选对应的IO口 sbit seg_a = P2^0; sbit seg_b = P2^1; sbit seg_c = P2^2; sbit seg_d = P2^3; sbit seg_e = P2^4; sbit seg_f = P2^5; sbit seg_g = P2^6; sbit seg_dp = P2^7; // 数码管位选对应的IO口 sbit dig_1 = P1^0; sbit dig_2 = P1^1; sbit dig_3 = P1^2; sbit dig_4 = P1^3; // 按键对应的IO口 sbit key_1 = P3^0; sbit key_2 = P3^1; sbit key_3 = P3^2; sbit key_4 = P3^3; unsigned char key_val[4][4] = {{'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}}; void delay(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 114; j++); } } void display(unsigned char dig, unsigned char val) { // 数码管段选 switch (val) { case '0': seg_a = 0; seg_b = 0; seg_c = 0; seg_d = 0; seg_e = 0; seg_f = 0; seg_g = 1; break; case '1': seg_a = 1; seg_b = 0; seg_c = 0; seg_d = 1; seg_e = 1; seg_f = 1; seg_g = 1; break; case '2': seg_a = 0; seg_b = 0; seg_c = 1; seg_d = 0; seg_e = 0; seg_f = 1; seg_g = 0; break; case '3': seg_a = 0; seg_b = 0; seg_c = 0; seg_d = 0; seg_e = 1; seg_f = 1; seg_g = 0; break; case '4': seg_a = 1; seg_b = 0; seg_c = 0; seg_d = 1; seg_e = 1; seg_f = 0; seg_g = 0; break; case '5': seg_a = 0; seg_b = 1; seg_c = 0; seg_d = 0; seg_e = 1; seg_f = 0; seg_g = 0; break; case '6': seg_a = 0; seg_b = 1; seg_c = 0; seg_d = 0; seg_e = 0; seg_f = 0; seg_g = 0; break; case '7': seg_a = 0; seg_b = 0; seg_c = 0; seg_d = 1; seg_e = 1; seg_f = 1; seg_g = 1; break; case '8': seg_a = 0; seg_b = 0; seg_c = 0; seg_d = 0; seg_e = 0; seg_f = 0; seg_g = 0; break; case '9': seg_a = 0; seg_b = 0; seg_c = 0; seg_d = 0; seg_e = 1; seg_f = 0; seg_g = 0; break; case 'A': seg_a = 0; seg_b = 0; seg_c = 0; seg_d = 1; seg_e = 0; seg_f = 0; seg_g = 0; break; case 'B': seg_a = 1; seg_b = 1; seg_c = 0; seg_d = 0; seg_e = 0; seg_f = 0; seg_g = 0; break; case 'C': seg_a = 0; seg_b = 1; seg_c = 1; seg_d = 0; seg_e = 0; seg_f = 0; seg_g = 1; break; case 'D': seg_a = 1; seg_b = 0; seg_c = 0; seg_d = 0; seg_e = 0; seg_f = 1; seg_g = 0; break; case '*': seg_a = 1; seg_b = 1; seg_c = 1; seg_d = 0; seg_e = 0; seg_f = 0; seg_g = 0; break; case '0': seg_a = 0; seg_b = 0; seg_c = 0; seg_d = 0; seg_e = 0; seg_f = 0; seg_g = 1; break; case '#': seg_a = 1; seg_b = 1; seg_c = 1; seg_d = 1; seg_e = 1; seg_f = 1; seg_g = 0; break; default: break; } // 数码管位选 switch (dig) { case 1: dig_1 = 0; dig_2 = 1; dig_3 = 1; dig_4 = 1; break; case 2: dig_1 = 1; dig_2 = 0; dig_3 = 1; dig_4 = 1; break; case 3: dig_1 = 1; dig_2 = 1; dig_3 = 0; dig_4 = 1; break; case 4: dig_1 = 1; dig_2 = 1; dig_3 = 1; dig_4 = 0; break; default: break; } } void main() { unsigned char key, dig; unsigned int cnt = 0; while (1) { // 扫描按键 key = 0; if (key_1 == 0) { delay(10); if (key_1 == 0) { key = key_val[0][0]; } } else if (key_2 == 0) { delay(10); if (key_2 == 0) { key = key_val[0][1]; } } else if (key_3 == 0) { delay(10); if (key_3 == 0) { key = key_val[0][2]; } } else if (key_4 == 0) { delay(10); if (key_4 == 0) { key = key_val[0][3]; } } // 显示数码管 if (key != 0) { display(1, key); display(2, key); display(3, key); display(4, key); } else { cnt++; if (cnt >= 5000) { cnt = 0; } dig = cnt % 4 + 1; display(dig, '0'); } } } ``` 该代码实现了按键输入数字并在数码管上显示的功能,同时也包含了数码管扫描的实现。在按键按下时,会将按键对应的字符显示在所有的数码管上;在未按键时,数码管上会显示一个从0开始计数的计数器值。请注意,该代码仅为示例,具体实现还需要根据实际硬件平台进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值