【51单片机】4*4按键扫描,数码管显示键值

实验内容:51单片机的PX(x=0,1,2或3)端口连接4×4矩阵键盘,对应按键值为0,1,2,3…F。剩余某PX(x=0,1,2或3)端口连接七段数码管。当某一按键按下时,数码管显示该按键对应键值。

工具:proteus+keil

#include<reg51.h>
#include<intrins.h>
unsigned char code seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xA1,0x86,0x8e};//共阳译码
unsigned char circle,i; //临时变量circle,循环变量i
sbit P1.0=P1^0;//控制列
sbit P1.1=P1^1;
sbit p1.2=P1^2;
sbit p1.3=P1^3;
void delay(int a)
{
	while(a--);
}
void main()
{	
	while(1)
   {  
   	  P1=0xef;// 选择第一行P1.7~P1.4 e(1110) P1.3~P1.0 f(1111)  
	  for(i=0;i<=3;i++)
	  {
        
	  	if(P1.0==0)
			P0=seg[i*4+0];  
		if(P1.1==0)
			P0=seg[i*4+1]; 
		if(p1.2==0)
			P0=seg[i*4+2];	
     	if(p1.3==0)
			P0=seg[i*4+3];		  					  
         delay(500);
		circle=P1;
		circle=circle<<1;
		//第一次循环0xef左移1位 1101 1110 //第二次循环0xef再次左移1位 1011 1100 /……
		circle=circle | 0x0f;
		//第一次循环 1110 1111  0xef	 第二次循环0xef左移一位后:1101 1110  
		//               |				                               |
		//           0000 1111  0x0f	                           0000 1111  0x0f
		//           1110 1111  0xef(选择第一行)	               1101 1111  0xbf(选择第二行)  
		P1=circle; //将临时量circle赋值给P1,以便下次循环,进入扫描下一行
   	   }
	} 
}	

 

  • 6
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我来回答你的问题。 以下是51单片机按下按键显示对应的数码管键值,带有键盘扫描以及数码管显示函数的代码实现: ``` #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit key1 = P2^0; sbit key2 = P2^1; sbit key3 = P2^2; sbit key4 = P2^3; sbit dp = P1^7; sbit d1 = P1^6; sbit d2 = P1^5; sbit d3 = P1^4; sbit d4 = P1^3; uchar code table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 }; uchar keyValue = 0; void delay(uint xms) { uint i, j; for(i = xms; i > 0; i--) { for(j = 110; j > 0; j--); } } void keyScan() { if(key1 == 0) { delay(5); if(key1 == 0) { while(!key1); keyValue = 1; } } else if(key2 == 0) { delay(5); if(key2 == 0) { while(!key2); keyValue = 2; } } else if(key3 == 0) { delay(5); if(key3 == 0) { while(!key3); keyValue = 3; } } else if(key4 == 0) { delay(5); if(key4 == 0) { while(!key4); keyValue = 4; } } } void display() { d1 = d2 = d3 = d4 = 1; switch(keyValue) { case 1: d1 = 0; P0 = table[1]; break; case 2: d2 = 0; P0 = table[2]; break; case 3: d3 = 0; P0 = table[3]; break; case 4: d4 = 0; P0 = table[4]; break; default: d1 = d2 = d3 = d4 = 1; P0 = 0x00; break; } } void main() { while(1) { keyScan(); display(); } } ``` 这段代码实现了按下按键后显示对应的数码管键值,其中包括键盘扫描函数和数码管显示函数。 在主函数中,我们不断地调用keyScan和display函数,其中keyScan函数用于扫描按键,如果检测到有按键按下,则将对应的键值存储在keyValue变量中;display函数用于根据keyValue变量的值在数码管中显示对应的数字。 需要注意的是,为了保证数码管中的数字显示清晰,我们需要在数码管的最高位(即P1.7)上加上小数点,所以我们在代码中定义了一个dp变量,并在display函数中将其赋值给P1.7。 希望能够帮到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

H_learn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值