需要注意的是这里的数码管采用的是共阴极数码管,
将所有数码管的段码线并联在一起,即共用段码线,位选线独立,最终由位选线来控制是哪一位数码管显示。
动态扫描显示:轮流向各数码管送出段码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示,需要不停刷新显示。
动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。 同时要注意消影。
上图的Y7C控制段选,Y6C的控制位选
这里举个例子来理解动态显示
#includevoid Conversion(u8 *buf,u8 *duanma) { u8 i,j=0,temp; for(i=0;i<8;i++,j++) { switch(buf[j]) { //根据要显示的字符获取共阳极数码管编码 case '0': temp = 0xc0; break; case '1': temp = 0xf9; break; case '2': temp = 0xa4; break; case '3': temp = 0xb0; break; case '4': temp = 0x99; break; case '5': temp = 0x92; break; case '6': temp = 0x82; break; case '7': temp = 0xf8; break; case '8': temp = 0x80; break; case '9': temp = 0x90; break; case 'A': temp = 0x88; break; case 'B': temp = 0x83; break; case 'C': temp = 0xc6; break; case 'D': temp = 0xA1; break; case 'E': temp = 0x86; break; case 'F': temp = 0x8E; break; case 'H': temp = 0x89; break; case 'L': temp = 0xC7; break; case 'N': temp = 0xC8; break; case 'P': temp = 0x8c; break; case 'U': temp = 0xC1; break; case '-': temp = 0xbf; break; case ' ': temp = 0xff; break; default: temp = 0xff; } if(buf[j+1]=='.') { temp = temp&0x7f; j++; } duanma[i] = temp; } } void display(u8 *duanma,u8 position) { P0 = 0xFF;//段码消影 P2 = (P2&0x1F)|0xE0;//允许段码更新 P2 &= 0x1F; P0 = 1< smg.h #ifndef __smg_H__ #define __smg_H__ void Conversion(u8 *buf,u8 *duanma); void display(u8 *duanma,u8 positon); #endifconfig.h#ifndef __CONFIG_H__ #define __CONFIG_H__ #include#include #include #define u8 unsigned char #define u16 unsigned int #define u32 unsigned long #endif



