chuanhuibh 发表于 2007-8-25 22:32:52

用74LS164减少7段数码管占用的IO(MEGA8)

74LS 164是移位寄存器,实现串行转并行,CLK和DATA(Ahe和B接到一起)线,代替8根数据线接到4位数码管,扫描显示。写的时候考虑了移植,便于大家使用。

chuanhuibh 发表于 2007-8-25 22:33:26

点击此处下载armok01168222.rar

hl0716 发表于 2007-8-25 22:43:23

兄弟串红怎么解决啊

mcu5i51 发表于 2007-8-26 07:25:56

用595会更好,两片可以直接驱动8位0.5'数码管,亮度也不错,164会在移位时有关不灭的现象,需要处理一下才有好效果

chuanhuibh 发表于 2007-8-27 11:42:31

什么是串红,是没有消影的结果吗?,这种方法的确亮度还不怎么高

elchb 发表于 2007-8-27 12:21:06

确实是用595比较好,就是多了一条线。

xiaobendan 发表于 2007-8-27 12:42:23

164输出都不用加电阻吗?会不会热啊?8段的电流一起进CPU,会不会有问题啊?

irerror 发表于 2008-3-8 09:24:45

谢谢,正学习中

hehanlou 发表于 2008-3-8 09:36:31

呀呀 你们怎么都不用SD1628 方便极了

vivalite 发表于 2008-3-8 09:40:53

用CD4094不会闪,不用电阻,可惜亮度不高

hehanlou 发表于 2008-3-8 09:45:02

1628我已经大量用在产品上面 暗亮度8级调节

hehanlou 发表于 2008-3-8 09:50:01

发一小段SM1628代码:
/*******************************************************************
函数描述:写入一个字节到SM1628
函数原型: void wbyte_1628()
*******************************************************************/
write_1628(uchar        data)
{
        uchar        k;
        STB=0;
        nop;
        for(k=8;k>0;k--)
                {
                        CLK=0;
                        if(data&0x01)
                                DIO=1;
                                else
                                DIO=0;
                        nop;nop;
                        CLK=1;       
                        data=data>>1;
                }
}
/*******************************************************************
函数描述:读取SM1628
函数原型: void read_1628()
*******************************************************************/
read_1628()
{
        uchar        k,data;
        STB=0;
        TRISB=0b00000001;
        nop;nop;
        for(k=8;k>1;k--) //for(k=8;k>0;k--)陷入
                {
                        CLK=0;
                        nop;nop;nop;
                        if(DIO)
                                data=data|0x80;
                                else
                                data=data&0x7f;
                        data=data>>1;
                        CLK=1;
                        nop;nop;nop;nop;nop;nop;
                }
        nop;nop;nop;nop;
        TRISB=0x00;
        return(data);
}
/*******************************************************************
数码管显示函数
函数原型: void display();
Function: displayprogame
*******************************************************************/
display(uint        data)
{
        uchar        BCD;
        BCD=0;
        BCD=0;
        BCD=0;
        BCD=0;
        ///////////////////
        while(data>=1000)
                {
                        data=data-1000;
                        BCD++;
                }
        while(data>=100)
                {
                        data=data-100;
                        BCD++;
                }       
        while(data>=10)
                {
                        data=data-10;
                        BCD++;
                }
        BCD=data;
        ///////////////////
        LED4=table];
        LED3=table];
        LED2=table];
        LED1=table];
        //===========================
        //                设置显示模式
        //===========================
        write_1628(0b00000011);               //7位,10段
        STB=1;
        nop;nop;nop;nop;
        //===========================
        //                设置数据
        //===========================
        write_1628(0b01000000);
        STB=1;
        nop;nop;nop;nop;
        //===========================
        //                设置地址
        //===========================
        write_1628(0b11000000);   
        //===========================
        //                传输显示数据
        //===========================
        write_1628(LED4);//第四位数码管
        write_1628(0xff);//
        write_1628(LED1);//第一位数码管
        write_1628(0xff);//
        write_1628(LED2);//第二位数码管
        write_1628(0xff);//
        write_1628(LED3);//第三位数码管
        write_1628(0xff);
        write_1628(LED5);//LED灯
        STB=1;
        nop;nop;nop;nop;
        //===========================
        //                控制显示
        //===========================
        if(!flag)
                write_1628(0b10001011);//后3位亮度调节
                else
                write_1628(0b10000000);//关显示
        //write_1628(0b10001011);//后3位亮度调节
        STB=1;
}
/*******************************************************************

linliangkang 发表于 2009-12-14 23:17:05

贵兄发的不是林夕依然的例子吗?

HBBMAKEIT 发表于 2013-4-30 20:24:01

谢了!!!

postek 发表于 2013-4-30 22:10:56

164 数码管,很经典的组合。
页: [1]
查看完整版本: 用74LS164减少7段数码管占用的IO(MEGA8)