1 动态数码管:动态显示是利用减少段选线,分开位选线,利用位选线不同时选择通断,改变段选数据来实现的。
2 功能要求:控制动态数码管从左至右显示数字 0-7。
3 硬件设计
4 软件设计
smg_dynamic.c1 #include "reg52.h" //建立软件与单片机硬件的连接关系 2 3 typedef unsigned int u16; //对系统默认数据类型进行重定义 4 typedef unsigned char u8; 5 6 #define SMG_SEG P0 //使用宏定义数码管段选信号端口 7 8 sbit LSA = P2^2; //定义数码管位选信号控制管脚,38译码器 9 sbit LSB = P2^3; 10 sbit LSC = P2^4; 11 12 //共阴数码管显示0-F的段码数据 13 u8 smg_code[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 14 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 15 16 void delay_10us(u16 ten_us) 17 { 18 while(ten_us--); 19 } 20 21 void smg_display(void) 22 { 23 u8 i = 0; 24 for(i=0;i<8;i++) 25 { 26 switch(i) 27 { 28 case 0 : LSC = 1; LSB = 1; LSA = 1; break; 29 case 1 : LSC = 1; LSB = 1; LSA = 0; break; 30 case 2 : LSC = 1; LSB = 0; LSA = 1; break; 31 case 3 : LSC = 1; LSB = 0; LSA = 0; break; 32 case 4 : LSC = 0; LSB = 1; LSA = 1; break; 33 case 5 : LSC = 0; LSB = 1; LSA = 0; break; 34 case 6 : LSC = 0; LSB = 0; LSA = 1; break; 35 case 7 : LSC = 0; LSB = 0; LSA = 0; break; 36 } 37 SMG_SEG = smg_code[i]; //传送段选数据 38 delay_10us(100); //延时一段时间(约1ms),等待显示稳定 39 SMG_SEG = 0x00; //消影,先关闭段选端,待位选端稳定后(中间状态),再打开段选 40 } 41 } 42 43 void main() 44 { 45 while(1) 46 { 47 smg_display(); //8个数码管依次点亮,不断循环 48 } 49 }
5 实验现象
使用USB线将开发板和电脑连接成功后(电脑能识别开发板上CH340串口),把编译后产生的.hex文件烧入51单片机芯片内,实现现象如下:数码管上从左向右依次显示01234567。
6 参考资料:
(1)普中51单片机课程。