20-10-2007, 01:12 AM
|
#13
|
Đệ tử 4 túi
Tham gia ngày: Jan 2007
Bài gửi: 79
:
|
Trích:
Nguyên văn bởi phamthanhkhuyen
dưới đây là trích trong Tutorial 9.1 - Nigel Goodwin 2003
tôi ghi chú lại nhưng tôi thấy trong đoạn Chk_Keys ở dòng lệnh thứ 6 hình như viết sai thì phải mong các bạn chỉ giúp
Code:
;KEYPAD16
;trich trong Tutorial 9.1 - Nigel Goodwin 2003
;Keypad reading with LCD display
;chu thich lai boi PHAM THANH KHUYEN
;ngay 11/06/2207
LIST p=16F628A ;tell assembler what chip we are using
include "P16F628A.inc" ;include the deFaults For the chip
ERRORLEVEL 0, -302 ;suppress bank selection messages
__conFig 0x3D18 ;sets the conFiguration settings (oscillator type etc.)
;...................................................................
cblock 0x20 ;start oF general purpose registers
;cac bien cua Delay
count1 ;used in delay routine
counta ;used in delay routine
countb ;used in delay routine
;cac bien cua Keypad
key
rows
endc
;.................................................................
KEY_PORT Equ PORTB ;keypad port
KEY_TRIS Equ TRISB
Col1 Equ 0 ;pins used For keypad inputs
Col2 Equ 1
Col3 Equ 2
Col4 Equ 3
;.....................................................................
;GHI CHU : sau khi thuc hien xong doan chuong trinh Chk_Keys
;ta duoc gia tri cua phim nhan nam o trong W va trong bien Key
;Keypad subroutine
Chk_Keys movlw 0x00 ;wait until no key pressed (doi cho den khi khong co phim nhan)
movwF KEY_PORT ;set all output pins low out out out out in in in in = 0000 xxxx
movF KEY_PORT, W ;read port B
andlw 0x0F ;mask oFF high byte (che 4 bit cua byte cao)
sublw 0x0F
; ??????????????????????????????????????
btFsc STATUS, Z ;test iF any key pressed
;thay bang BTFSS STATUS,Z ????
goto Keys ;iF none, read keys
call Delay20 ;
goto Chk_Keys ;else try again
;Cac chan cua port Keypad
; out out out out in in in in
; col1 col2 col3 col4 row1 row2 row3 row4
; RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
Keys call Scan_Keys
movlw .16 ;check For no key pressed 16
subwF key, w ;neu Key=.16 co nghia la khong co phim nao nhan
btFss STATUS, Z
goto Key_Found ;Key <>.16
call Delay20
goto Keys
Key_Found movF key, w
andlw 0x0F
call Key_Table ;lookup key in table
movwF key ;save back in key
return ;key pressed now in W
;.................................................................
Scan_Keys clrF key
movlw 0xF0 ;set all output lines high
movwF KEY_PORT ;11110000
movlw .4 ;
movwF rows ;set number oF rows
bcF STATUS, C ;put a 0 into carry
Scan rrF KEY_PORT, F ;0111xxxx 1011xxxx 1101xxxx 1110xxxx
bsF STATUS, C ;Follow the zero with ones
;comment out next two lines For 4x3 numeric keypad.
btFss KEY_PORT, Col4 ;Col4 equ 3 cccc1xxx
goto Press ; cccc0xxx
incF key, F ;
btFss KEY_PORT, Col3 ;Col3 equ 2 ccccx1xx
goto Press ; ccccx0xx
incF key, F ;
btFss KEY_PORT, Col2 ;Col2 equ 1 ccccxx1x
goto Press ; ccccxx0x
incF key, F ;
btFss KEY_PORT, Col1 ;Col1 equ 0 ccccxxx1
goto Press ; ccccxxx0
incF key, F ;
decFsz rows, F ;
goto Scan ;
Press return
;khi ket thuc Scan_Keys ta duov 1 gia tri cua Key
;end oF keypad subroutines.
;....................................................................
Key_Table ADDWF PCL,F
RETLW 0x43 ;C col1 col2 col3 col4
RETLW 0x42 ;B row4 C D E F
RETLW 0x30 ;0 row3 B 9 6 3
RETLW 0x41 ;A row2 0 8 5 2
RETLW 0x44 ;D row1 A 7 4 1
RETLW 0x39 ;9
RETLW 0x38 ;8
RETLW 0x37 ;7
RETLW 0x45 ;E
RETLW 0x36 ;6
RETLW 0x35 ;5
RETLW 0x34 ;4
RETLW 0x46 ;F
RETLW 0x33 ;3
RETLW 0x32 ;2
RETLW 0x31 ;1
;....................................................................
;DEYLAY
Delay255 movlw 0xFF ;delay 255 mS
goto d0
Delay100 movlw d'100' ;delay 100mS
goto d0
Delay50 movlw d'50' ;delay 50mS
goto d0
Delay20 movlw d'20' ;delay 20mS
goto d0
Delay5 movlw 0x05 ;delay 5.000 ms (4 MHz clock)
d0 movwF count1
d1 movlw 0xC7 ;delay 1mS
movwF counta
movlw 0x01
movwF countb
Delay_0
decFsz counta, F
goto $+2
decFsz countb, F
goto Delay_0
decFsz count1 ,F
goto d1
retlw 0x00
end
|
Tôi cũng nghĩ như bạn phamthanhkhuyen. Lệnh BTFSC status,Z có nghĩa là nếu không có phím được nhấn thì kết quả phép trừ ra 0, cờ Z=1 thì lệnh goto keys được thực hiện. Thật kỳ là, không có phím được nhấn thì vào kiểm tra phím nhấn làm gì???? Rất mong mọi người giải thích để mình có cách hiểu đúng về vấn đề này. XIn cảm ơn.
|
|
|