/****************************************************
74hc164是一个串入并出移位寄存器,可以用来驱动数码管,但由于
它的输出端没有锁存器,所以串行移位的过程就是输出端不断输出
的过程.有些朋友说在输出过程中数码管会闪烁,为此,笔者专门做
了试验,基本看不出闪烁.下面介绍一下试验过程.
笔者采用四个一位数码管和四个74hc164芯片,静态显示.R1和R2是
两个跳线.插针P1是输入口,从左到右分别定义为VCC,GND,DAT和CLK.
P2定义与P1一样,它是输出口,用于级连.我就是级连了两个四位数
码管显示8位数字.
笔者分别试验了共阳和共阴数码管,采用两种驱动方式.一种是普通
I/O口方式;另一种是串口方式0.
74hc164移位寄存器移位时高位在前,在用普通I/O口进行移位操作时
没有问题.在用串口方式0时,由于串口方式0移位是低位在前,所以数
码表的编码与用普通I/O口进行移位操作时的编码不同.如:共阳普通
I/O口数字0的编码是0xC0(11000000b),而共阳串口数字0的编码是
0x03(00000011b).
下面是笔者的试验测试代码.
笔者用的是STC89C52RC单片机,11.0592M晶振.P1分别接VCC,GND,
P3^0和P3^1.串口方式必须用这两个I/O口,普通I/O口也用这两个口.
****************************************************/
#include <reg52.h>
#include "zh_type.h"
/* table0[]: 共阴,普通I/O口 */
uint8 code table0[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/* table1[]: 共阳,普通I/O口 */
uint8 code table1[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/* table2[]: 共阴,串口 */
uint8 code table2[]=
{0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
/* table3[]: 共阳,串口 */
uint8 code table3[]=
{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
#define SERAIL_PORT
#ifdef SERAIL_PORT //串口方式0
void initUart(); //函数声明,初始化串口
//主函数
void main()
{
uint8 a[8];
uint8 i;
initUart();
for(i=0;i<8;i++) //发送8个数字
{
a[i]=table2[i];
SBUF=a[i];
}
ES=0; //关闭串口中断
EA=0; //关总中断
while(1);
}
//初始化串口
void initUart()
{
SCON=0; //串口方式0
EA=1; //开总中断
ES=1; //开串口中断
TI=0; //清发送中断标志
}
//串口中断处理函数
void ser() interrupt 4
{
TI=0; //清发送中断标志
}
#else
/*位定义*/
sbit send=P3^0;
sbit clk=P3^1;
void Display(uint8*,uint8); //显示函数声明
/*主函数*/
void main()
{
uint8 i;
uint8 a[8];
for(i=0;i<8;i++)
a[i]=i;
Display(a,8);
while(1);
}
/*显示程序*/
void Display(uint8* buff,uint8 cnt)
{
uint8 i,j,dis;
for(i=0;i<cnt;i++) //外循环,发送8个数
{
buff[i]=table0[buff[i]]; //译码
dis=buff[i];
for(j=0;j<8;j++) //内循环,发送1个数的8位
{
clk=0;
dis<<=1;
send=CY;
clk=1;
}
}
}
#endif
|