动态显示实质上就是轮流点亮单个数码管实现多位数码管整体显示的效果
在轮流显示过程中,每位数码管点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
题目:前面4位显示年份2018,接着2位是分隔符,最后两位是月份,从1月份开始,每隔一段时间加1个月,到12月之后又从1月开始递增,如此往复。
#include "reg52.h"
unsigned char yue =1;
unsigned char code SMG_duanma[18]= //code 是表格形式
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
void DisplaySMG_Bit(unsigned char value,unsigned char pos)
{
SelectHC573(6);
P0 = 0x01 << pos;
SelectHC573(7);
p0 = value;
}
void DelaySMG(unsigned int t)
{
while(t--);
}
void Display_Dynamic()
{
/* 前4位数码管 */
DisplaySMG_Bit(SMG_duanma[2],0);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[0],1);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[1],2);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[8],3);
DelaySMG(500);
/* 2个分隔符 */
DisplaySUM_Bit(SMG_duanma[16],4);
DelaySMG(500);
DisplaySUM_Bit(SMG_duanma[16],5);
DelaySMG(500);
/* 月份 */
DisplaySUM_Bit(SMG_duanma[yue/10],6);
DelaySMG(500);
DisplaySUM_Bit(SMG_duanma[yue%10],7);
DelaySMG(500);
}
void Delay(unsigned char t)
{
while (t--)
{
Display_Dynamic();
}
}
void main()
{
while (1)
{
Display_Dynamic();
yue++
if(yue>12)
{
yue=1;
}
Delay(100);
}
}
学到这节我觉得基本就要记住一些基础的代码
比如说选通道的函数SelectHC573(unsigned char channel){};
数码管控制函数DisplaySMG_Bit(unsigned char value,unsigned char pos){};
延时函数Delay(unsigned char t){};
一定要记得每次显示完要加延时函数!!!!
还有就是动态显示里有两个延时函数,其中比较特殊的是Delay,这个是用来延时月份的动态变化的,所以其函数内容是动态显示函数;