View Single Post
Old 15-03-2008, 08:25 AM   #10
wantanamo69
Nhập môn đệ tử
 
Tham gia ngày: Feb 2008
Bài gửi: 5
:
Trích:
Nguyên văn bởi namqn View Post
Tất cả các port của PIC18F452 đều có thể dùng làm I/O. Việc một chân nào đó của một port là ngõ vào hay ngõ ra tùy thuộc vào bit tương ứng của thanh ghi điều khiển tri-state của nó (các thanh ghi TRISx, x = A, B, ..., E), và người lập trình sẽ thiết lập giá trị của các bit trong các thanh ghi tri-state này theo yêu cầu của họ. Bit tri-state được bật lên '1' có nghĩa là chân tương ứng là ngõ vào (input), bit tri-state được xóa về '0' có nghĩa là chân tương ứng là ngõ ra (output). Để dễ nhớ thì có thể hình dung 1 = I(nput), 0 = O(utput).

Thanh ghi LAT dùng để xuất dữ liệu ra port, còn thanh ghi PORT dùng để đọc dữ liệu từ port. Thanh ghi LAT xuất hiện trong PIC18 để giải quyết vấn đề hiệu ứng read-modify-write xuất hiện trong các dòng PIC base-line và mid-rang (PIC12, PIC16).

Thân,
;//////////////////////////////////////////////

Nhu ban namqn da noi tren thi that dung, toi bo xung them:

Ban co the sai cac port.PIN thanh Input hay Output tuy-y (fai chieu theo data sheet). Vi du ban dang sai RA.1 thanh Input ma ban muon doi no thanh output thi cu viec set cai TRISA.1 thanh LOW (tuc la = 0 cho out put). Doi khi ban muon sai nhu vay neu ban viet I2C software; ban doi DATA pin thanh IN de doc va thanh OUT de viet vao I2C. Nhung neu ban da gan pin nao do vao LED vi-du, thi READ cung khong co ich gi.

Hy-vong that help,

LB

;/////////////////// --- THI DU ---///////////////////// --- in MCC18 ---

/--------------------------------------------
I2CBITOUT routine viet mot byte sang I2C
//-------------------------------------------

void I2CBITOUT(byte n) {

I2CDataTris=0; // CHU-Y: cho pin nay thanh OUTPUT
if(n) //
m_I2CDataBit=1; // doi logic
else
m_I2CDataBit=0;
Nop();
Nop();
m_I2CClkBit=1; // set clock line high
I2CDelay();
m_I2CClkBit=0; // return clock line low
I2CDelay();

}

//------------------------------------------
I2CBITIN routine doc mot byte tu I2C
//------------------------------------------

byte I2CBITIN(void) {
byte i;

I2CDataTris=1; // bien data line thanh INPUT de doc byte
I2CDelay();
m_I2CClkBit=1; // set clock line high
I2CDelay(); // cho chut siu
i = m_I2CDataBit ? 1 : 0; // read the data bit
m_I2CClkBit=0; // set clock line low
return i;
}

;////////////////////// --- thi du in ASM --- //////////////////////

;
;-------------------------------
;///////////////////////////////

; BITOUT sub for ext EEprom
;--------
;
BITOUT

bcf LATA,0 ; -- doi lai 06/25/05 --
bcf TRISA,0 ; cho Sdata Output

btfss Temp4,do ; bitFLAG,do ; check for state of data
goto bitlow ; if low then
bsf Sdata ; output a ---- HI BIT ----
goto clkout ; go toggle the clock
bitlow
bcf Sdata ; else output a ---- LOW BIT ----
clkout
bsf Sclk ; set clk line HI
call delayEE0 ; ___/"""""\___
bcf Sclk ; set clk line low
bcf Sdata ; 04/20/20 da chay tot
nop

retlw 0
;
;-------------------------------
;///////////////////////////////

; BITIN sub: Read one bit of data from ee and store it in di
;-------- for ext EEprom ------
;
BITIN
bcf Sdata ; ok
nop ; ok
nop ; ok

bsf LATA,0 ; DOI LATA TO B HAY C TUY THEO port --
bsf TRISA,0 ; cho Sdata INPUT

bsf Sclk ; set clock line HI __/""
;--
call delayEE001 ; OK
btfsc Sdata ; jb Sdata,btin1
goto btin1
bcf Temp4,di ; bitFlag,di ; input bit was LOW
goto btin2
btin1
bsf Temp4,di ; bitFlag,di
btin2
bcf Sclk ; set clock line LOW too ""\__
nop ; ok

retlw 0 ; -- khi ve thi di da co mot byte cua data --

;-------------------------------
;

Hy vong cai nay giup,

LB
wantanamo69 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn