|
請(qǐng)問有沒有哪位大神百忙中抽點(diǎn)時(shí)間指點(diǎn)一下這一段代碼,卡了兩天了沒搞懂。下面是一段異組非順序端口編組的程序
本人業(yè)余愛好者,半路出家沒有系統(tǒng)學(xué)習(xí)過之前在網(wǎng)上學(xué)了一些89c51皮毛做了一些流水燈,4*4矩陣之類的
最近想做個(gè)實(shí)物矩陣鍵盤,但是由于之前用的是89c51,然后想著只做一個(gè)矩陣鍵盤帶幾個(gè)LED沒必要用那么多引腳的單片機(jī),
就選了個(gè)STC15W SOP16的
然后就悲劇了 STC15單組IO最多才6個(gè)P1.0-P1.5,4*4鍵盤要用8個(gè)口,跟之前學(xué)的0x**就完成掃描的程序不一樣,搞了兩天就只會(huì)分開一個(gè)一個(gè)口的寫代碼
雖然也能用,但是這樣太修飾了,然后就去網(wǎng)上找了一些資料(這方面的資料超級(jí)少),研究后發(fā)覺我看不懂代碼了(主要是運(yùn)算符)
單個(gè)運(yùn)算符拿出來可以理解,但是放在一起就搞不懂為什么會(huì)有這樣的結(jié)果。
#define PD ((P2<<3&0x80)|(P2<<4&0x40)|(P3&0x3f)) //P2.4/P2.2
不懂1:宏定義 P2向左移3位跟0x80進(jìn)行按位與......
根據(jù)運(yùn)算優(yōu)先級(jí),這里的位移3位是指P2口低位往高位移3位后的結(jié)果是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) 結(jié)果為0x00 (0000 0000) ??
P2向左移4位跟0x40進(jìn)行按位與..... .這里的位移4位是指P2口低位往高位移3位后的結(jié)果是2.3口嗎??
之后
P2=0X08(0000 1000) & 0x40(0100 0000) 結(jié)果為0x00 (0000 0000) ??
再之后
不算P3的情況 按位或結(jié)果 0000 0000 | 0000 0000 = 0000 0000 那就跟程序運(yùn)行的結(jié)果就不一樣了
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進(jìn)制還是2進(jìn)制或者16進(jìn)制
}
|
|