打印

74hc164test

[复制链接]
1204|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
/****************************************************
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

pic.JPG (191.63 KB )

pic.JPG

74hc164.pdf

143.79 KB

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝