独立按键控制LED数码管
前言
通过1个独立按键,控制LED数码管显示字符。
结合之前我的两篇文章
-
独立按键控制LED流水灯方向 https://www.cnblogs.com/luckydoog/p/18796974
效果

原理
提前在程序里存储共阴极数码管的编码表,能表示的字符范围为
0-9,A,B,C,D,E,F,H,L,N,U,P,O,-
用数组存储这些字符对应的 P0 的编码
然后根据独立按键,改变数组下标,就可以达到改变数码管显示的字符的效果了。
共阴极数码管编码表
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00 //熄灭
};
遇到点问题

报错是说找不到 nop 这个指令的声明
其实 nop 空操作 8051 NOP 指令 是定义在 INTRINS.H 这个头文件里的
加上头文件 #include <INTRINS.H> 就OK了
完整代码
#include <REGX52.H>
#include <INTRINS.H>
unsigned char data_total = 23;
unsigned char led_data[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00
};
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay(int t){
int i = 0;
for(i=0;i<t;i++){
Delay1ms();
}
}
void main()
{
unsigned char data_pos = 0;
P2_2 = 0;
P2_3 = 0;
P2_4 = 0;
P0 = led_data[data_pos];
while(1){
if(0 == P3_1){
Delay(10);
while(0 == P3_1){
//nop
}
Delay(10);
data_pos++;
if(data_total == data_pos){
data_pos = 0;
}
P0 = led_data[data_pos];
}
Delay(500);
}
}

浙公网安备 33010602011771号