帮我写一份基于单片机52共阴极,使用矩阵键盘的代码,效果为当第1个按键按下时,四个数码管上交替显示“2015”“LOVE”,第2个按键按下时,四个数码管上显示“8051”。当第3个按键按下时,四个数码管上闪烁显示“8051”,当第4个按键按下时,数码管上飞入显示”CDN(H)U”,第5个按键按下时,数码管上使用跑马灯效果显示“HELL0”
时间: 2024-03-11 10:48:39 浏览: 69
好的,以下是基于单片机52共阴极,使用矩阵键盘的代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P1^0; // 定义按键1
sbit key2 = P1^1; // 定义按键2
sbit key3 = P1^2; // 定义按键3
sbit key4 = P1^3; // 定义按键4
sbit key5 = P1^4; // 定义按键5
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 love[] = { // 显示"2015"和"LOVE"的数组
0x3F, 0x06, 0x5B, 0x4F, // 2015
0x38, 0x3F, 0x3F, 0x76, // LOVE
};
uchar code cdnhu[] = { // 显示"CDN(H)U"的数组
0x77, 0x7C, 0x39, 0x5E, // CDN(
0x00, 0x7E, 0x00, 0x00, // H
0x76, 0x38, 0x54, 0x5E // U)
};
uchar code hello[] = { // 显示"HELLO"的数组
0x3E, 0x7F, 0x63, 0x63, // H
0x63, 0x7F, 0x3E, 0x00 // ELLO
};
uchar code display[] = { // 显示"8051"和"8051"闪烁的数组
0x06, 0x5B, 0x4F, 0x7C, // 8051
0x06, 0x5B, 0x4F, 0x7C // 8051
};
uchar keyscan(); // 矩阵键盘扫描函数
void delay(uint x); // 延时函数
void display1(uchar a, uchar b, uchar c, uchar d); // 数码管1显示函数
void display2(uchar a, uchar b, uchar c, uchar d); // 数码管2显示函数
void main() {
uchar i, j = 0, k = 0, flag = 0;
while (1) {
if (key1 == 0) { // 按键1按下
for (i = 0; i < 2; i++) {
display1(love[j], love[j+1], love[j+2], love[j+3]); // 显示"2015"和"LOVE"
display2(love[j], love[j+1], love[j+2], love[j+3]);
delay(500);
j += 4;
if (j == 8) {
j = 0;
}
}
} else if (key2 == 0) { // 按键2按下
display1(display[0], display[1], display[2], display[3]); // 显示"8051"
display2(display[0], display[1], display[2], display[3]);
} else if (key3 == 0) { // 按键3按下
flag = ~flag;
while (key3 == 0); // 等待按键释放
} else if (key4 == 0) { // 按键4按下
for (i = 0; i < 4; i++) {
display1(cdnhu[k], cdnhu[k+1], cdnhu[k+2], cdnhu[k+3]); // 显示"CDN(H)U"
display2(cdnhu[k], cdnhu[k+1], cdnhu[k+2], cdnhu[k+3]);
delay(500);
k += 4;
if (k == 12) {
k = 0;
}
}
} else if (key5 == 0) { // 按键5按下
uchar a = 0, b = 1, c = 2, d = 3;
while (1) {
display1(hello[a], hello[b], hello[c], hello[d]); // 显示"HELLO"
display2(hello[a], hello[b], hello[c], hello[d]);
delay(500);
a++; b++; c++; d++;
if (d == 8) {
a = 0; b = 1; c = 2; d = 3;
}
}
} else {
if (flag) {
display1(display[0], display[1], display[2], display[3]); // 显示"8051"闪烁
display2(display[0], display[1], display[2], display[3]);
delay(500);
display1(0x00, 0x00, 0x00, 0x00);
display2(0x00, 0x00, 0x00, 0x00);
delay(500);
} else {
display1(0x00, 0x00, 0x00, 0x00);
display2(0x00, 0x00, 0x00, 0x00);
}
}
}
}
uchar keyscan() { // 矩阵键盘扫描函数
uchar val = 0xff;
P2 = 0xfe;
_nop_();
if (P2 != 0xfe) {
delay(5);
if (P2 != 0xfe) {
val = P2;
while (P2 != 0xfe);
}
}
P2 = 0xfd;
_nop_();
if (P2 != 0xfd) {
delay(5);
if (P2 != 0xfd) {
val = P2;
while (P2 != 0xfd);
}
}
P2 = 0xfb;
_nop_();
if (P2 != 0xfb) {
delay(5);
if (P2 != 0xfb) {
val = P2;
while (P2 != 0xfb);
}
}
P2 = 0xf7;
_nop_();
if (P2 != 0xf7) {
delay(5);
if (P2 != 0xf7) {
val = P2;
while (P2 != 0xf7);
}
}
return val;
}
void delay(uint x) { // 延时函数
uint i, j;
for (i = 0; i < x; i++) {
for (j = 0; j < 110; j++);
}
}
void display1(uchar a, uchar b, uchar c, uchar d) { // 数码管1显示函数
P0 = table[a];
P2 = 0x01;
delay(2);
P0 = table[b];
P2 = 0x02;
delay(2);
P0 = table[c];
P2 = 0x04;
delay(2);
P0 = table[d];
P2 = 0x08;
delay(2);
}
void display2(uchar a, uchar b, uchar c, uchar d) { // 数码管2显示函数
P0 = table[a];
P2 = 0x10;
delay(2);
P0 = table[b];
P2 = 0x20;
delay(2);
P0 = table[c];
P2 = 0x40;
delay(2);
P0 = table[d];
P2 = 0x80;
delay(2);
}
```
在上述代码中,我们使用了矩阵键盘进行按键输入,通过扫描矩阵键盘的方式来确定按键是否按下,然后根据不同的按键来实现不同的效果。在显示方面,我们使用了两个共阴极的数码管,分别连接到单片机的8个IO口上,通过控制这些IO口的高低电平来实现数码管的显示效果。
阅读全文