📄 doc3.c
字号:
/*-------------------------------LED数码管显示实验说明------------------------------------------------------------------------------
[程序名称] LED.C
[程序作用] 实现8个8段数码管的扫描显示
[程序作者] 鞠春阳
[版权所有] 鞠春阳
[创建时间] 2006年04月16日
[疑问解答] http://www.qqmcu.com
[技术支持] http://www.qqmcu.com/bbs
[本人E-mail] jcygood@163.com
[本人QQ] 383547
[实验板购买方式及详情请访问:www.qqmcu.com]
QQ单片机实验板上使用的是共阴极的数码管,其8个公共端连接在P2.0-P2.7口上,每个数码管的8个段分别连接在P0.0-P0.7口上
当某个数码管的公共端为“0”时,那么这个数码管被选中,这时此数码管的哪段为”1“则哪段就被点亮
初学者可以利用本实验板自带的仿真器功能来单步执行,来观察数码管的工作原理,
由于I/O资源有限,一个51单片机只有32个I/O所以只能将8个数码管以动态扫描的方式来显示,何为动态扫描呢?
动态扫描的连接方式是将8个数码管的8个段用相同的I/O来控制,即第一个数码管的”a“段由P0.0控制第二个数码管的”a“段也是由P0.0来控制的
而8个数码管的公共端则是由不同的I/O来控制,即第一个数码管的公共端由P2.4控制而第二个数码管的公共端有P2.5控制
动态扫描的控制原理是:将第一个数码管要显示的内容显示出来,然后立刻将第二个数码管的内容显示出来,一次把第8个数码管的内容显示出来
由于单片机的工作速度非常快,所以当显示第8个数码管的时候第一个数码管的内容还没有完全消失,这时立刻重复上面的过程,就实现了数码管的
动态扫描显示
以下是QQ单片机实验板上各I/O口与数码管各段的对应关系及数字的编码原理
a I/O口: P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
--- 数码管各段: h g f e d c b a
f| g |b 1: 0 0 0 0 0 1 1 0 0x06;
--- 2: 0 1 0 1 1 0 1 1 0x5B;
e| | c 3: 0 1 0 0 1 1 1 1 0x4F;
--- .h 4: 0 1 1 0 0 1 1 0 0x66;
d 5: 0 1 1 0 1 1 0 1 0x6D;
6: 0 1 1 1 1 1 0 1 0x7D;
7: 0 0 0 0 0 1 1 1 0x07;
8: 0 1 1 1 1 1 1 1 0x7F;
9: 0 1 1 0 1 1 1 1 0x6F;
0: 0 0 1 1 1 1 1 1 0x3F;
=====================================如需转载请保留以上信息,并通知作者=============================================================*/
#include "reg51.h"
//分别从0-9的数码编码,注意此编码只适合QQ单片机实验板,其他电路板上的编码请参考上面的算法自行计算。
unsigned char code Num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//最简单的延时程序
delay(unsigned int i)
{
while(i--);
}
//QQ单片机私有函数,在其他的电路板上可能会不好使
//在8个数码管上显示任意字符,字符内容由8个参数LED1--LED8决定 如果显示的字符为空,则不对这一个数码管进行扫描以缩短扫描时间
ShowAny(unsigned char LED1,unsigned char LED2,unsigned char LED3,unsigned char LED4,unsigned char LED5,unsigned char LED6,unsigned char LED7,unsigned char LED8)
{
if(LED1) { P2=0xEF; P0=LED1; delay(100); }
if(LED2) { P2=0xDF; P0=LED2; delay(100); }
if(LED3) { P2=0xBF; P0=LED3; delay(100); }
if(LED4) { P2=0x7F; P0=LED4; delay(100); }
if(LED5) { P2=0xFE; P0=LED5; delay(100); }
if(LED6) { P2=0xFD; P0=LED6; delay(100); }
if(LED7) { P2=0xFB; P0=LED7; delay(100); }
if(LED8) { P2=0xF7; P0=LED8; delay(100); }
}
//QQ单片机私有函数,在其他的电路板上可能会不好使
//右队齐显示一个整型数(0-65535)
ShowNum(unsigned int Number)
{
unsigned char b1=0,b2=0,b3=0,b4=0,b5=0;
b1=Number/10000; //分别将要显示的数的万位到个位放在b1-b5这5个变量中
b2=Number/1000%10;
b3=Number/100%10;
b4=Number/10%10;
b5=Number%10;
if(Number>9999) //如果这个数的万位上没有数则不显示
{
ShowAny(0,0,0,Num[b1],Num[b2],Num[b3],Num[b4],Num[b5]);
}
else if(Number>999) //如果这个数的千位上没有数则不显示
{
ShowAny(0,0,0,0,Num[b2],Num[b3],Num[b4],Num[b5]);
}
else if(Number>99)
{
ShowAny(0,0,0,0,0,Num[b3],Num[b4],Num[b5]);
}
else if(Number>9)
{
ShowAny(0,0,0,0,0,0,Num[b4],Num[b5]);
}
else if(Number>0)
{
ShowAny(0,0,0,0,0,0,0,Num[b5]);
}
else
{
ShowAny(0,0,0,0,0,0,0,Num[0]);
}
}
main()
{
while(1) //循环扫描显示要显示的内容
{
ShowNum(234);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -