51单片机 数码管的静态显示和动态显示
数码管(Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。
数码管原理图:
数码管共阴极接法:
数码管共阳极接法:
数码管中有位选和段选,位选就是选择哪个数码管,段选就是被选择的数码管要显示什么数字!
根据数码管的段选,可以总结出数码管的显示数据表:
符号
不显示
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
.
编码
0x00
0x3F
0x06
0x5B
0x4F
0x66
0x6D
0x7D
0x07
0x7F
0x6F
0x77
0x7C
0x39
0x5E
0x79
0x71
0x80
数码管的静态显示:
/*======================================================*/ /* 时间:2015年8月3日 21:19:03 */ /* 功能:数码管的静态显示 */ /* 目的:51单片机学习 */ /* ^_^……! */ /*======================================================*/ #include #include "commLib.h" sbit WLE = P2^7; // 位选 sbit DLE = P2^6; // 段选 #define DIGITAL_ARR_NUM 18 unsigned char code digital[DIGITAL_ARR_NUM] = { // 数码管显示数据表 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, */ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, /* 9, A, B, C, D, E, F, ., 不显示 */ 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x80, 0x00 }; int main(void) { unsigned int i; // 位选 WLE = 1; // 位选端锁存器置高,送数据 P0 = 0xC0; // 送数据 WLE = 0; // 位选端锁存器置低,保存数据 while(1) { for (i = 0; i < DIGITAL_ARR_NUM; i++) { // 段选 DLE = 1; // 段选端锁存器置高,送数据 P0 = digital[i]; // 送数据 DLE = 0; // 位选端锁存器置低,保存数据 delay(500); // 延时500ms } } return 0; }
效果截图:
数码管的动态显示:/*======================================================*/ /* 时间:2015年8月6日 20:45:09 */ /* 功能:数码管的动态显示 */ /* 目的:51单片机学习 */ /* ^_^……! */ /*======================================================*/ #include #include "commLib.h" sbit WLE = P2^7; // 位选 sbit DLE = P2^6; // 段选 #define DIGITAL_ARR_NUM 18 unsigned char code digital[DIGITAL_ARR_NUM] = { // 数码管显示数据表 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, */ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, /* 9, A, B, C, D, E, F, ., 不显示 */ 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x80, 0x00 }; int main(void) { unsigned int i; while (1) { for (i = 0; i < 6; i++) { P0 = 0xFF; // 消影(必须有) WLE = 1; // 位选端锁存器置高,送数据 P0 = ccCrol(0xFE, i); // 送数据 WLE = 0; // 位选端锁存器置低,保存数据 DLE = 1; // 段选端锁存器置高,送数据 P0 = digital[i]; // 送数据 DLE = 0; // 位选端锁存器置低,保存数据 delay(1); } } return 0; }
效果截图: