|
本帖最后由 any_014 于 2012-11-10 13:19 编辑
//-------------------------------------------------------------------------------------//
// 初始化,输入输出,内存处理 子函数 //
//-------------------------------------------------------------------------------------//
void input_IO(void) //X输入,Y输出刷新
{ unsigned char i;
i = P2;
i = ((i << 1) & 0xaa) | ((i >> 1) & 0x55);
i = ((i << 2) & 0xcc) | ((i >> 2) & 0x33);
rX[0].BYTE = ~((P1 & 0x0f) | (i & 0xf0));
rX[1].BYTE = ~(i & 0x0f) & 0x0f;
rX[2].BYTE = ~Get_EX_BIT();
P0 = rY[0].BYTE;
Out_EY_BIT();
_M8011_ = Pulse_10ms;
_M8012_ = Pulse_100ms;
_M8013_ = Pulse_Sec;
_M8014_ = Pulse_Min;
}
以上为原程序里的函数,其中
i = ((i << 1) & 0xaa) | ((i >> 1) & 0x55);
i = ((i << 2) & 0xcc) | ((i >> 2) & 0x33);
是什么意思呢?
-------------------------------------------------------------------------------------
算了下。I各位如果是 BIT7...BIT0.
如果经过 i = ((i << 1) & 0xaa) | ((i >> 1) & 0x55);
则变为:BIT6,BIT7,BIT4,BIT5,BIT2,BIT3,BIT0,BIT1。
也就是相邻两位换位。
------------------------------------------------------------------------------------
经过 i = ((i << 2) & 0xcc) | ((i >> 2) & 0x33);
则变为:BIT4,BIT5,BIT6,BIT7,BIT0,BIT1,BIT2,BIT3
两次变换的结果是高四位和低四位换位。
-------------------------------------------------------------------------------------
rX[0].BYTE = ~((P1 & 0x0f) | (i & 0xf0));
rX[1].BYTE = ~(i & 0x0f) & 0x0f;
这两句又不知道是什么意思了。
第一句是将I的高四位即P2的低四位和P1的低四位组合到一块,取反,存放rX[0]里。
rX[1]里放的是i的低四位,即P2的高四位,取反。
为何要取反? 输入本来是低电平有效?软件上取反变为高电平有效?
那rX[0]和rX[1]里放的书还是不明白,P2的输入为何要分开放到rX[0]哦rX[1]里?
P1口的低四位又从何而来?12点输入?
------------------------------------------------------------------------------------
看了简易PLC原理图,明白了,P0口低四位为X0-X3,P2口高四位为X4-X7,低四位为X10-X13。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|