深圳的网站建设公司官网,html5编辑器手机版下载,余杭区网站建设设计公司,做外贸网站需要注意什么一、遇到的问题
还记得我前面在封装继电器外设的时候遇到的这个问题嘛#xff0c;当时我怀疑的是138译码器在切换通道的时候会出现其他暂态导致已经锁定的573解锁。 其实不然#xff0c;之所以会这样还是因为代码问题#xff0c;也可以说是573反应时间太快了。下面我就分析…一、遇到的问题
还记得我前面在封装继电器外设的时候遇到的这个问题嘛当时我怀疑的是138译码器在切换通道的时候会出现其他暂态导致已经锁定的573解锁。 其实不然之所以会这样还是因为代码问题也可以说是573反应时间太快了。下面我就分析一下为什么会这样
二、问题分析
假设我们要先操作LED再操作继电器那么按照我之前的写法会是这样先写001解锁LED,再写000锁存。然后写101解锁继电器再写000锁存。好问题就出在最后一步当P250时P26还等于0P27还等于1这个短暂的瞬间组成了001刚好就会解锁LED。所以这就是为什么我当时用110去锁存继电器就不会解锁LED了。
总结一下就是在操作138去解锁锁存573的时候一定要用整个IO端口操作不能像我这样图简单方便用单独位操作 正确写法
void select_573(u8 x)
{if(x0) P2 0x1F; //锁存else if(x4) P2 |0x80; //解锁LED所在573else if(x5) P2 |0xA0; //解锁继电器所在573else if(x6) P2 |0xC0; //解锁数码管位码所在573else if(x7) P2 |0xE0; //解锁数码管段码所在573else;//踩坑提示一定要采用整个端口操作不能单独位操作
}
u8 Led_Status0xFF; //初始关闭void Set_Led(unsigned char Leds)
{//选中LED所在573此时输出跟随输入变化select_573(4); //74HC138--Y40,else1--Y4C1,else0P0Leds;Led_StatusLeds; //记录LED状态//锁存LED所在573select_573(0); //74HC138--Y10,else1
}/**********Set_Leds**************
* location: operate which led
* status1 ON0 OFF
********************************/
void Set_Leds(u8 location,u8 status)
{//选中LED所在573此时输出跟随输入变化select_573(4); //74HC138--Y40,else1--Y4C1,else0P0 Led_Status; //防止解锁时LED状态改变P0 | 0x01(location-1); //清除对应位P0 ~(status (location-1)); //设置对应位Led_StatusP0; //记录所有LED灯状态//锁存LED所在573select_573(0); //74HC138--Y10,else1
}