| ??? 07/21/06 20:15 Read: times |
#120801 - solution Responding to: ???'s previous message |
Here's the complete code. The problem area: really 'THE programmer's blindness'. I went wrong in maskin the columns. Anyways, the complete working code is here with the comments. The output: The ASCII value of pressed button is send via serial port and also the 4bit hex eqvivalent is put onto p3.5 thru p3.2. One can use this as a seperate module and interface the same with the main module. p3.7 is used to inidicate that a key has been pressed so that the main module can know when a key is pressed by monitoring p3.7
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
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
|
| Topic | Author | Date |
| hex key pad code not working | 01/01/70 00:00 | |
| Explanation | 01/01/70 00:00 | |
| what, how | 01/01/70 00:00 | |
| each line of code must be justified | 01/01/70 00:00 | |
| correction made, still not workin | 01/01/70 00:00 | |
| Lookup table | 01/01/70 00:00 | |
| hyperlink | 01/01/70 00:00 | |
| of course not, | 01/01/70 00:00 | |
| shall I spoil the fun? | 01/01/70 00:00 | |
| code workin partially | 01/01/70 00:00 | |
| be specific | 01/01/70 00:00 | |
| specific | 01/01/70 00:00 | |
| check it in the simulator | 01/01/70 00:00 | |
| Use serial port for debugging | 01/01/70 00:00 | |
| confidence | 01/01/70 00:00 | |
| I wouldn't do that | 01/01/70 00:00 | |
| problem with find_num subroutine? | 01/01/70 00:00 | |
| Code presentation | 01/01/70 00:00 | |
| sorry it's 'hyper terminal' | 01/01/70 00:00 | |
| Problem solved | 01/01/70 00:00 | |
| which conclusion, please tell | 01/01/70 00:00 | |
| Problem is NOT solved. | 01/01/70 00:00 | |
| Post the solution please | 01/01/70 00:00 | |
| solution | 01/01/70 00:00 | |
| a 'killer solution' | 01/01/70 00:00 | |
| killer???? | 01/01/70 00:00 | |
you 'eat' the main | 01/01/70 00:00 |



