| ??? 12/30/09 22:18 Read: times |
#172050 - Err Responding to: ???'s previous message |
;//THIS IS A PRGRAM THAT DISPLAYS THE NUMBER THAT IS PRESSED ON THE KEYPAD ON THE LCD
;//***********************************************************************************
;//==========================================
; LCD IS USING PORT 1 & 2
; KEYPAD IS USING PORT 3
;//==========================================
ORG 0
LJMP MAIN ;BYPASS INTERRUPT VECTOR TABLE
;///MAIN PROGRAM///
ORG 100H
RS EQU P2.0
RW EQU P2.1
EN EQU P2.2
MAIN: MOV SP,#256-32 ;DEFINE STACK 32BYTES
MOV P3,#0FFh ; CONFIGURE LOWER NIBBLE OF P3
;INITIALIZATION START FOR LCD
MOV A,#038H
LCALL COMW
MOV A,#00CH
LCALL COMW
MOV A,#001H
LCALL COMW
MOV A,#006H
LCALL COMW
MOV A,#083H
LCALL COMW
;INITIALIZATION END FOR LCD
;=============================================================
; KEYPAD PROGRAM
;=============================================================
K1: ;TO ENSURE THAT ALL SWITCHES ARE OPEN
MOV P3,#0 ;%
MOV A,P3
ANL A,#00001111B ;DISABLE UPPER NIBBLE
CJNE A,#00001111B, K1
;
K2: ;CHECK SWITCHES TO SEE IF ONE IS CLOSED
ACALL DELAY
MOV A,P3
ANL A,#00001111B
CJNE A,#00001111B,OVER
SJMP K2
;
OVER: ACALL DELAY
MOV A,P3
ANL A,#00001111B
CJNE A,#00001111B,OVER1
SJMP K2
;
OVER1: MOV P3,#11111110B
MOV A,P3
ANL A,#00001111B
CJNE A,#00001111B,ROW_0
;
MOV P3,#11111101B
MOV A,P3
ANL A,#00001111B
CJNE A,#00001111B,ROW_1
;
MOV P3,#11111011B
MOV A,P3
ANL A,#00001111B
CJNE A,#00001111B,ROW_2
;
MOV P3,#11110111B
MOV A,P3
ANL A,#00001111B
CJNE A,#00001111B,ROW_3
;
LJMP K2
;
ROW_0: MOV DPTR,#KCODE0
SJMP FIND
;
ROW_1: MOV DPTR,#KCODE1
SJMP FIND
;
ROW_2: MOV DPTR,#KCODE2
SJMP FIND
;
ROW_3: MOV DPTR,#KCODE3
SJMP FIND
;
;
FIND: RRC A
JNC MATCH
INC DPTR
SJMP FIND
MATCH: CLR A
MOVC A,@A+DPTR
ACALL DATAW, A ;//ACALL DATAWRITE,A TO SEND DATA FROM ACCUMULATOR TO LCD
LJMP K1
;
;///DELAY SUB-ROUTINE///
;
DELAY: MOV R2,#5
HERE: NOP
DJNZ R3,HERE
RET
;
;
KCODE0: DB '7','8','9'
KCODE1: DB '4','5','6'
KCODE2: DB '1','2','3'
KCODE3: DB ' ','0','='
;===========================================
; LCD PROGRAM
;===========================================
MOV A,#0C1H
ACALL DISP_STRING
HAWN: SJMP HAWN
AGAIN: SJMP AGAIN ;endless loop
COMW: MOV P1,A ;command write sequence
CLR RS ;RS=0 for command
CLR RW ;R/W=0 to write to LCD
SETB EN ;E=1 for H-to-L pulse
CLR EN ;E=0 ,latch in
LCALL DELAY2
RET
DATAW: MOV P1,A ;data write sequence
SETB RS ;RS=1 for data
CLR RW ;R/W=0 to write to LCD
SETB EN ;E=1 for H-to-L pulse
CLR EN ;E=0 ,latch in
LCALL DELAY2
RET
DISP_STRING: CLR A ;A=0
MOV R5,#00H ;R5=0
NEXT_CHAR: INC R5 ;R5+1
MOVC A,@A+DPTR
ACALL DATAW
MOV A,R5
CJNE R5,#0EH,NEXT_CHAR
RET
DELAY2: MOV R6,#50 ;simple delay routine
HERE2: MOV R7,#255 ;for 0.0124S or 124ms
HERE3: DJNZ R7,HERE3
DJNZ R6,HERE2
RET
;=============================================================
END
;=============================================================
It looks to me like you have just pushed together two separate subroutines from a book, one for a display, one for a keyboard, and you haven't given any thought to how they should be called. You HAVE two infinite loops, which you HAVE identified as infinite loops. So how are you supposed to get out of them, if and when you hit them ? Where is there a call TO your keyscan routine, to get a character, and then to your display routine to place it ? What happens after the first time ? I don't recognise "ACALL DATAW, A " as legal '52 assembler. What are you using ? Are you sure that what you have already actually, really works ?? Steve |
| Topic | Author | Date |
| keypad and lcd with 8952 | 01/01/70 00:00 | |
| One thing at a time | 01/01/70 00:00 | |
| Err | 01/01/70 00:00 | |
| eh | 01/01/70 00:00 | |
| most of us do | 01/01/70 00:00 | |
| Assembler. | 01/01/70 00:00 | |
| Literature | 01/01/70 00:00 | |
only if you understand what you are doing | 01/01/70 00:00 |



