#数码管灯显示#
常用字符0~9
与HC573的关联

数码管段选位选原理图
结果:可以控制亮的数码管的个数,但是亮的数码管的数值都是一样的

动态数码管编写
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;
//code 不变的值
code uchar seqment[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
void hc573(uchar channel)
//573全部功能
//4(100)→led
//5(101)→蜂鸣器与继电器
//6(110)→数码管控制阳极
//7(111)→数码管控制阴极
{
switch(channel)
{
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
}
//led和蜂鸣器初始化
void init()
{
hc573(4);
P0=0XFF;
hc573(5);
P0=0X00;
}
//延时
void delay_ms(uint xms)
{
for( ;xms>0;xms--)
{
unsigned char data i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
//数码管设置,显示日期
void seg(uchar i,uint num)
{
hc573(7);
P0=0X00;
//阳极Y6为1,一个一个显示,时间短暂,位置一个一个变化
hc573(6);
P0=0X01<<(i-1);//选择第几个亮
hc573(7);
P0=seqment[num];
delay_ms(1);
}
//数码管显示
void display()
{
seg(1,2);
seg(2,0);
seg(3,2);
seg(4,4);
seg(5,0);
seg(6,6);
seg(7,2);
seg(8,9);
}
void main()
{
init();
while(1)
{
display();//数组使用
}
}
其中的数码管函数显示定义
⑧做一个计时器,数码管从0往上加,每次加一,时间间隔为一秒,加到100归0,循环过程
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
//定义
sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;
//数码管
code smg_number[]={0xc0, 0xf9,0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80,0x90,0xbf,0x7f};
//时间变量
uint time;
uchar count;//计数
//hc573定义
void hc573(uint channel)
{
switch(channel)
{
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
}
//初始化
void init()
{
hc573(4);
P0=0XFF;
hc573(5);
P0=0X00;
}
void delay_ms(uchar xms) //@12.000MHz
{
for( ;xms>0;xms--)
{
unsigned char data i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
//数码管位选
void smg(uchar pos,seg)
{
hc573(7);
P0=0Xff;//消隐
hc573(6);
P0=0X01<<(pos-1);//数码管位选
hc573(7);
P0=smg_number[seg];//数码管段选
delay_ms(1);
}
//数码管计时
void display()
{
smg(1,time/1000);//取一位开头整数,千分位
smg(2,time/100%10);//取俩位开头整数,取俩位整数的末位为百分位
smg(3,time%100/10);//取末尾俩位整数,取俩位整数的开头,为十分位
smg(4,time%10);//取末位数字,为个位
}//执行250 次,就是一秒钟1000ms除以4位数字,就是250
//主函数
void main()
{
init();
while(1)
{
display();
}
}
#经过烧录我们可以发现,根手机显示时间还有差异,对于延时函数的使用也很占用空间,这就引出了后来的定时器使用#