请问有没有哪位大神百忙中抽点时间指点一下这一段代码,卡了两天了没搞懂。下面是一段异组非顺序端口编组的程序
本人业余爱好者,半路出家没有系统学习过之前在网上学了一些89c51皮毛做了一些流水灯,4*4矩阵之类的
最近想做个实物矩阵键盘,但是由于之前用的是89c51,然后想着只做一个矩阵键盘带几个LED没必要用那么多引脚的单片机,
就选了个STC15W SOP16的
然后就悲剧了 STC15单组IO最多才6个P1.0-P1.5,4*4键盘要用8个口,跟之前学的0x**就完成扫描的程序不一样,搞了两天就只会分开一个一个口的写代码
虽然也能用,但是这样太修饰了,然后就去网上找了一些资料(这方面的资料超级少),研究后发觉我看不懂代码了(主要是运算符)
单个运算符拿出来可以理解,但是放在一起就搞不懂为什么会有这样的结果。
#define PD ((P2<<3&0x80)|(P2<<4&0x40)|(P3&0x3f)) //P2.4/P2.2
不懂1:宏定义 P2向左移3位跟0x80进行按位与......
根据运算优先级,这里的位移3位是指P2口低位往高位移3位后的结果是2.2口吗?(P2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7)
既:P2=0X04(0000 0100) & 0x80(1000 0000) 结果为0x00 (0000 0000) ??
P2向左移4位跟0x40进行按位与..... .这里的位移4位是指P2口低位往高位移3位后的结果是2.3口吗??
之后
P2=0X08(0000 1000) & 0x40(0100 0000) 结果为0x00 (0000 0000) ??
再之后
不算P3的情况 按位或结果 0000 0000 | 0000 0000 = 0000 0000 那就跟程序运行的结果就不一样了
void PX(uchar x)
{
P3&=0xc0; //低6位清0,P3.6、P3.7不变
P3|=(x&0x3f); //P3低6位赋值
P2&=0xeb; //P2.4、P2.2清0,其它位不变
P2|=((x>>3&0x10)|(x>>4&0x04)); //P2.4、P2.2赋值
不懂2: 无字符型变量X 取值范围是 0-255 这里的X移位是怎么移?0 1 2 3 -255 位移3位是2吗?移位后的值是10进制还是2进制或者16进制
}
|