这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 74HC595驱动数码管

共1条 1/1 1 跳转至

74HC595驱动数码管

助工
2014-10-15 20:10:46     打赏

.概述


数码管的驱动分静态扫描和动态扫描两种,使用最多的是动态扫描,优点是使用较少的MCU的IO口就能驱动较多位数的数码管。数码管动态扫描驱动电路很多,其中最常见的是74HC164驱动数码管,这种电路一般用三极管作位选信号,用74HC164作段选信号,占用的MCUIO口线随位数增加而增加,一般驱动四位以下数码管。如果要驱动四位以上数码管,用74HC595驱动最经典,只需4IO口线就能驱动8位数码管,而且不存在消影问题,显示功能也很强大,是很实用的数码管驱动电路之一。


.电路设计


WSF-51DB开发板上,用两片74HC595驱动8位共阴极数码管(由两个4位共阴极数码管组成),一片作位选信号,另一片作段选信号。需要注意的是段选芯片与数码管的连接要使用100-200欧姆电阻作限流,不能太大也不能太小,更不能直接连接。


 


 


 


    三.程序设计


/**************************************************************************


*程序名称:74HC595驱动数码管


*程序功能:数码管显示字符




* MCU型号:AT89S52-24PU


*时钟频率:12MHZ




**************************************************************************/


#include<reg52.h>


unsigned char code segmcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,


                           0x77,0x7C,0x39,0x5E,0x79,0x71};//共阴极数码管段码0-f


unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};


                                                                                     //8位共阴极数码管位码


sbit ser=P2^0; //74HC595串行数据输入


sbit oe=P2^1;  //74HC595使能,为0时输出数据,为1时呈高阻态


sbit rclk=P2^2; //74HC595数据锁存


sbit srclk=P2^3;// 74HC595串行时钟


 


//延时毫秒函数:


void Delayms(unsigned int t)


{


         unsigned int x,y;


         for(x=t;x>0;x--)


                for(y=120;y>0;y--);//延时大约1毫秒


}


 


//任意位数码管显示一个字符函数:


void DTDisplayChar(unsigned char segmd,unsigned char bitd )//数码管段码和数码管位码


{


        unsigned char i;


        unsigned int dat;


        dat=bitd;


        dat=dat<<8|segmd; //位码段码合并为一个int型数据


        for(i=0;i<16;i++)//16位数据从高位依次移入74HC595


        {


                 ser=(dat&0x8000)?1:0; //判断最高位,为真取1,为假取0


                 srclk=1;    //上升沿送数据


                 srclk=0;


                 dat<<=1;   //左移取下一位


        }


        rclk=1;  //74HC595锁存数据


        rclk=0; 


}


 


//主函数:


int main(void)


{


        unsigned char j,k;


        oe=0; rclk=0;srclk=0;


        DTDisplayChar(0xff,0x00);//数码管全亮


        Delayms(2000);//延时2秒,检查数码管是否有缺画


        while(1)


        {


                 for(j=0;j<16;j++)//逐个显示0-f  16个字符


                 {


                        DTDisplayChar(segmcode[j],bitcode[j%8]);//从数组取出段码和位码


                                                               //要显示小数点只需在断码上或上0x80即可


                       for(k=0;k<5;k++) /每个字符/闪烁5


                        {


                              oe=0;//打开显示


                              Delayms(200);//延时200毫秒


                              oe=1;//关闭显示


                              Delayms(200);


                        }


                 }


              /*  for(j=0;j<8;j++)//0-7字符同时显示


                 {


                          DTDisplayChar(segmcode[j],bitcode[j]);//从数组取出段码和位码


                          Delayms(1);


                 }  */


        }


        return 0;


}


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]