假设为P0
每个锁存器有1个锁存信号L,需占用两条IO线,假设分别接 P1.6和P1.7
由于是动态扫描显示,所以显示函数调用时要放在弊洞铅WHILE或FOR循环中反复运行,才能看见结果
程序如下:
#include<reg52.h>
sbit dula=P1^6//段锁存信号
sbit wela=P1^7//位锁存信号
#define uchar unsigned char
void delay(i)
{
for(j=ij>0j--)
for(k=125k>0k--)
}
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}
void display(uchar qian_c,uchar bai_c,uchar shi_c,uchar ge_c)//4位显示程序
{
P0=table[qian_c] //显示千位
dula=1
dula=0
P0=0xfe
wela=1
wela=0
delay(2)
P0=table[bai_c] //显示百位
dula=1
dula=0
P0=0xfd
wela=1
wela=0
delay(2)
P0=table[shi_c] //显示十位
dula=1
dula=0
P0=0xfb
wela=1
wela=0
delay(2)
P0=table[ge_c] //显示个位
dula=1
dula=0
P0=0xf7
wela=1
wela=0
delay(2)
P0=xff //显示完毕后关闭所有位显示,也可租好不要,但退出显示程序时会留尾巴,即最后一个数码管还在显示
wela=1
wela=0
}
void main( )
{
...../颤嫌/其它代码
while(1)
{
display(b1,b2,b3,b4)//调用显示函数
.....//其它代码,不能占用CPU太多时间,否则显示闪烁
}
}
#include <reg52.H> //STC头文件#define uchar unsigned char
#define uint unsigned int
#define timewe 3
sbit we = P2^7
sbit du = P2^6
unsigned long temp
uint 埋困jsms=0
uchar code duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}
uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}
void delay (uint a) // 1ms延时程序(12MHz 10倍于51单片机速度时)
{
uint i
while( --a != 0)
{
for(i = 0 如樱i < 600 i++)
}
}
uchar disbuf[6]
void display()
{ uchar 渣液丛code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}
static uchar a
if(a>=6)a=0
we=1
P0=0xff
we=0
du=1
P0=duan[disbuf[a]]
du=0
we=1
P0=wei[a]
we=0
a++
}
/**********************************************/
/* 主函数 */
/**********************************************/
void main(void)
{
temp=0
while(1)
{
if(++jsms>=1000){
if(++temp == 999999)
temp = 0
}
disbuf[0] = temp/100000
disbuf[1] = temp%100000/10000
disbuf[2] = temp%10000/1000
disbuf[3] = temp%1000/100
disbuf[4] = temp%100/10
disbuf[5] = temp%10
display()
delay(1)
}
}
位选和段选的程序,是根据锁存器的工作原理来编的一般的锁存器如74LS373或森宴573是在锁存引脚高电平时,8个输入端和8个输出端直此蔽银通,在下降沿时数据被锁存,所以程序中每送一次数据就有
wela=1
wela=0
或 dula=1
dula=0
由于是动态扫描,并亮实际上是一位一位轮换显示,所以每次数码管只亮一个
如 P0=0xbf 化成二进制1011 1111
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)