数码管驱动方式:
单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间
专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可
动态数码管的显示与静态数码管显示原理相同,但需要对数码管进行 消影
为什么要消影?
因为程序的运行时,位选 段选 位选 段选 位选 段选
因为单片机运行速度很快当下一个位选发生时,上一刻的段选就会发生串位问题到下一个的段选。因此必须要进行消影。
解决的办法:
位选 段选 延时 清零 位选 段选 延时 清零 位选 段选 延时 清零
#include <REGX52.H>
unsigned char shumatable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Delay(unsigned char xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Shuma(unsigned char Location,Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=shumatable[Number];
Delay(1);
P0=0x00;// 消影
}
void main()
{
while(1)
{
Shuma(1,1);
// Delay(20);
Shuma(2,2);
// Delay(20);
Shuma(3,3);
// Delay(20);
}
}