51或者STM32开发中,我们在很多时候都会使用到数码管,数码管的刷新会占用很大的时间资源,少数的数码管不影响系统的运行,但如果数码管过多,刷新这一工作势必会影响系统的运行,下面来介绍一种芯片方案,单片机只需向芯片写入要显示的数字即可,不需要CPU自己来做动态刷新的工作。
#include <reg52.h>
#include <intrins.h>
#define u8 unsigned char
#define uint unsigned int
sbit DIN = P2^0;
sbit LOAD = P2^1;
sbit CLK = P2^2;
u8 Disp_Buffer[8]={2,0,0,9,10,8,10,9};
void DelayMS(uint x)
{
u8 t;
while(x--)
{
for(t=120;t>0;t--);
}
}
/向第 Num_Addr 片 7219 的 Addr 寄存器写入一个 Dat 数据
void Write(u8 Num_Addr,u8 Addr,u8 Dat)
{
u8 i,j;
LOAD = 0;
for(i=0;i<8;i++)
{
CLK = 0;
if(Addr&0x80)
DIN=1;
else
DIN=0;
Addr <<= 1;
CLK = 1;
_nop_();
_nop_();
CLK = 0;
}
for(i=0;i<8;i++)
{
CLK = 0;
if(Dat&0x80)
DIN=1;
else
DIN=0;
Dat <<= 1;
CLK = 1;
_nop_();
_nop_();
CLK = 0;
}
for(i=0;i<Num_Addr;i++)
{
for(j=0;j<16;j++)
{
CLK = 0;
DIN = 0;
CLK = 1;
_nop_();
_nop_();
CLK = 0;
}
}
LOAD = 1;
}
void Initialise7219()
{
Write(0x00,0x09,0xff);
Write(0x00,0x0b,0x07);
Write(0x00,0x0c,0x01);
Write(0x00,0x0a,0x07);
Write(0x01,0x09,0xff);
Write(0x01,0x0b,0x07);
Write(0x01,0x0c,0x01);
Write(0x01,0x0a,0x07);
}
void main()
{
u8 i;
Initialise7219();
DelayMS(1);
for(i=0;i<8;i++)
{
Write(0x00,i+1,Disp_Buffer[i]);
}
Write(0x01,1,Disp_Buffer[0]);
Write(0x01,2,11);
Write(0x01,3,12);
Write(0x01,4,13);
Write(0x01,5,14);
while(1);
}