KEYPAD nhờ giúp đở....

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • phamthanhkhuyen
    Đệ tử 1 túi
    • Nov 2006
    • 25

    #1

    KEYPAD nhờ giúp đở....

    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
  • falleaf
    PIC Bang chủ
    • May 2005
    • 2627

    #2
    Bạn phải xem là khi Nigel nhấn nút đó, thì nút đó được kéo xuống mass hay là được kéo lên.

    Chúc vui
    Công ty TNHH Thương mại và Giao nhận R&P
    store.hn@rpc.vn - store.hcm@rpc.vn

    Học PIC như thế nào?

    Comment

    • phamthanhkhuyen
      Đệ tử 1 túi
      • Nov 2006
      • 25

      #3
      đây là sơ đồ phần cứng keypad

      Comment

      • falleaf
        PIC Bang chủ
        • May 2005
        • 2627

        #4
        Nút có trở kéo lên. Như vậy khi bấm nút thì nó sẽ kéo xuống. Như vậy nút bấm tương ứng với việc kiểm tra xem nếu bấm xuống, có clear thì dùng BTFSC (nhảy nếu mà bit clear).

        Nếu thấy nút bị bấm xuống, thì đoạn của Nigel viết là call delay20, sau đó kiểm tra xem nút đó là nút gì (ChkKeys).

        Còn chi tiết thuật toán thì F không rõ vì không có thời gian xem. Nếu không bấm xuống thì nó nhảy vào đoạn hàm Keys.

        Nếu đọc theo ghi chú của Nigel thì không thấy có gì sai.

        Chúc vui
        Công ty TNHH Thương mại và Giao nhận R&P
        store.hn@rpc.vn - store.hcm@rpc.vn

        Học PIC như thế nào?

        Comment

        • phamthanhkhuyen
          Đệ tử 1 túi
          • Nov 2006
          • 25

          #5
          trong đoạn chương trình trên:
          khi có phím bấm --> delay20---> Chk_keys
          thì chương trình sẽ vào vòng lập cho đến khi nào không có phím nhấn thì nó sẻ vào đoạn hàm Key để đọc xem phím đó là phím gì
          Nhưng khổ nổi không có phím nhấn thì lấy gì mà đọc!!!!
          còn khi có phím nhấn lạl kiểm tra lại ?
          Last edited by phamthanhkhuyen; 24-06-2007, 08:43 PM.

          Comment

          • Chunhatonline
            Nhập môn đệ tử
            • Apr 2006
            • 8

            #6
            delay nhiều thế không bắt nổi phím!

            Comment

            • Jerry
              Đệ tử 5 túi
              • Sep 2006
              • 100

              #7
              Cũng cần giúp đỡ về Keypad

              Tôi cũng sử dụng chương trình của Nigel để điều khiển keypad nhưng tôi đang phân vân vì không thấy chương trình này có phần xử lý chống nảy phím. Vì vậy tôi rất muốn hỏi các bạn đã từng xử lý bàn phím kiểu này xem kinh nghiệm các bạn làm như thế nào (viết bằng ASM). Rất mong sự phản hồi từ các bạn.

              Comment

              • Jerry
                Đệ tử 5 túi
                • Sep 2006
                • 100

                #8
                Thiết kế của tớ như sau:
                - Phần cứng: theo sơ đồ đính kèm
                - Phần mềm:
                Code:
                Init_port:
                	clrf	PORTD
                	movlw	0xF0	; Row: output (RD0-3), Col: Input (RD4-7)
                	movwf	TRISD
                MainProg:
                	clrwdt
                	clrf	key
                	call	Chk_Keys
                	movf	key, w	
                	call	WriteData		; Hiển thị lên LCD
                	
                	goto	MainProg
                
                ;Keypad subroutine 
                Chk_Keys
                	movlw	.0		;wait until no key pressed 
                	movwf	PORTD		;set all output pins (row) low 
                	movf	PORTD,0
                	andlw	0xF0
                	sublw	0xF0
                	skpnz			; test if any key pressed 
                	goto	Keys		; if none, read keys 
                	movlw	0x14
                	call	Delay1ms		; delay20ms
                	return
                Keys        	
                	call	Scan_Keys 
                	movlw	0x10         	;check for no key pressed 
                	subwf	key, w
                	btfss	STATUS, Z 
                	goto	Key_Found 
                	movlw	0x14
                	call	Delay1ms
                	goto	Keys
                
                Key_Found: 	
                	movf	key,w 
                	andlw	0x0f 
                	movwf	temp
                	call	Key_Table      	;lookup key in table    
                	movwf	key         	;save back in key 
                	return            		;key pressed now in W 
                
                Scan_Keys   	
                	movlw	0x0F
                	movwf	PORTD      		;set all output lines high 
                
                	movlw	0x04 
                	movwf	rows         	;set number of rows 
                	bcf	STATUS, C      	;put a 0 into carry 
                Scan        
                	rrf	PORTD,1 
                	bsf	STATUS, C      	;follow the zero with ones 
                ;comment out next two lines for 4x3 numeric keypad. 
                	btfss	Col4 
                	return
                	incf	key,1
                	btfss	Col3 
                	return
                	incf	key,1 
                	btfss	Col2 
                	return
                	incf	key,1 
                	btfss	Col1 
                	return
                	incf	key,1 
                	decfsz	rows,1 
                	goto	Scan 
                	
                	return
                
                Key_Table  
                	movlw	high(Key_Table)
                	movwf	PCLATH
                	movf	temp,0
                	addwf	PCL,1
                	retlw	'C'
                	retlw	'B'
                	retlw	'0'
                	retlw	'A'
                	retlw	'D'
                	retlw	'9'
                	retlw	'8'
                	retlw	'7'
                	retlw	'E'
                	retlw	'6'
                	retlw	'5'
                	retlw	'4'
                	retlw	'F'
                	retlw	'3'
                	retlw	'2'
                	retlw	'1'

                Mục đích chương trình của tớ như sau: Khi có phím bất kỳ được ấn thì sẽ hiển thị lên màn hình LCD. Phần điều khiển hiển thị LCD tớ đã làm và chạy tốt. Tuy nhiên phần keypad này thì không chạy đúng với ý tưởng của tớ. Đầu tiên cắm điện thì nó không hiện gì. Bấm 1 nút bất kỳ thì nó hiện khoảng 4 ký tự C, sau đó là khoảng 6 ký tự ô vuông đen xì, sau đó lại 1 loạt ký tự C nữa. Vậy chương trình của tớ sai ở chỗ nào? Cần phải sửa những gì để nó chạy đúng ý tưởng của tớ? Rất mong được các bạn giúp đỡ
                Attached Files
                Last edited by namqn; 09-08-2007, 04:46 PM.

                Comment

                • Jerry
                  Đệ tử 5 túi
                  • Sep 2006
                  • 100

                  #9
                  Xin nhờ mod edit lại giúp tớ vì tớ không biết post code làm sao cho dễ nhìn

                  namqn: việc này tôi đã từng hướng dẫn bạn trong một post cũ của bạn. Khi bạn viết bài trả lời thì phía trên khung soạn thảo sẽ có 2 hàng nút công cụ, nút có ký hiệu '#' dùng để định dạng code. Bạn chọn đoạn code cần định dạng, sau đó nhấn vào nút đó (thực chất việc làm này chỉ thêm phần tag [code] vào phía đầu và [ /code] vào phía cuối đoạn văn bản được định dạng thành code, tag [ /code] khi viết đúng sẽ không có khoảng trắng giữa hai dấu []).
                  Last edited by namqn; 09-08-2007, 04:47 PM.

                  Comment

                  • Jerry
                    Đệ tử 5 túi
                    • Sep 2006
                    • 100

                    #10
                    Cảm ơn namqn đã giúp đỡ và mình đã biết là phải làm như vậy. Tuy nhiên trong khung soạn thảo (khung lớn hẳn hoi) mình không tìm thấy ký hiệu "#". Không hiểu tại sao lại như vậy nữa. Nhưng có lẽ mình sẽ làm theo cách thứ 2 mà bạn đã chỉ dẫn là thêm phần tag [code] vào phía đầu và [ /code] vào phía cuối đoạn văn bản được định dạng thành code. Cảm ơn bạn và mình sẽ rút kinh nghiệm lần sau.

                    Comment

                    • david
                      Đệ tử 4 túi
                      • Aug 2006
                      • 81

                      #11
                      Em viết thế này có được không?

                      [IMG][/IMG]
                      Code:
                      ;========================================================
                      				TITLE		"KEYPAD_4X4"
                      				PROCESSOR	P16F877A
                      				INCLUDE		<P16F877A.inc>
                      				__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF & _LVP_OFF
                      				
                      ;==========================================================
                      ;Khai bao bien		:
                      	
                      				COT			EQU			0X20
                      				HANG		EQU			0X21
                      				QUET		EQU			0X22
                      				DEM			EQU			0X23
                      				HANG1		EQU			4
                      				HANG2		EQU			5
                      				HANG3		EQU			6
                      				HANG4		EQU			7
                      
                      ;=============================================================
                      ;Chuong trinh chinh
                      ;=============================================================
                      
                      				ORG			0X0000
                      				GOTO		MAIN
                      				ORG			0X0005
                      MAIN
                      				BANKSEL		TRISA
                      				CLRF		TRISB
                      				CLRF		TRISD
                      				BANKSEL		PORTA
                      				CLRW
                      				MOVWF		PORTB
                      				MOVWF		PORTD
                      				MOVWF		COT
                      				MOVWF		HANG
                      				MOVWF		DEM
                      				MOVLW		B'00000001'
                      				MOVWF		QUET
                      	LOOP
                      				MOVF		QUET,0
                      				MOVWF		PORTB
                      				BANKSEL		TRISA
                      				MOVLW		B'11110000'
                      				MOVWF		TRISB
                      				BANKSEL		PORTB
                      				BTFSC		PORTB,HANG1
                      				CALL		HANG1_SFR
                      				BTFSC		PORTB,HANG2
                      				CALL		HANG2_SFR
                      				BTFSC		PORTB,HANG3
                      				CALL		HANG3_SFR
                      				BTFSC		PORTB,HANG4
                      				CALL		HANG4_SFR
                      				INCF		DEM,1
                      				MOVF		DEM,0
                      				XORLW		D'4'
                      				BTFSC		STATUS,Z
                      				RETLW		0X00
                      				RLF			QUET
                      				BANKSEL		TRISB	
                      				CLRF		TRISB
                      				BANKSEL		PORTB
                      				GOTO		LOOP
                      	
                      	HANG1_SFR
                      				MOVF		COT,0
                      				CALL		TABLE
                      				MOVWF		PORTD
                      				RETURN
                      	HANG2_SFR	
                      				MOVF		COT,0
                      				ADDLW		D'4'
                      				CALL		TABLE
                      				MOVWF		PORTD
                      				RETURN
                      	HANG3_SFR
                      				MOVF		COT,0
                      				ADDLW		D'8'
                      				CALL		TABLE
                      				MOVWF		PORTD
                      				RETURN
                      	HANG4_SFR
                      				MOVF		COT,0
                      				ADDLW		D'12'
                      				CALL		TABLE
                      				MOVWF		PORTD
                      				RETURN
                      ;-----------------------------------------------------------------
                      	TABLE
                      					ADDWF 	PCL, F 		; bat dau tai 0x80
                      					RETLW 	b'00111111' 		; 0
                      					RETLW 	b'00000110' 		; 1
                      					RETLW 	b'01011011' 		; 2
                      					RETLW 	b'01001111' 		; 3
                      					RETLW 	b'01100110' 		; 4
                      					RETLW 	b'01101101' 		; 5
                      					RETLW 	b'01111101' 		; 6
                      					RETLW 	b'00000111' 		; 7
                      					RETLW 	b'01111111' 		; 8
                      					RETLW 	b'01101111' 		; 9
                      					RETLW 	b'01110111' 		; A
                      					RETLW 	b'01111100' 		; B
                      					RETLW 	b'00111001' 		; C
                      					RETLW 	b'01011110' 		; d
                      					RETLW 	b'01111001' 		; E
                      					RETLW 	b'01110001' 		; F
                      
                      
                      	END
                      em debug băng MPLABSIM thì thấy đúng như ý tưởng của mình,nhưng kô mô phỏng được,các bác coi dùm nhé
                      Attached Files

                      Comment

                      • Jerry
                        Đệ tử 5 túi
                        • Sep 2006
                        • 100

                        #12
                        Tớ chưa có thời gian đọc chương trình của cậu nhưng tớ thấy đây có thể là 1 lỗi:
                        - Phần cứng của cậu ko có điện trở treo ở các chân đọc về (input). Trong phần mềm cũng không thấy định nghĩa điện trở pull up của cổng B (RBPU). Cần có điện trở treo ở input để khi ko có phím bấm -> đọc được mức logic 1, khi có phím -> đọc được mức logic 0.

                        - Chưa có phần trễ chống nảy phím
                        Last edited by Jerry; 29-08-2007, 10:58 AM.

                        Comment

                        • uydanh
                          Đệ tử 4 túi
                          • Jan 2007
                          • 79

                          #13
                          Nguyên văn bởi phamthanhkhuyen View Post
                          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.

                          Comment

                          • uydanh
                            Đệ tử 4 túi
                            • Jan 2007
                            • 79

                            #14
                            Sau một tháng học PIC và tìm hiểu đoạn code trên của Nigel-đoạn code mà phamthanhkhuyen và mình đều rất không hiểu cái đoạn chk_keys : vì sao lại nhảy vào đoạn chương trình key khi không phát hiện thấy có phím nhấn, và tại sao phát hiện có phím nhấn lại nhảy đi check lại có nhấn phím hay không. Thật khó hiểu phải không các bạn? Chắc các bạn trên diễn đàn đều biết hết rồi, tới hôm nay mình mới hiểu vì sao như vậy. Mình cũng xin post giải thích lên đây luôn, để anh em nào đã từng ở trong vòng luẩn quẩn như mình và phamthanhkhuyen đỡ mất công tìm hiểu lại.
                            Câu trả lời đơn giản thế này :vì bác Nigel kỹ tính quá, trước khi bắt phím nhấn, bác Nigel lại đi kiểm tra thử trong 16 cái phím của bạn có phím nào bị kẹt không? Nghĩa là có phím nào bị nhấn ngoài mong muốn không? Nếu có thì nó cứ lặp vòng hoài , còn không bị kẹt phím mới nhảy vào đoạn chương trình tiếp theo xem thử phím nào được nhấn.
                            Phần code còn lại tương đối dễ hiểu. Mình đã thử đoạn code trên, nó chạy rất tốt.
                            Cảm ơn vì đã đọc chút đóng góp của mình, cũng coi như lời cảm ơn của mình đến diễn đàn PICVN.
                            Chúc thành công!

                            Comment

                            • Jerry
                              Đệ tử 5 túi
                              • Sep 2006
                              • 100

                              #15
                              @uy danh: Bạn có thể post đoạn chương trình mà bạn viết lên đây được không? Coi như tài liệu tham khảo cho những người đi sau.

                              Comment

                              Working...