单片机按键控制led灯二极管矩阵输入的代码
时间: 2023-08-16 09:04:37 浏览: 88
51单片机按键输入(一个按键控制一个led发光二极管+4*4矩阵控制数码管键值显示)proteus+keil.rar
好的,以下是一个基于51单片机的按键控制LED灯二极管矩阵输入的示例代码:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
/* 定义LED灯矩阵对应的端口 */
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
sbit LED = P2^7;
/* 定义按键对应的端口 */
sbit KEY1 = P3^1;
sbit KEY2 = P3^2;
sbit KEY3 = P3^3;
sbit KEY4 = P3^4;
/* 定义LED灯矩阵的显示数据 */
uchar code LedChar[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
/* 定义按键扫描函数 */
uchar Key_Scan(void)
{
/* 如果按键1按下 */
if (KEY1 == 0)
{
/* 短暂延时,检测按键是否仍按下 */
Delay(10);
if (KEY1 == 0)
{
/* 等待按键松开 */
while (!KEY1);
return 1; // 返回按键1的编号
}
}
/* 如果按键2按下 */
if (KEY2 == 0)
{
Delay(10);
if (KEY2 == 0)
{
while (!KEY2);
return 2; // 返回按键2的编号
}
}
/* 如果按键3按下 */
if (KEY3 == 0)
{
Delay(10);
if (KEY3 == 0)
{
while (!KEY3);
return 3; // 返回按键3的编号
}
}
/* 如果按键4按下 */
if (KEY4 == 0)
{
Delay(10);
if (KEY4 == 0)
{
while (!KEY4);
return 4; // 返回按键4的编号
}
}
return 0; // 如果没有按键按下,则返回0
}
/* 定义延时函数 */
void Delay(uint i)
{
uint j, k;
for (j = i; j > 0; j--)
{
for (k = 110; k > 0; k--);
}
}
/* 主函数 */
void main(void)
{
uchar i = 0;
uchar num = 0;
while (1)
{
/* 检测按键是否按下 */
num = Key_Scan();
if (num != 0)
{
/* 显示按键对应的数字 */
i = num - 1;
LED = 0;
P0 = LedChar[i];
LED = 1;
}
/* 显示LED灯矩阵 */
for (i = 0; i < 8; i++)
{
switch (i)
{
case 0: LSA = 0; LSB = 0; LSC = 0; break;
case 1: LSA = 1; LSB = 0; LSC = 0; break;
case 2: LSA = 0; LSB = 1; LSC = 0; break;
case 3: LSA = 1; LSB = 1; LSC = 0; break;
case 4: LSA = 0; LSB = 0; LSC = 1; break;
case 5: LSA = 1; LSB = 0; LSC = 1; break;
case 6: LSA = 0; LSB = 1; LSC = 1; break;
case 7: LSA = 1; LSB = 1; LSC = 1; break;
}
P0 = LedChar[i];
Delay(1); // 短暂延时,使LED灯矩阵显示更加稳定
}
}
}
```
这段代码实现了通过按键控制LED灯二极管矩阵输入,具体实现过程如下:
1. 定义LED灯矩阵对应的端口和按键对应的端口。
2. 定义LED灯矩阵的显示数据。
3. 定义按键扫描函数,用来检测哪个按键被按下。
4. 定义延时函数,用来控制LED灯矩阵的显示速度。
5. 在主函数中,循环检测是否有按键被按下,如果有,则显示按键对应的数字。
6. 显示LED灯矩阵,通过循环控制LED灯矩阵的每一行显示对应的数字。
希望对你有所帮助!
阅读全文