前言
通过1个独立按键,控制LED数码管显示字符。
结合之前我的两篇文章
-
独立按键控制LED流水灯方向 https://www.cnblogs.com/luckydoog/p/18796974
-
数码管静态显示 https://www.cnblogs.com/luckydoog/p/18797690
效果
原理
提前在程序里存储共阴极数码管的编码表,能表示的字符范围为
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);}
}