80C51單片機有P0-P3四個P口,以P0為例說明:
要搞清這個問題,就要明白p0口的內(nèi)部結(jié)構(gòu)。P0口是由鎖存器經(jīng)兩個驅(qū)動場效應(yīng)管和外部引腳相連的。
讀引腳的意思就是直接讀P0外部引腳的電位,而讀端口(鎖存器)讀的是內(nèi)部與數(shù)據(jù)總線鏈接的鎖存器的電位。
兩者不同。一般來說,讀取P0的數(shù)據(jù),都是讀引腳,目的是獲取與P0相連的外部電路的狀態(tài)。而讀端口是在執(zhí)行下述語句時由CPU自行完成的:
inc P0;給p0加1
執(zhí)行這個語句時 ,采用“讀-改-寫”的過程,先讀取p0的端口數(shù)據(jù),再加1,然后送到p0鎖存器里。注意這個端口數(shù)據(jù)跟p0的引腳狀態(tài)不一樣,比如你事先給p0寫進69H,p0里數(shù)據(jù)就是69H,而引腳上的狀態(tài)因為你沒有執(zhí)行MOV A,p0之類的指令,它是不會進到p0的鎖存器里去的。由此可見,所謂的讀端口,不是讀取p0的狀態(tài),而是在執(zhí)行inc之類的指令時由CPU自行完成的,
讀引腳就是讀取p0口狀態(tài)了。讀引腳時要注意:先要給p0寫FFH,使它的場效應(yīng)管T2和地斷開。
因為p0口的場效應(yīng)管T2一端接地,一端與外部引腳相連,由P0的鎖存器控制,當給鎖存器寫1時,它和地斷開,寫0時和地相連,所以寫零時讀到的總是低電平。
試想你現(xiàn)在要讀P0引腳,按理說P0與外部電路相連,外部電路的是什么狀態(tài),就應(yīng)該讀到什么,但如果p0口的場效應(yīng)管T2一端接地的話,它會把p0口電位拉低,你讀到的總是低電平0,所以要先給p0寫FFH,把p0的場效應(yīng)管T2和地斷開,再讀數(shù)時就是真實狀態(tài)了。當外部電路斷開,再讀時讀到的就是p0端口(鎖存器)的真實狀態(tài)了。