PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > MPASM

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

MPASM Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 12-06-2007, 12:53 PM   #1
phamthanhkhuyen
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 25
:
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
phamthanhkhuyen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-06-2007, 01:01 PM   #2
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
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
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-06-2007, 08:25 PM   #3
phamthanhkhuyen
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 25
:
đây là sơ đồ phần cứng keypad
http://www.winpicprog.co.uk/pic_tuto...ypad_board.htm
phamthanhkhuyen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-06-2007, 02:43 PM   #4
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
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
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-06-2007, 09:07 PM   #5
phamthanhkhuyen
Đệ tử 1 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 25
:
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 ?

thay đổi nội dung bởi: phamthanhkhuyen, 24-06-2007 lúc 09:43 PM.
phamthanhkhuyen vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-06-2007, 10:51 AM   #6
Chunhatonline
Nhập môn đệ tử
 
Tham gia ngày: Apr 2006
Bài gửi: 8
:
delay nhiều thế không bắt nổi phím!
Chunhatonline vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-08-2007, 03:51 PM   #7
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
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.
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-08-2007, 12:05 PM   #8
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
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 đỡ
Hình Kèm Theo
File Type: bmp pic1.bmp (646.6 KB, 16 lần tải)

thay đổi nội dung bởi: namqn, 09-08-2007 lúc 05:46 PM.
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-08-2007, 12:08 PM   #9
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
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 []).

thay đổi nội dung bởi: namqn, 09-08-2007 lúc 05:47 PM.
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-08-2007, 10:55 AM   #10
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
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.
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-08-2007, 09:35 AM   #11
david
Đệ tử 4 túi
 
david's Avatar
 
Tham gia ngày: Aug 2006
Bài gửi: 81
:
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é
Hình Kèm Theo
File Type: jpg keypad4x4.jpg (67.7 KB, 234 lần tải)
david vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-08-2007, 11:49 AM   #12
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
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

thay đổi nội dung bởi: Jerry, 29-08-2007 lúc 11:58 AM.
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-10-2007, 01:12 AM   #13
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Thumbs down

Trích:
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.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-11-2007, 11:12 PM   #14
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
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!
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-11-2007, 08:18 AM   #15
Jerry
Đệ tử 5 túi
 
Jerry's Avatar
 
Tham gia ngày: Sep 2006
Bài gửi: 100
:
@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.
__________________
Do more than exist, LIVE
Jerry vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 12:55 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam