搜索
bottom↓
回复: 11

两片74HC595级联动态驱动8位数码管 51单片机

[复制链接]

出0入0汤圆

发表于 2013-3-29 12:29:46 | 显示全部楼层 |阅读模式
本帖最后由 Stone_up 于 2013-3-29 12:30 编辑

功能 : 用2片74HC595驱动8位数码管, 级联的最低1片595控制位选,那么第一片控制段选
时间 : 2013-3-28 21:11:59
作者 : Stone
版本 : REV1
平台 : STC89C52   11.0592MHz
现象 : 8位数码管从第一位开始从0计数,满10进位
版本说明 : 第0版本没有使用定时器中断,同时定义了一个 unsigned long int 变量计数
                再把这个数的每位分离出来显示,所以导致有点闪屏,此版本使用定时器中断,
                而且没有用 unsigned long int 之类的变量,而是用数组 Val[8] 来计数,
                主函数只负责显示,其它的在中断函数里面处理,这样显示一点都不闪屏,
备注 : 可以用 ULN2003A 接在数码管的 com 口来提高驱动能力,ULN2003A里面有7个NPN三极管,
            可以大大提高驱动能力
联系 : 欢迎访问本人签名中的博客,进行互动交流。




#include <reg52.h>


sbit SCK = P1^1;    // 数据输入时钟线,脉冲
sbit SI  = P1^0;    // 数据线
sbit RCK = P1^2;    // 锁存

unsigned char code SMG[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};  // 段码
unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};    // 位选
unsigned char Val[8]  = {0};    // 要显示的数据


************************ 函数声明 ************************
void interrupt_init(void);
void timer_init(void);



控制74HC595输出数据
void Output(void)
{
    RCK = 0;
    RCK = 1;
}



向74HC595中写入一字节数据
void Write_Byte(unsigned char dat)
{
    unsigned char i = 0;
   
    for(i=0; i<8; i++)
    {
        SCK = 0;
        SI  = dat & 0x80;
        SCK = 1;
      
        dat <<= 1;      
    }
}



显示函数

void Display(unsigned char * p)
{
    unsigned char * pt = Wei;
   
    Write_Byte(*(pt+0));
    Write_Byte(SMG[*(p+7)]);
    Output();
   
    Write_Byte(*(pt+1));
    Write_Byte(SMG[*(p+6)]);
    Output();
   
    Write_Byte(*(pt+2));
    Write_Byte(SMG[*(p+5)]);
    Output();
   
    Write_Byte(*(pt+3));
    Write_Byte(SMG[*(p+4)]);
    Output();
   
    Write_Byte(*(pt+4));
    Write_Byte(SMG[*(p+3)]);
    Output();
   
    Write_Byte(*(pt+5));
    Write_Byte(SMG[*(p+2)]);
    Output();
   
    Write_Byte(*(pt+6));
    Write_Byte(SMG[*(p+1)]);
    Output();
   
    Write_Byte(*(pt+7));
    Write_Byte(SMG[*(p+0)]);
    Output();
   
}



int main(void)
{   
    timer_init();
    interrupt_init();
   
    while(1)
    {
        Display(Val);
    }
   
    return 0;
}

void interrupt_init(void)
{
EA  = 1;  //开总中断
ET0 = 1;  //开定时器0中断
ET1 = 1;  //开定时器1中断
}

void timer_init(void)
{
TMOD = TMOD | 0x01;  //定时器0工作方式1
TMOD = TMOD & 0xFD;
   
TH0  = 0x4B;   //装初值,50ms计数
TL0  = 0xFF;

TR0  = 1;    //开启定时器0
}

void timer0() interrupt 1
{
    static unsigned char counter0 = 0;
counter0++;
TH0  = 0x4B;   //重新装入初值,定时器0从头开始计数,计数50ms  
TL0  = 0xFF;

if(2 == counter0)  //2*50 ms = 100ms = 0.1s
{
  counter0 = 0;  //counter0置零,定时器0从头开始计数
      
        Val[0]++;
        if(10==Val[0])
        {
            Val[0] = 0;
            Val[1]++;
           
            if(10==Val[1])
            {
                Val[1] = 0;
                Val[2]++;
               
                if(10==Val[2])
                {
                    Val[2] = 0;
                    Val[3]++;
                  
                    if(10==Val[3])
                    {
                        Val[3] = 0;
                        Val[4]++;
                       
                        if(10==Val[4])
                        {
                            Val[4] = 0;
                            Val[5]++;
                           
                            if(10==Val[5])
                            {
                                Val[5] = 0;
                                Val[6]++;
                              
                                if(10==Val[6])
                                {
                                    Val[6] = 0;
                                    Val[7]++;
                                   
                                    if(10==Val[7])
                                    {
                                        Val[7] = 0;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
}
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出110入8汤圆

发表于 2013-3-30 13:06:26 | 显示全部楼层
刚好用上!

出0入0汤圆

发表于 2013-3-30 13:51:21 | 显示全部楼层
不错  谢谢分享  我是用了 3 个 595  16个5401   驱动  16位数码管滴...

出0入0汤圆

 楼主| 发表于 2013-3-30 14:18:47 | 显示全部楼层
angler12 发表于 2013-3-30 13:06
刚好用上!

能帮助到大家是我最大的鼓励。

出0入0汤圆

发表于 2013-3-31 10:42:52 | 显示全部楼层
呵呵,能用

出0入0汤圆

 楼主| 发表于 2013-3-31 13:41:47 | 显示全部楼层
fqc168 发表于 2013-3-31 10:42
呵呵,能用

经过实践验证

出0入95汤圆

发表于 2013-9-12 14:19:46 | 显示全部楼层
不错,正想用

出0入0汤圆

发表于 2013-9-12 16:22:14 来自手机 | 显示全部楼层
我写也会用很多的if
........

出0入0汤圆

发表于 2013-9-21 18:53:04 | 显示全部楼层
你好  有两片HC595驱动八位数码管的仿真图吗?  

出0入0汤圆

发表于 2015-7-3 12:41:12 | 显示全部楼层
顶贴!!!

出0入0汤圆

发表于 2019-7-10 21:03:48 | 显示全部楼层
不错,我也要用这个代码

出0入53汤圆

发表于 2019-7-10 21:32:23 来自手机 | 显示全部楼层
可以把显示放定时中断中吗?如果放main的while中,遇到定时高优先级会暂停主函数的显示
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-19 11:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表