1通过AT89C51读入4位开关K1、K2、K3、K4的输入状态并按照二进制编码关系1-4输出到数码管显示。如K1按下则显示1;K2按下则显示2等多个按键按下作为无效键显示0
以下是AT89C51的代码实现:
#include <reg51.h>
#define DIGIT_DISP P0 // 数码管控制端口
#define SWITCH P1 // 开关输入端口
void delay(unsigned int time) // 延时函数
{
while(time--);
}
unsigned char read_switch() // 读取开关状态
{
unsigned char input = 0;
if (SWITCH & 0x01) input |= 0x01; // K1按下
if (SWITCH & 0x02) input |= 0x02; // K2按下
if (SWITCH & 0x04) input |= 0x04; // K3按下
if (SWITCH & 0x08) input |= 0x08; // K4按下
return input;
}
void display_digit(unsigned char digit) // 数码管显示
{
static unsigned char code[10] = { // 数码管编码表
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
DIGIT_DISP = code[digit]; // 显示数字
}
void main()
{
while (1)
{
unsigned char input = read_switch(); // 读取开关状态
if (input == 0) // 无效键
{
display_digit(0); // 显示0
}
else
{
display_digit(input); // 显示数字
}
delay(1000); // 延时1秒
}
}
该程序首先定义了延时函数和数码管编码表,然后在read_switch()函数中读取开关输入状态,通过位运算将开关状态转化为一个4位二进制数,最后在display_digit()函数中根据数码管编码表将数字转化为数码管可以显示的编码。在main()函数中,循环读取开关状态并进行数码管显示,如果没有按下任何开关则显示0,否则根据按下的开关显示相应的数字。程序中还加入了1秒的延时,使得数码管显示的数字可以持续一段时间,避免数码管显示太快导致无法观察。
原文地址: https://www.cveoy.top/t/topic/bapv 著作权归作者所有。请勿转载和采集!