51单片机数码管显示4*4矩阵键盘按键值

在这里插入图片描述
在这里插入图片描述
#include <reg52.h>
sbit du = P2^6;// 数码管段选
sbit we = P2^7;// 数码管位选
unsigned char jianzhi;//定义全局变量按键编号
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9数字
void delay(unsigned char a) //自定义延迟函数
{unsigned int x,y;
for (x=a;x>0;x–)
for (y=114;y>0;y–);
}
void keyscan( )
{ P3=0xf0; //列扫描
if(P3!=0xf0)
{delay(5);
if(P3!=0xf0)
{switch(P3)
{ case 0xe0 :jianzhi=6;break;
case 0xd0 :jianzhi=7;break;
case 0xb0 :jianzhi=8;break;
case 0x70 :jianzhi=9;break;
}
}

P3=0x0f; //行扫描
switch(P3)
{case 0x0e :jianzhi=jianzhi;break;
case 0x0d :jianzhi=jianzhi+4;break;
case 0x0b :jianzhi=jianzhi+8;break;
case 0x07 :jianzhi=jianzhi+12;break;
}
while(P3!=0x0f);
}
}
void main( )
{ while(1)
{keyscan();

 P0=0xff;//关闭数码管全部阴极
 we=1;
 P0=0xfe;//开启第1位数码管阴极
 we=0;
 P0=0;
 du=1;
if(jianzhi>=10)	//判断键盘编码十位是否为0,不为0则显示
 P0=table[jianzhi/10];//计算键盘编码十位值
else
{P0=0;//判断键盘编码十位是否为0,为0则不显示
}
du=0;
delay(10);

P0=0xff;
we=1;
P0=0xfd;// 开启第2位数码管阴极
we=0;
P0=0;
du=1;
P0=table[jianzhi%10];//计算键盘编码个位值
du=0;
delay(10);

}

}

  • 12
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
假设你使用的是常见的4x4矩阵键盘,其中有16个键。我们可以使用C51单片机的输入/输出口来读取键盘按键值,并将其转换为十进制数。 以下是一个简单的序示例,它可以实现读取键盘按键值,并将其转换为对应的十进制数并在数码管显示出来。请注意,该序仅适用于常见的4x4矩阵键盘,并且仅能显示单个数字(0-9)。 ``` #include <reg51.h> #define KEYPAD_PORT P1 // 定义键盘接口 sbit ROW1 = P2^0; // 定义行引脚 sbit ROW2 = P2^1; sbit ROW3 = P2^2; sbit ROW4 = P2^3; sbit COL1 = P2^4; // 定义列引脚 sbit COL2 = P2^5; sbit COL3 = P2^6; sbit COL4 = P2^7; void delay(unsigned int time); // 延时函数 unsigned char get_key(void); // 获取按键值函数 void display(unsigned char num); // 在数码管显示数字 void main() { unsigned char key_value; while(1) { key_value = get_key(); // 获取按键值 if(key_value != 0xFF) // 如果有按键按下 { display(key_value); // 在数码管显示对应的十进制数 } } } unsigned char get_key(void) { unsigned char row, col; KEYPAD_PORT = 0x0F; // 先将行引脚置为高电平,列引脚置为低电平 col = KEYPAD_PORT & 0x0F; // 读取列引脚的状态 if(col == 0x0F) // 如果列引脚仍然为高电平,说明没有按键按下 { return 0xFF; } // 依次循环检测每一行 ROW1 = 0; ROW2 = 1; ROW3 = 1; ROW4 = 1; delay(5); col = KEYPAD_PORT & 0x0F; if(col != 0x0F) // 如果此时列引脚有低电平,说明该行有按键按下 { switch(col) { case 0x07: return 1; // 第一列 case 0x0B: return 2; // 第二列 case 0x0D: return 3; // 第三列 case 0x0E: return 10; // 第四列 } } ROW1 = 1; ROW2 = 0; ROW3 = 1; ROW4 = 1; delay(5); col = KEYPAD_PORT & 0x0F; if(col != 0x0F) { switch(col) { case 0x07: return 4; case 0x0B: return 5; case 0x0D: return 6; case 0x0E: return 11; } } ROW1 = 1; ROW2 = 1; ROW3 = 0; ROW4 = 1; delay(5); col = KEYPAD_PORT & 0x0F; if(col != 0x0F) { switch(col) { case 0x07: return 7; case 0x0B: return 8; case 0x0D: return 9; case 0x0E: return 12; } } ROW1 = 1; ROW2 = 1; ROW3 = 1; ROW4 = 0; delay(5); col = KEYPAD_PORT & 0x0F; if(col != 0x0F) { switch(col) { case 0x07: return 14; case 0x0B: return 0; case 0x0D: return 15; case 0x0E: return 13; } } return 0xFF; } void display(unsigned char num) { P0 = num; // 将数字写入P0口 delay(50); // 延时一段时间 } void delay(unsigned int time) { unsigned int i,j; for(i=0;i<time;i++) { for(j=0;j<125;j++) { } } } ``` 在上述代码中,我们使用了一个名为“get_key”的函数来获取键盘按键值。该函数首先将行引脚置为高电平,列引脚置为低电平,然后读取每一列的状态。如果所有列引脚都为高电平,则说明没有按键按下。否则,我们将依次检测每一行,以确定哪一行的按键被按下。 在检测行引脚状态时,我们将当前行引脚置为低电平,其他行引脚置为高电平,并读取每一列的状态。如果某一列引脚为低电平,则说明对应的按键被按下。通过这种方法,我们可以确定被按下的按键是哪一个,并返回其对应的十进制数。 在主函数中,我们使用一个while循环来不断读取键盘按键值并在数码管显示出来。如果没有按键按下,则序会一直等待,直到有按键按下为止。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值