设定4*4键盘组输入关系如下图所示: 在上述键盘设定的情况下,输入四个数字并循环显示。例如:以输入2761为例,数码管显示:2761-276.1-27.61-2.761-7612-761.2-76.123-7.612-7127-612.7-61.27-6.127-1276-127.6-12.76-1.276-2761-...。
时间: 2023-08-08 21:05:55 浏览: 45
好的,下面是一个基于你给出的键盘输入关系的 C 语言代码,可以实现输入四个数字并循环显示:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};
uchar code keymap[]={
1, 2, 3, 10,
4, 5, 6, 11,
7, 8, 9, 12,
14, 0, 15, 13
};
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
uchar read_key()
{
uchar i, j;
uchar key = 0xff;
for(i=0; i<4; i++)
{
P1 = ~(1<<i);
j = P1 & 0xF0;
if(j != 0xF0)
{
key = i*4 + ((j>>4) & 0x0F);
while((P1 & 0xF0) != 0xF0);
break;
}
}
return key;
}
uchar get_digit(uchar num, uchar pos)
{
uchar digit;
switch(pos)
{
case 0: digit = num / 1000; break;
case 1: digit = (num % 1000) / 100; break;
case 2: digit = (num % 100) / 10; break;
case 3: digit = num % 10; break;
default: digit = 0; break;
}
return digit;
}
void display(uchar num)
{
uchar i;
for(i=0; i<4; i++)
{
LSA = i == 0 ? 1 : 0;
LSB = i == 1 ? 1 : 0;
LSC = i == 2 ? 1 : 0;
P0 = table[get_digit(num, i)];
delay(1000);
}
}
void main()
{
uchar i=0;
uchar num[4] = {0, 0, 0, 0};
while(1)
{
uchar key = read_key();
if(key <= 9)
{
num[i] = key;
i = (i + 1) % 4;
}
uchar j;
for(j=0; j<4; j++)
{
display(num[j]*1000 + num[(j+1)%4]*100 + num[(j+2)%4]*10 + num[(j+3)%4]);
}
}
}
```
在这个代码中,我们使用了一个 `keymap` 数组来存储键盘输入的映射关系,通过 `read_key` 函数来读取当前按下的键位。我们也定义了一个 `get_digit` 函数来取得一个四位数字中某一位上的数字。在主循环中,我们不停地读取键盘输入,并将输入的数字存储在数组 `num` 中,然后依次显示 `num` 数组中的四个数字按顺序组合而成的数字。