In: Computer Science
Write an asssembly languaage (805l) code for EDSIM5I that takes the input from the # keypad to and output to the liquid crystal display.
ORG 00H MOV DPTR,#LUT // moves starting address of LUT to DPTR MOV A,#11111111B // loads A with all 1's MOV P0,#00000000B // initializes P0 as output port BACK:MOV P1,#11111111B // loads P1 with all 1's CLR P1.0 // makes row 1 low JB P1.4,NEXT1 // checks whether column 1 is low and jumps to NEXT1 if not low MOV A,#0D // loads a with 0D if column is low (that means key 1 is pressed) ACALL DISPLAY // calls DISPLAY subroutine NEXT1:JB P1.5,NEXT2 // checks whether column 2 is low and so on... MOV A,#1D ACALL DISPLAY NEXT2:JB P1.6,NEXT3 MOV A,#2D ACALL DISPLAY NEXT3:JB P1.7,NEXT4 MOV A,#3D ACALL DISPLAY NEXT4:SETB P1.0 CLR P1.1 JB P1.4,NEXT5 MOV A,#4D ACALL DISPLAY NEXT5:JB P1.5,NEXT6 MOV A,#5D ACALL DISPLAY NEXT6:JB P1.6,NEXT7 MOV A,#6D ACALL DISPLAY NEXT7:JB P1.7,NEXT8 MOV A,#7D ACALL DISPLAY NEXT8:SETB P1.1 CLR P1.2 JB P1.4,NEXT9 MOV A,#8D ACALL DISPLAY NEXT9:JB P1.5,NEXT10 MOV A,#9D ACALL DISPLAY NEXT10:JB P1.6,NEXT11 MOV A,#10D ACALL DISPLAY NEXT11:JB P1.7,NEXT12 MOV A,#11D ACALL DISPLAY NEXT12:SETB P1.2 CLR P1.3 JB P1.4,NEXT13 MOV A,#12D ACALL DISPLAY NEXT13:JB P1.5,NEXT14 MOV A,#13D ACALL DISPLAY NEXT14:JB P1.6,NEXT15 MOV A,#14D ACALL DISPLAY NEXT15:JB P1.7,BACK MOV A,#15D ACALL DISPLAY LJMP BACK DISPLAY:MOVC A,@A+DPTR // gets digit drive pattern for the current key from LUT MOV P0,A // puts corresponding digit drive pattern into P0 RET LUT: DB 01100000B // Look up table starts here DB 11011010B DB 11110010B DB 11101110B DB 01100110B DB 10110110B DB 10111110B DB 00111110B DB 11100000B DB 11111110B DB 11110110B DB 10011100B DB 10011110B DB 11111100B DB 10001110B DB 01111010B END
About the program.
Firstly the program initializes port 0 as an output port by writing all 0’s to it and port 1 as an input port by writing all 1’s to it. Then the program makes row 1 low by clearing P1.0 and scans the columns one by one for low using JB instruction.If column C1 is found low, that means 1 is pressed and accumulator is loaded by zero and DISPLAY subroutine is called. The display subroutine adds the content in A with the starting address of LUT stored in DPTR and loads A with the data to which the resultant address points (using instruction MOVC A,@A+DPTR). The present data in A will be the digit drive pattern for the current key press and this pattern is put to Port 0 for display. This way the program scans for each key one by one and puts it on the display if it is found to be pressed.