一.补充知识点
1.动态数码管的消隐(鬼影),跳转至http://t.csdnimg.cn/sTx7G
二.基本代码
#include <REGX52.H>
typedef unsigned char u8;
u8 dat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};//共阳数码管码表
// dat[]={0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,A ,B ,C ,D ,E ,F ,- ,. }
void Delay(u8 c) //@12.000MHz延时函数
{
unsigned char data i, j;
while(c)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
c--;
}
}
void pos(int a,b,c,d)//第一个为38译码器,第二个为位选,第三个为38译码器,第四个为段选
{
switch(a)
{
case 6:
P2_7=1; P2_6=1; P2_5=0;break;
case 7:
P2_7=1; P2_6=1; P2_5=1;break;
}
switch(b)
{
case 1: P0=0X01;break;//0000 0001
case 2: P0=0X02;break;//0000 0010
case 3: P0=0X04;break;//0000 0100
case 4: P0=0X08;break;//0000 1000
case 5: P0=0X10;break;//0001 0000
case 6: P0=0X20;break;//0010 0000
case 7: P0=0X40;break;//0100 0000
case 8: P0=0X80;break;//1000 0000
case 9: P0=0Xff;break;//1111 1111
}//从1到8,数码管是从左到右显示
//决定位选,由于是共阳极数码管
switch(c)
{
case 6:
P2_7=1; P2_6=1; P2_5=0;break;
case 7:
P2_7=1; P2_6=1; P2_5=1;break;
}
P0=dat[d];
Delay(1);//延时1ms,让数码管显示一段时间,避免数码管显示变暗
P0=0x00;
}
void main()
{
int i,j;
while(1)
{
for(i=1,j=0;i<=8;i++,j++)//8个数码管同时显示0~7
{
pos(6,i,7,j);
}
}
}
三.任务
1.通过动态数码管实现十进制加法(定时器)
参考资料:共阳数码管码表http://t.csdnimg.cn/Of2Q0