??? 06/23/06 12:52 Read: times |
#118943 - FINAL MODIFIES CODE ... have a look Responding to: ???'s previous message |
DELAY_HIGH EQU 003H DELAY_LOW EQU 018H FLAG_0 EQU 031H FLAG_1 EQU 032H FLAG_2 EQU 033H FLAG_3 EQU 034H FLAG_4 EQU 035H FLAG_5 EQU 036H FLAG_6 EQU 037H FLAG_7 EQU 038H FLAG_INVALIDKEY EQU 039H FLAG_PUSH EQU 040H NEWKEY EQU 041H ORG 000H MOV SP,#050H LJMP START ORG 000BH ACALL INTERRUPT_0 RETI ORG 001BH INTERRUPT_1: PUSH ACC PUSH PSW CLR TR1 MOV PSW,#00H ACALL KEYPRESSED; ; to check whether any key is pressed or not JNZ CALCULATE ; if key is pressed then jump to calculate to check is the key ; pressed is valid key or the previous key is kept pressed till ; now JMP ALTER; ; If no key is pressed then clear the flag which check whether the ; previous key is kept pressed till now CALCULATE: ACALL KEYPRESSED ; again check whether key is pressed or not JZ ALTER ; if no key is pressed then jump tp clear the flags and start the ; TIMER 1 again ACALL CONVERT ; if the key is pressed then check the key pressed is a valid key ; or not depending on the flag FLAG_INVALIDKEY JBC FLAG_INVALIDKEY,ALTER ; if this flag is set then the key is invalid and go to ALTER ACALL TIMER_0 ;if the key pressed is valid then jump to TIMER 0 for the debounce delay POP ACC POP PSW RETI ALTER: CLR FLAG_PUSH ;clear this flag indicating that the previous key is not being ; kept pressed and the key which is pressed is now released AGAIN: ACALL TIMER_1 ; call to timer 1 for again scanning the keys POP PSW POP ACC RETI INTERRUPT_0: PUSH ACC PUSH PSW MOV PSW,#00H CLR TR0 ACALL KEYPRESSED ;chekh whhether the key is pressed or not again JZ ALTER_1 ;if not pressed then jump to ALTER 1 for clearing the flags ; and call to TIMER 1 agan for scanning the key's ACALL CONVERT ;if key is pressed check it is valid or not JBC FLAG_INVALIDKEY,ALTER_1 ; invalid key indication if this flag is set JB FLAG_PUSH,COMPARE ; if this flag is found set then it means that the key found ; to be pressed is the same key previously kept pressed SETB FLAG_PUSH ; if FLAG_PUSH is not found to be set then it means that the ; valid key is a new key MOV NEWKEY,A ; move this newkey value to the flag NEWKEY JMP HOME ; jump to home COMPARE: CJNE A,NEWKEY,CLEAR ; if the FLAG_PUSH is found to be set then control comes to this ; statement for checking whether the key kept pressed for a long time ; is the previous one or not JMP AGAIN_1 ; if it is the same key kept pressed then do nothing and ; again call to TIMER 1 so that scanning of keys can be done again ; but dont clear the FLAG_PUSH flag this time because the key kept ;pressed has not indicated to be released till now HOME: JB ACC.0,COOL_0; if these bits are ON then it means JB ACC.1,COOL_1; which key is pressed at this moment JB ACC.2,COOL_2; and accordingly jump to that JB ACC.3,COOL_3; JB ACC.4,COOL_4 JB ACC.5,COOL_5 JB ACC.6,COOL_6 JB ACC.7,COOL_7 CLEAR: CLR FLAG_PUSH ; If the key being kept pressed is not the same previous key then ; it means that the previous key kept pressed has been released ; and this is the new key which is pressed and it is valid ... so ; jump to HOME JMP HOME WORLD: MOV R0,A ; if the key is pressed second time then MOV A,P2 ; make the corresponding LED OFF while all ORL A,R0 ; other LED's are not been effected at all XRL A,R0 MOV P2,A JMP STATUS ;jump to status to CLEAR the flag which indicated the key is being pressed for the ; 1st time or 2nd time UNIVERSE: ORL A,P2 ; If the control comes here then it means that the key being pressed is pressed for ; the first time and so the corresponding LED is maked ON MOV P2,A JMP AGAIN_1 ALTER_1: CLR FLAG_PUSH AGAIN_1: ACALL TIMER_1 POP PSW POP ACC RET COOL_0: JB FLAG_0,WORLD ; if this flag is found to be set then it means the key is being pressed ;previously and so jump to WORLD for making OFF LED that is corresponding to ; this key SETB FLAG_0 ; set this flag coz the key is pressed fot the 1st time JMP UNIVERSE ; jump to universe to make the corrersponding LED ON COOL_1: JB FLAG_1,WORLD SETB FLAG_1 JMP UNIVERSE COOL_2: JB FLAG_2,WORLD SETB FLAG_2 JMP UNIVERSE COOL_3: JB FLAG_3,WORLD SETB FLAG_3 JMP UNIVERSE COOL_4: JB FLAG_4,WORLD SETB FLAG_4 JMP UNIVERSE COOL_5: JB FLAG_5,WORLD SETB FLAG_5 JMP UNIVERSE COOL_6: JB FLAG_6,WORLD SETB FLAG_6 JMP UNIVERSE COOL_7: JB FLAG_7,WORLD SETB FLAG_7 JMP UNIVERSE STATUS: JBC FLAG_0,AGAIN_1; flag is cleared to make it fresh key JBC FLAG_1,AGAIN_1 JBC FLAG_2,AGAIN_1 JBC FLAG_3,AGAIN_1 JBC FLAG_4,AGAIN_1 JBC FLAG_5,AGAIN_1 JBC FLAG_6,AGAIN_1 JBC FLAG_7,AGAIN_1 KEYPRESSED: MOV A,P1; as the PORT 1 is made as an input PORT so all the bits are high ... the key pressed ; bit will be low so the value is transfered to ACCUMULATOR for further processing CPL A ; the value in ACC is complimented coz all the bits in PORT 1 are high as it is an ; input port RET START: MOV IE,#08AH MOV TMOD,#011H MOV P1,#0FFH; make PORT 1 as an input port MOV P2,#00H MOV R0,#00H MOV R7,#00H CLR FLAG_0 CLR FLAG_1 CLR FLAG_2 CLR FLAG_3 CLR FLAG_4 CLR FLAG_5 CLR FLAG_6 CLR FLAG_7 ACALL TIMER_1 KEY: MOV A,P1 CPL A JMP KEY TIMER_0: MOV TL0,#DELAY_LOW MOV TH0,#DELAY_HIGH SETB TR0 RET TIMER_1: MOV TL1,#0E0H MOV TH1,#0B1H SETB TR1 RET CONVERT: CLR FLAG_INVALIDKEY ; this subrountine check the validity of the key that is pressed ... and ; indicates it by the flag FLAG_INALIDKEY CJNE A,#01H,SECOND RET SECOND: CJNE A,#02H,THIRD RET THIRD: CJNE A,#04H,FOURTH RET FOURTH: CJNE A,#08H,FIVE RET FIVE: CJNE A,#010H,SIX RET SIX: CJNE A,#020H,SEVEN RET SEVEN: CJNE A,#040H,EIGHT RET EIGHT: CJNE A,#080H,BAD RET BAD: SETB FLAG_INVALIDKEY RET ;************************************************************************************************ ** END |