一 数码管的动态显示(软件篇)
1 书写代码1
我们要在这个数码管上面显示我们的所想要的数字
#include <STC89C5xRC.H>
// #define SMG_EN
typedef unsigned char u8;
typedef unsigned long u32;
//0~9数字的编码
static u8 codes[10]={
0x3F,
0x06,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x07,
0x7F,
0x6F
// 0x3F → 00111111
// 0x06 → 00000110
// 0x5B → 01011011
// 0x4F → 01001111
// 0x66 → 01100110
// 0x6D → 01101101
// 0x7D → 01111101
// 0x07 → 00000111
// 0x7F → 01111111
// 0x6F → 01101111
};
u8 buffer[8];
//pos表示的位位置 numcode表示的位数字
void digital(u8 pos, u8 numcode){
//位选
//p22 p23 p24是改变这个位置的
//p2 = 110 111 11
//pos = 0000 0011(后面三位是0~7),把后面三位赋予到中间的101
// 110 111 11
// 000 011 00(position左移两位)
pos<<=2;
//p1 &= 111 000 11
P2 &= 0xe3;
P2 |= pos;
// P22 = 0;
// P23 = 0;
// P24 = 0;
//段选
P0 = numcode;
}
void digitalnum(u32 num){
//残留问题的解决
u8 i;
for(i = 0; i < 8; i++){
buffer = 0x00;
}
i = 7;
while(num > 0){
buffer = codes[num%10];
num /= 10;
i--;
}
}
//动态扫描
void digitalfresh(){
u8 i;
//for循环里面不可以定义变量
for(i = 0; i < 8; i++){
digital(i, buffer);
}
}
void main(){
digitalnum(12345);
while(1){
digitalfresh();
}
}
逻辑的分析
(1) 显示数字函数
void digitalnum(u32 num)
这个函数就是表示为我们不断地把这个数字分段分到这个数组里面,直到这个数字分到0位置,这个数字为0,就要进行特殊处理。
(2) 刷新数字函数
void digitalfresh()
这个函数是不断地更新这个数字到这个屏幕上面,然后时间很短,就显示出了一个稳定地数字在屏幕上,因为肉眼捕捉不到。
但是这个代码还是不是特别好因为会有残影,是下面这样的
(3) 残生残影的原因
位选
pos<<=2;
P2 &= 0xe3;
P2 |= pos;
段选
P0 = numcode;
这个残影产生的原因是当进入第一个位置赋值的时候,先进行位选,然后再进行段选,当我进行段选之后,段选是1的二进制编码,然后当进行下一次的位选的时候,由于进行完下一次位选之后,我的段暄还是保持之前的段选1,那么就会在这里留下残影,这个是我们需要去解决的问题。
2 优化代码
为了解决上面的那一个代码,现在选择优化代码。
#include <STC89C5xRC.H>
// #define SMG_EN
typedef unsigned char u8;
typedef unsigned long u32;
//0~9数字的编码
static u8 codes[10]={
0x3F,
0x06,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x07,
0x7F,
0x6F
// 0x3F → 00111111
// 0x06 → 00000110
// 0x5B → 01011011
// 0x4F → 01001111
// 0x66 → 01100110
// 0x6D → 01101101
// 0x7D → 01111101
// 0x07 → 00000111
// 0x7F → 01111111
// 0x6F → 01101111
};
u8 buffer[8];
//pos表示的位位置 numcode表示的位数字
void digital(u8 pos, u8 numcode){
//位选
//每一赋值关掉上一位
P0 = 0x00;
pos<<=2;
//p1 &= 111 000 11
P2 &= 0xe3;
P2 |= pos;
// P22 = 0;
// P23 = 0;
// P24 = 0;
//段选
P0 = numcode;
}
void digitalnum(u32 num){
//残留问题的解决
u8 i;
for(i = 0; i < 8; i++){
buffer = 0x00;
}
i = 7;
while(num > 0){
buffer = codes[num%10];
num /= 10;
i--;
}
}
//动态扫描
void digitalfresh(){
u8 i;
//for循环里面不可以定义变量
for(i = 0; i < 8; i++){
digital(i, buffer);
}
}
void main(){
digitalnum(12345);
while(1){
digitalfresh();
}
}
但是这还是会存在一个问题,0赋值不可以,因为num循环逻辑为num>0,那么就是我们num赋值为0的话,就会导致错误。
void digitalnum(u32 num){
//残留问题的解决
u8 i;
for(i = 0; i < 8; i++){
buffer = 0x00;
}
if(num == 0){
buffer[7] = codes[0];
return;
}
i = 7;
while(num > 0){
buffer = codes[num%10];
num /= 10;
i--;
}
}
这样就十分完美了
————————————————
版权声明:本文为CSDN博主「一只自律的鸡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2401_86738532/article/details/151762520
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|