⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keypad.asm

📁 Library for the 8051 microcontroller. such as math routine, hexBCD, LCD, Keyboard, I2C, Remote, Ke
💻 ASM
字号:
;---------------------------------------------------------------------------------------------------------------------
;Author: Ashwin
;Location: India
;Code: 4x4 matrix key pad
;Inputs: hex keypad via port1
;outputs: ASCII value of pressed button is sent through the serial port and also the hex equivalent is ouput thru p3.5 to p3.2
;--------------------------------------------------------------------------------------------------------------------                

ROW0             EQU          P1.0
                      ROW1             EQU          P1.1
                      ROW2             EQU          P1.2            
                      ROW3             EQU          P1.3

                      CLMN0            EQU          P1.7
                      CLMN1            EQU          P1.6
                      CLMN2            EQU          P1.5
                      CLMN3            EQU          P1.4

					  DIGIT            DATA         30h    ;temporary storage of pressed key
					  ALERT            EQU          P3.7   ;goes low when any key's pressed



org  0000h

    ljmp ks_main

org 0030h

;_________________________________________________________________
;----------SERIAL PORT INITIALISATION STARTS HERE-----------------
;_________________________________________________________________


s9k_main:           mov tmod,#20h         ;timer_0 in mode2 (8bit auto reload)
                    mov th1,#0fdh           ;set baud to 9600
                    mov scon,#50h         ;serial mode1 (8bit data varialble baud)
                    setb tr1                    ;start timer_0
                    ret


;--------------SERIAL TRANSMIT SUBROUTINE-------------------------



tx_main:            mov sbuf,a
tx_loop:            jnb TI,tx_loop
                    clr TI
                    ret


;--------------SERIAL RECIEVE SUBROUTINE--------------------------



rx_main:            clr a
rx_loop:            jnb ri,rx_loop
                    mov a, sbuf
	                clr ri
	                ret

;------------------------------20ms delay----------------------------------

delay_20ms:         push 00
                    push 01
                    mov r0,#36
delay_20ms_loop1:   mov r1,#255
delay_20ms_loop2:   djnz r1,delay_20ms_loop2
                    djnz r0,delay_20ms_loop1 
                    pop 01
                    pop 00
                    ret

;------------------------display subroutine--------------------------------

disp_message:       push acc

disp_message_loop1: mov a, #00h	; reset accumulator	
		            movc a,@a+dptr
					cjne a,#00h,disp_message_loop2

					pop acc
					ret

disp_message_loop2: mov sbuf,a
                    acall tx_main
		            inc dptr
					;clr ti      ;ti was setting up automatically.
		            sjmp disp_message_loop1
		            
disp_pressed:DB"   Key pressed is:  ",00h

;----------------packed ascii to hex conversion--------------------

ascii2hex:       push acc
                  
				 mov a,DIGIT
				 subb a,#30h
				 mov b,a
				 anl a,#10h
				 cjne a,#00h,ascii2hex_loop2
				 mov a,b
				
ascii2hex_loop1: mov DIGIT,a
                 pop acc
				 ret

ascii2hex_loop2: mov a,DIGIT
                 subb a,#37h
				 sjmp ascii2hex_loop1
 
;------------------send pressed button via p3----------------------

send4x4_parallel: push acc
                  mov a,Digit
					 
				  rrc a
				  mov p3.5,c	   ;LSB
				  rrc a
				  mov p3.4,c
				  rrc a 
				  mov p3.3,c
				  rrc a
				  mov p3.2,c	   ;MSB
				 
				  pop acc
				  ret
;_________________________________________________________________
;-------------------------main code------------------------------
;_________________________________________________________________


ks_main:    mov p1,#0ffh					;make input ports
            ;mov p3,#00h	;make output ports; never make this mistake => 3.0 n 3.1 are serial pins
			setb ALERT						              
            acall s9k_main
ks_main1:	mov p1,#0f0h                    ;all columns high n rows low
            mov a,p1
            anl a,#11110000b                ;consider only columns
            cjne a,#11110000b,ks_main1      ;initially check for all keys released
;-------------------------------------------------------------------                      
ks_loop1:   acall delay_20ms
            mov a,p1
            anl a,#11110000b                            ;scan columns
            cjne a,#11110000b,debounce         ;if key pressed, check debounce
            sjmp ks_loop1                       ;if not, keep checking for key pressed
;-------------------------------------------------------------------
debounce:   acall delay_20ms
            mov a,p1
            anl a,#11110000b 
            cjne a,#11110000b,check_row
            sjmp ks_loop1
;--------------------------------------------------------------------
check_row:  mov dptr,#disp_pressed
            acall disp_message
						
            clr ROW0
			setb ROW1
			setb ROW2
			setb ROW3

			mov a,p1
            anl a,#11111110b 			 ;test row zero
            cjne a,#11111110b,row_0
;--------------------------------------------------------------------			
			setb ROW0
			clr ROW1
			setb ROW2
			setb ROW3
			
            mov a,p1
            anl a,#11111101b 			 ;test row one
            cjne a,#11111101b,row_1
;---------------------------------------------------------------------
            setb ROW0
			setb ROW1
			clr ROW2
			setb ROW3
			
            mov a,p1
            anl a,#11111011b			 ;test row two
            cjne a,#11111011b,row_2
;--------------------------------------------------------------------- 			
			setb ROW0
			setb ROW1
			setb ROW2
			clr ROW3
			
            mov a,p1
            anl a,#11110111b  		    ;test row three
            cjne a,#11110111b,row_3
;----------------------------------------------------------------------
            sjmp ks_loop1
;----------------------------------------------------------------------
row_0:      mov dptr,#disp_kcode0
             sjmp find_num

row_1:      mov dptr,#disp_kcode1
             sjmp find_num

row_2:      mov dptr,#disp_kcode2
             sjmp find_num
			
row_3:      mov dptr,#disp_kcode3
             sjmp find_num
;----------------------------------------------------------------------
find_num:   rlc a
            jnc found_num      ;which column is pressed/grounded
            inc dptr
            sjmp find_num
;----------------------------------------------------------------------
found_num:  clr ALERT ;notify main MC that key has been pressed
            
			clr a
            movc a,@a+dptr
			mov DIGIT,a
			acall tx_main     ;send pressed button to serial port
			acall ascii2hex
			acall send4x4_parallel
			
			setb ALERT  ;bring keypad module to waiting state
;-----------------------------------------------------------------------
            jmp ks_main1
;-----------------------------------------------------------------------
disp_kcode0:DB'0','1','2','3'
disp_kcode1:DB'4','5','6','7' 
disp_kcode2:DB'8','9','A','B' 
disp_kcode3:DB'C','D','E','F' 
;-----------------------------------------------------------------------

end   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -