帖子沉的好快 |
人人学会单片机 发表于 2021-2-27 21:24 我现在明白您这几行数字什么意思了 再次感谢您提供思路 小弟感激不尽 |
人人学会单片机 发表于 2021-3-1 17:28 哦哦明白了感谢提出建议 |
SHANWAZI 发表于 2021-3-1 17:08 两个138级联 就等于一个154 所以叫你先去研究154怎么编程 |
wulin 发表于 2021-3-1 10:29 是的 138 四个 595三个 太感谢提供思路我已经弄明白了对IO口与和或保持不变和改变后不影响其他的IO空的编程方法了 前面是绞尽脑汁怎么想都没想明白小弟无以回报 |
人人学会单片机 发表于 2021-3-1 10:42 看过了里面有两个138貌似也一样可以级联 我是重在学习硬件的的编程不是为了方便154确实是方便编程我是想多了解一些和多学习一下 |
都说了 先去研究一下 74HC154的芯片 |
我用38译码器进行列扫描 595送数据的 |
是的 138 四个 595三个 太感谢提供思路我已经弄明白了对IO口与和或保持不变和改变后不影响其他的IO空的编程方法了 前面是绞尽脑汁怎么想都没想明白小弟无以回报 |
SHANWAZI 发表于 2021-3-1 10:13 相同的功能可以用不同的代码实现,只要遵循简洁、高效、易读的原则,可任意发挥。貌似你这程序是用两个138和两个595驱动16*16点阵。如果采用上述方法只需要7个I/O口就能完成。 |
wulin 发表于 2021-3-1 08:24 非常感谢您耐心回复 static uint8 i=0; P2&=0XF0; P2|=LedBuff; Delay100ms(); i++; i=i%16; 请看这样方法是不是可行 先与保持高四位 清零低四位 重新赋值按位或 |
SHANWAZI 发表于 2021-2-28 22:26 这种控制方式低4位重新赋值前必须先清0,否则要出错 uint8 i; for(i=0;i<16;i++) { P2&=0x00 P2|=ledBuff; delay(200); } 如果再使用sbit LED=P2^7; 主函数中操作LED=0;上述代码与此互不干扰 |
wulin 发表于 2021-2-28 17:06 不好意思回复晚了 |
wulin 发表于 2021-2-28 17:06 那么是不是可以这样理解呢比如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;会受控吗? 不知道我这样理解的思路对不对有问题还请指正初学者嘛 得多举一反三(抱拳) |
SHANWAZI 发表于 2021-2-28 15:48 当然可以另外使用sbit定义独立操作。高位按位与f不等于置1,而是原来是1还是1,原来是0还是0。 P2&=0xf0; 1010 1010 原来状态 1111 0000 按位与 ------------- 1010 0000 结果高4位不变,低4位清0 |
wulin 发表于 2021-2-28 14:13 高位按位与置1了 高四位的还能使用sbit就行定义操作吗? |
zmc5354 发表于 2021-2-28 13:13 上面我是用了数组赋值改P2for循环依次取出数组给P2低四位或者是高四位一一对应38译码器的输入和级联使能 |
wulin 发表于 2021-2-28 14:13 有点卡壳没理解透彻 尴尬 |
SHANWAZI 发表于 2021-2-28 11:12 给你的示例已经非常清楚的说明字节高低位分开控制互不干扰,你还理解不了,无语了。 |
P2=Hc138改p2=i;就可以 |
KongQuan 发表于 2021-2-28 11:37 分步使能其实可以达到效果但是实际编程的时候就实现不了 |
第一片138设计为低使能,第二片设计为高使能,这样就可以一要IO控制两个138了,另外三个IO做译码控制。看电路,先看看芯片手册。 |
杨雪飞 发表于 2021-2-28 08:45 原理我也认证分析过 就是在编程思路上卡壳无从下手最后用数组这种本办法但是这样的话就高八位和第八位都用到低四位工作时高八位也受影响 |
wulin 发表于 2021-2-28 06:30 会影响高四位的工作这样一来用一个字节高八位也会受影响尴尬 |
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); } |
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种状态了 |
SHANWAZI 发表于 2021-2-27 21:31 给你一个简单的示例程序就很容易理解了 ![]()
|
hefq 发表于 2021-2-27 22:36 我先去看看资料去先 |
hefq 发表于 2021-2-27 22:38 两个都没弄明白重新的控制无限级联更加是一片空白只是对我个人说尴尬 |
![]() 前面加一片,可以级联更多,理论上可以无限级联 |
![]() |
人人学会单片机 发表于 2021-2-27 21:40 我始终没弄明白应该在哪里来切换它 当第一次第一个138循环完到Q7之后 切换到第二个138来S循环 前面敲很多次代码就是没实现 |
两个138译码器 组合起来 就可以当作一个 74HC154译码器了 祁绪电子 |
SHANWAZI 发表于 2021-2-27 21:31 把四个IO口当作一起的就行了 程序里面只控制了8行 所以只有S1S2S3 |
人人学会单片机 发表于 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行了 |