找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5538|回复: 37
收起左侧

38译码器两个级联单片机程序求分析

[复制链接]
ID:232366 发表于 2021-2-27 19:18 | 显示全部楼层 |阅读模式
关于两个译码器级联   切换是没问题了可是切换的那个端口S4不知道在哪里控制它怎么切换有一个接线图

单片机源程序如下:
void HC138_GPIO_InIt()S
{
    S1=0;
    S2=0;
    S3=0;

    S4=0;//片选切换端口此端口为0时是第一个译码器工作等于1时切换到第二个译码器工作
}


void HC138_Drive()
{
    static uint8 i=0;
            switch(i)
        {

            case(0):  S1=0;S2=0;S3=0;break;
            case(1):  S1=1;S2=0;S3=0;break;
            case(2):  S1=0;S2=1;S3=0;break;
            case(3):  S1=1;S2=1;S3=0;break;
            case(4):  S1=0;S2=0;S3=1;break;
            case(5):  S1=1;S2=0;S3=1;break;
            case(6):  S1=0;S2=1;S3=1;break
            case(7):  S1=1;S2=1;S3=1;break;
            default:break;
        }

        i++;
        i=i%8;
        delay(50);

}

138译码器的级联

138译码器的级联
回复

使用道具 举报

ID:390416 发表于 2021-2-27 21:24 | 显示全部楼层
你这个很简单  把 S1 S2 S3 S4 当作一个字节的低4位 就行了
取值范围就是
0   0   0   0  0   0   0   0=0
0   0   0   0  S4 S3 S2 S1=X
0   0   0   0  1   1   1   1=15
这样就可以控制16行了  
回复

使用道具 举报

ID:232366 发表于 2021-2-27 21:31 | 显示全部楼层
人人学会单片机 发表于 2021-2-27 21:24
你这个很简单  把 S1 S2 S3 S4 当作一个字节的低4位 就行了
取值范围就是
0   0   0   0  0   0   0   0 ...

没明白啥您意思
回复

使用道具 举报

ID:390416 发表于 2021-2-27 21:36 | 显示全部楼层

把四个IO口当作一起的就行了  程序里面只控制了8行 所以只有S1S2S3
   
回复

使用道具 举报

ID:390416 发表于 2021-2-27 21:40 | 显示全部楼层
两个138译码器 组合起来 就可以当作一个 74HC154译码器了  祁绪电子
回复

使用道具 举报

ID:232366 发表于 2021-2-27 21:55 | 显示全部楼层
人人学会单片机 发表于 2021-2-27 21:40
两个138译码器 组合起来 就可以当作一个 74HC154译码器了  祁绪电子

我始终没弄明白应该在哪里来切换它  当第一次第一个138循环完到Q7之后  切换到第二个138来S循环
前面敲很多次代码就是没实现
回复

使用道具 举报

ID:605142 发表于 2021-2-27 22:36 | 显示全部楼层
GGG.gif 把s4也当作数据
回复

使用道具 举报

ID:605142 发表于 2021-2-27 22:38 | 显示全部楼层
GGG.gif
前面加一片,可以级联更多,理论上可以无限级联
回复

使用道具 举报

ID:232366 发表于 2021-2-27 23:33 来自手机 | 显示全部楼层
hefq 发表于 2021-2-27 22:38
前面加一片,可以级联更多,理论上可以无限级联

两个都没弄明白重新的控制无限级联更加是一片空白只是对我个人说尴尬
回复

使用道具 举报

ID:232366 发表于 2021-2-27 23:34 来自手机 | 显示全部楼层
hefq 发表于 2021-2-27 22:36
把s4也当作数据

我先去看看资料去先
回复

使用道具 举报

ID:213173 发表于 2021-2-28 06:30 | 显示全部楼层

给你一个简单的示例程序就很容易理解了
无标题.jpg

  1. //P0控制数码管笔段,P2低4位通过级联138控制数码管位
  2. #include <reg52.h>

  3. unsigned char code table[]={//共阴数码管段码"0~f"
  4.                 0x3f,0x06,0x5b,0x4f,
  5.                 0x66,0x6d,0x7d,0x07,
  6.                 0x7f,0x6f,0x77,0x7c,
  7.                 0x39,0x5e,0x79,0x71};

  8. unsigned char i;        //计数变量

  9. void delay(unsigned int k)//ms延时
  10. {
  11.         unsigned int i,j;
  12.         for(i=k;i>0;i--)
  13.                 for(j=110;j>0;j--);
  14. }

  15. void main()
  16. {       
  17.         while(1)
  18.         {
  19.                 P0=0x00;                //数码管消隐
  20.                 P2&=0xf0;        //数码管位码清0,不影响P2高4位状态
  21.                 P2|=i;                //赋值位码,不影响P2高4位状态
  22.                 P0=table[i];//赋值段码,i=0~15
  23.                 i=++i%16;        //0~15循环计数
  24.                 delay(1);        //延时1ms,控制数码管动态显示速度
  25.         }
  26. }
复制代码



回复

使用道具 举报

ID:97554 发表于 2021-2-28 08:45 | 显示全部楼层
SHANWAZI 发表于 2021-2-27 23:34
我先去看看资料去先

用4个IO口控制S1 S2 S3 S4,三个口的时候控制一片138,可以表示八种状态,也就是2的3次方,四位就可以表示2的4次方数,也就是16个状态。就是7楼的电路。你的程序里S4直接给了0,需要把S4接入IO口,那么4个IO口给高低电平就可以表示16种状态了
回复

使用道具 举报

ID:232366 发表于 2021-2-28 11:11 | 显示全部楼层
wulin 发表于 2021-2-28 06:30
给你一个简单的示例程序就很容易理解了

无奈用了个笨办法
uint8 code HC138[16]=
{
    0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e,
    0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x0f,

};

void HC138_Drive()
{
   
    uint8 i;
    for(i=0;i<16;i++)
    {
        P2=HC138;
        delay(200);
    }
回复

使用道具 举报

ID:232366 发表于 2021-2-28 11:12 | 显示全部楼层
wulin 发表于 2021-2-28 06:30
给你一个简单的示例程序就很容易理解了

会影响高四位的工作这样一来用一个字节高八位也会受影响尴尬
回复

使用道具 举报

ID:232366 发表于 2021-2-28 11:14 | 显示全部楼层
杨雪飞 发表于 2021-2-28 08:45
用4个IO口控制S1 S2 S3 S4,三个口的时候控制一片138,可以表示八种状态,也就是2的3次方,四位就可以表 ...

原理我也认证分析过  就是在编程思路上卡壳无从下手最后用数组这种本办法但是这样的话就高八位和第八位都用到低四位工作时高八位也受影响
回复

使用道具 举报

ID:822755 发表于 2021-2-28 11:37 | 显示全部楼层
第一片138设计为低使能,第二片设计为高使能,这样就可以一要IO控制两个138了,另外三个IO做译码控制。看电路,先看看芯片手册。
回复

使用道具 举报

ID:232366 发表于 2021-2-28 12:22 | 显示全部楼层
KongQuan 发表于 2021-2-28 11:37
第一片138设计为低使能,第二片设计为高使能,这样就可以一要IO控制两个138了,另外三个IO做译码控制。看电 ...

分步使能其实可以达到效果但是实际编程的时候就实现不了
回复

使用道具 举报

ID:66757 发表于 2021-2-28 13:13 来自手机 | 显示全部楼层
P2=Hc138改p2=i;就可以
回复

使用道具 举报

ID:232366 发表于 2021-2-28 13:56 | 显示全部楼层
各位论坛师傅麻烦帮我看看这样编程是否也可以用swithc语句来切换达到效果这样的话不知道有什么缺点

138译码器级联

138译码器级联
回复

使用道具 举报

ID:213173 发表于 2021-2-28 14:13 | 显示全部楼层
SHANWAZI 发表于 2021-2-28 11:12
会影响高四位的工作这样一来用一个字节高八位也会受影响尴尬

给你的示例已经非常清楚的说明字节高低位分开控制互不干扰,你还理解不了,无语了。
回复

使用道具 举报

ID:232366 发表于 2021-2-28 14:21 | 显示全部楼层
wulin 发表于 2021-2-28 14:13
给你的示例已经非常清楚的说明字节高低位分开控制互不干扰,你还理解不了,无语了。

有点卡壳没理解透彻    尴尬
回复

使用道具 举报

ID:232366 发表于 2021-2-28 15:08 来自手机 | 显示全部楼层
zmc5354 发表于 2021-2-28 13:13
P2=Hc138改p2=i;就可以

上面我是用了数组赋值改P2for循环依次取出数组给P2低四位或者是高四位一一对应38译码器的输入和级联使能
回复

使用道具 举报

ID:232366 发表于 2021-2-28 15:48 来自手机 | 显示全部楼层
wulin 发表于 2021-2-28 14:13
给你的示例已经非常清楚的说明字节高低位分开控制互不干扰,你还理解不了,无语了。

高位按位与置1了  高四位的还能使用sbit就行定义操作吗?   
回复

使用道具 举报

ID:213173 发表于 2021-2-28 17:06 | 显示全部楼层
SHANWAZI 发表于 2021-2-28 15:48
高位按位与置1了  高四位的还能使用sbit就行定义操作吗?

当然可以另外使用sbit定义独立操作。高位按位与f不等于置1,而是原来是1还是1,原来是0还是0。
P2&=0xf0;
1010 1010 原来状态
1111 0000 按位与
-------------
1010 0000 结果高4位不变,低4位清0
回复

使用道具 举报

ID:232366 发表于 2021-2-28 22:26 来自手机 | 显示全部楼层
wulin 发表于 2021-2-28 17:06
当然可以另外使用sbit定义独立操作。高位按位与f不等于置1,而是原来是1还是1,原来是0还是0。
P2&=0xf0 ...

那么是不是可以这样理解呢比如p2口原本的数据

1111-0110按位与1111-0000
结果为1111-0000我又去查了查资料按位与是0与任何数都为0只有1与1才为1这样的话就应了这个把高四位保持而低四位全部清理因为高四位数都为1与数高四也为1得出1与1结果还为1而低四位全部和0相与结果全部为零从而清零目的高四位不变   
如果我的点阵的行扫描使用38译码器级联那么上面的s1s2s3s4对应为P2口低四位我定义一个数组uint8  ledBuff[]={0x0f,0xfd……};
利用for循环依次取出对应数据因为只用到低四位高八位没有用  而在for循环进行时P2的高四位就会被赋值为1111  在上述中按位与操作
当第一次for循环获取第一零个数组元素元素时
P2=P2&ledBuff[0];
那么是不是这样  
1111-0000
1111-0000<按位与的值
结果为1111-0000
当for循环获取第一个元素时
P2=P2&ledBuff[1];
是不是这样
1111-1101
1111-0000<按位与的值
结果为1111-0000
那么这样的话是不是每次只是保持高四位不变
而低四位每次都清零好像不是这个效果  低四位一直清零译码器岂不是一直在一个状态
或者是这样的
每次进入for
先对P2&=0xf0;先对低四位清零高四位不变
然后再给P2=ledBuff[1];赋一次新的值
这里发送段码>忽略
这里延时>忽略
退出进入下一个循环


如果再使用sbit  LED=P2^7;
主函数中LED=0;会受控吗?



不知道我这样理解的思路对不对有问题还请指正初学者嘛 得多举一反三(抱拳)







回复

使用道具 举报

ID:232366 发表于 2021-2-28 22:27 来自手机 | 显示全部楼层
wulin 发表于 2021-2-28 17:06
当然可以另外使用sbit定义独立操作。高位按位与f不等于置1,而是原来是1还是1,原来是0还是0。
P2&=0xf0 ...

不好意思回复晚了
回复

使用道具 举报

ID:213173 发表于 2021-3-1 08:24 | 显示全部楼层
SHANWAZI 发表于 2021-2-28 22:26
那么是不是可以这样理解呢比如p2口原本的数据

1111-0110按位与1111-0000

这种控制方式低4位重新赋值前必须先清0,否则要出错
        uint8 i;
        for(i=0;i<16;i++)
        {
                P2&=0x00
                P2|=ledBuff;
                delay(200);
        }
如果再使用sbit LED=P2^7;
主函数中操作LED=0;上述代码与此互不干扰
回复

使用道具 举报

ID:232366 发表于 2021-3-1 10:13 | 显示全部楼层
wulin 发表于 2021-3-1 08:24
这种控制方式低4位重新赋值前必须先清0,否则要出错
        uint8 i;
        for(i=0;i

非常感谢您耐心回复

static uint8 i=0;
        P2&=0XF0;
        P2|=LedBuff;
        Delay100ms();
        i++;
        i=i%16;

请看这样方法是不是可行  先与保持高四位  清零低四位
重新赋值按位或
回复

使用道具 举报

ID:213173 发表于 2021-3-1 10:29 | 显示全部楼层
SHANWAZI 发表于 2021-3-1 10:13
非常感谢您耐心回复

static uint8 i=0;

相同的功能可以用不同的代码实现,只要遵循简洁、高效、易读的原则,可任意发挥。貌似你这程序是用两个138和两个595驱动16*16点阵。如果采用上述方法只需要7个I/O口就能完成。
回复

使用道具 举报

ID:232366 发表于 2021-3-1 10:37 | 显示全部楼层
是的  138 四个  595三个    太感谢提供思路我已经弄明白了对IO口与和或保持不变和改变后不影响其他的IO空的编程方法了 前面是绞尽脑汁怎么想都没想明白小弟无以回报
回复

使用道具 举报

ID:232366 发表于 2021-3-1 10:38 | 显示全部楼层
我用38译码器进行列扫描  595送数据的
回复

使用道具 举报

ID:390416 发表于 2021-3-1 10:42 | 显示全部楼层
都说了 先去研究一下 74HC154的芯片
回复

使用道具 举报

ID:232366 发表于 2021-3-1 17:08 来自手机 | 显示全部楼层
人人学会单片机 发表于 2021-3-1 10:42
都说了 先去研究一下 74HC154的芯片

看过了里面有两个138貌似也一样可以级联 我是重在学习硬件的的编程不是为了方便154确实是方便编程我是想多了解一些和多学习一下
回复

使用道具 举报

ID:232366 发表于 2021-3-1 17:10 来自手机 | 显示全部楼层
wulin 发表于 2021-3-1 10:29
相同的功能可以用不同的代码实现,只要遵循简洁、高效、易读的原则,可任意发挥。貌似你这程序是用两个13 ...

是的  138 四个  595三个    太感谢提供思路我已经弄明白了对IO口与和或保持不变和改变后不影响其他的IO空的编程方法了 前面是绞尽脑汁怎么想都没想明白小弟无以回报
回复

使用道具 举报

ID:390416 发表于 2021-3-1 17:28 | 显示全部楼层
SHANWAZI 发表于 2021-3-1 17:08
看过了里面有两个138貌似也一样可以级联 我是重在学习硬件的的编程不是为了方便154确实是方便编程我是想 ...

两个138级联 就等于一个154 所以叫你先去研究154怎么编程
回复

使用道具 举报

ID:232366 发表于 2021-3-2 12:40 | 显示全部楼层
人人学会单片机 发表于 2021-3-1 17:28
两个138级联 就等于一个154 所以叫你先去研究154怎么编程

哦哦明白了感谢提出建议
回复

使用道具 举报

ID:232366 发表于 2021-3-3 18:48 来自手机 | 显示全部楼层
人人学会单片机 发表于 2021-2-27 21:24
你这个很简单  把 S1 S2 S3 S4 当作一个字节的低4位 就行了
取值范围就是
0   0   0   0  0   0   0   0 ...

我现在明白您这几行数字什么意思了  再次感谢您提供思路  小弟感激不尽
回复

使用道具 举报

ID:232366 发表于 2021-3-3 22:25 来自手机 | 显示全部楼层
帖子沉的好快
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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