| ??? 11/07/03 06:23 Read: times |
#57997 - Help me,please |
I wrote my code for small project,controlled 10 relays in sequence from 1 to 10 and loop again,
time on relay and off relay can be set via 4 button P1.0-P1.3. in main label it scan for pressed button if there is a button pressed then jump to subroutine , but now when i tested program, it does not recognized the button was pressed or it doesnot jump to subroutine i wanted i do not have much experience in that field Could anyone give me any advice ? Thanks! ///////////////////////////////////////////////////////// Here are my code: #include "C:RigelReads51Includesfr51.inc" HUNDRED EQU 100 COUNT EQU 10000 LCD_DATA EQU 90H ; P1 DB4 EQU 94H ;P1.4 DB5 EQU 95H;P1.5 DB6 EQU 96H;P1.6 DB7 EQU 97H;P1.7 RS EQU B3H ;P3.3 RW EQU B4H;P3.4 EN EQU B5H;P3.5 P1.0 BIT 90H P1.1 BIT 91H P1.2 BIT 92H P1.3 BIT 93H ORG 00H LJMP MAIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WRITE_2_NIBBLES: PUSH ACC ;Save A for low nibbleORL LCD_DATA,#0F0h ;Bits 4..7 <- 1 ORL LCD_DATA,#F0h; set high nible p1 len 1 ANL A,#F0h ;lay 4 bit cao A MOV LCD_DATA,A ;High nibble to display SETB EN CLR EN POP ACC ;Prepare to send SWAP A ;...second nibble ORL LCD_DATA,#F0h ; Bits 4...7 <- 1 ANL A,#F0h ; Don't affect bits 0...3 MOV LCD_DATA,A ;Low nibble to display SETB EN CLR EN RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; READ_LCD: mov LCD_DATA,#0f0h setb EN mov a,LCD_DATA clr EN anl a,#0f0h push acc setb EN mov a,LCD_DATA clr EN anl a,#0f0h swap a mov r0,a pop acc orl a,r0 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;//**** Wait LCD until it don't busy WAIT_LCD: setb RW acall READ_LCD jb acc.7,WAIT_LCD clr RW ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAYMS: ;millisecond delay routine ; ;uses R7 MOV R7,#00H ;put 00H in register R7 LOOPA: INC R7 ;increment R7 MOV A,R7 ;move R7 to Accumlator CJNE A,#0FFH,LOOPA ;jump to LOOPA if R7 not equal to #FFH RET ;return ; ;************************************************************************** INIT_LCD: CLR RS ; P3.3 = 0 CLR RW ;P3.4 =0 CLR EN ;P3.5 = 0 MOV A,#28h LCALL WRITE_2_NIBBLES LCALL WAIT_LCD MOV A,#28h LCALL WRITE_2_NIBBLES LCALL WAIT_LCD MOV A,#28h LCALL WRITE_2_NIBBLES LCALL WAIT_LCD MOV A,#0Eh ; turn LCD on LCALL WRITE_2_NIBBLES LCALL WAIT_LCD MOV A,#06h ; move cursor to the right LCALL WRITE_2_NIBBLES LCALL WAIT_LCD RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CLEAR_LCD: CLR RS MOV A,#01h LCALL WRITE_2_NIBBLES ;Write A as two separate nibbles to LCD LCALL WAIT_LCD RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WRITE_TEXT: SETB RS LCALL WRITE_2_NIBBLES LCALL WAIT_LCD RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;dat thoi gian on LINE2: clr rs mov A,#C0h LCALL WRITE_2_NIBBLES LCALL WAIT_LCD RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; POSITION: CLR RS MOV A,#0C9h LCALL WRITE_2_NIBBLES LCALL WAIT_LCD ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SET_ON: LCALL CLEAR_LCD MOV A,#'S' ;write L LCALL WRITE_TEXT MOV A,#'E' ;write C LCALL WRITE_TEXT MOV A,#'T' ;write D LCALL WRITE_TEXT MOV A,#' ' ;write LCALL WRITE_TEXT MOV A,#'O' ;write E LCALL WRITE_TEXT MOV A,#'N' ;write x LCALL WRITE_TEXT MOV A,#' ' ;write a LCALL WRITE_TEXT MOV A,#'T' ;write m LCALL WRITE_TEXT MOV A,#'I' ;write p LCALL WRITE_TEXT MOV A,#'M' ;write l LCALL WRITE_TEXT MOV A,#'E' LCALL LINE2 MOV A,#'T' LCALL WRITE_TEXT MOV A,#'I' LCALL WRITE_TEXT MOV A,#'M' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'N' LCALL WRITE_TEXT MOV A,#':' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,50h ; doc gia tri cua time on LCALL HEX_ASCI LCALL WRITE_TEXT MOV A,B LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'S' LCALL WRITE_TEXT ;LCALL WAIT_LCD ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;dat thoi gian off INC_ON: ; tang gia tri dat push acc MOV a,50H INC a mov 50H,a pop acc ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DEC_ON: ; tang gia tri dat push acc MOV a,50H DEC a mov 50H,a pop acc ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SET_OFF: LCALL CLEAR_LCD MOV A,#'S' ;write L LCALL WRITE_TEXT MOV A,#'E' ;write C LCALL WRITE_TEXT MOV A,#'T' ;write D LCALL WRITE_TEXT MOV A,#' ' ;write LCALL WRITE_TEXT MOV A,#'O' ;write E LCALL WRITE_TEXT MOV A,#'F' ;write x LCALL WRITE_TEXT MOV A,#'F' ;write x LCALL WRITE_TEXT MOV A,#' ' ;write a LCALL WRITE_TEXT MOV A,#'T' ;write m LCALL WRITE_TEXT MOV A,#'I' ;write p LCALL WRITE_TEXT MOV A,#'M' ;write l LCALL WRITE_TEXT MOV A,#'E' LCALL LINE2 MOV A,#'T' LCALL WRITE_TEXT MOV A,#'I' LCALL WRITE_TEXT MOV A,#'M' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'F' LCALL WRITE_TEXT MOV A,#'F' LCALL WRITE_TEXT MOV A,#':' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,51h ; doc gia tri cua time on LCALL HEX_ASCI LCALL WRITE_TEXT MOV A,B LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'P' LCALL WRITE_TEXT ;LCALL WAIT_LCD ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INC_OFF: ; tang gia tri dat push acc MOV a,51H INC a mov 51H,a pop acc ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DEC_OFF: ; tang gia tri dat push acc MOV a,51H DEC a mov 51H,a pop acc ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SET_ONP: homeon: LCALL SET_ON ;;;;;////////////////////////////////////////////////////////// ; doion: jnb 90h,giamonon;p1.0 ; jnb 91h,tangonon ; jnb 92h,thoaton ;jnb 93h,doion skip41: LCALL IN_HEX cjne a,#00000001B,skip11 ;p00 sjmp giamonon skip11: cjne a,#00000010B,skip21 ;p01 sjmp tangonon skip21:cjne a,#00000100B,skip31 ; p02 sjmp thoaton skip31:cjne a,#00001000B,skip41 ; p03 ;;;;;;;;;;///////////////////////////////////////////////// giamonon: LCALL DEC_ON SJMP homeon tangonon:LCALL INC_ON SJMP homeon thoaton:ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SET_OFFP: homeoff: LCALL SET_OFF ;;;;;;;;/////////////////////////////////////////////////////////////////// ;doioff: jnb 90h,giamoffoff;p1.0 ; jnb 91h,tangoffoff ;jnb 92h,thoatoff ;jnb 93h,doioff skip42: LCALL IN_HEX cjne a,#00000001B,skip12 ;p00 sjmp giamoffoff skip12: cjne a,#00000010B,skip22 ;p01 sjmp tangoffoff skip22:cjne a,#00000100B,skip32 ; p02 sjmp thoatoff skip32:cjne a,#00001000B,skip42 ; p03 ;;;;;;;;;;;;;;;;;;;;;;;////////////////////////////////////////////////////// giamoffoff: LCALL DEC_OFF SJMP homeoff tangoffoff:LCALL INC_OFF SJMP homeoff thoatoff: ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAIN: MOV 50h,#0 MOV 51H,#0 mov 50H,#40h ; vij tri dat thoi gian on mov 51H,#5h ; vi tri dat thoi gin off LCALL TACGIA setb P1.0 setb P1.1 setb P1.2 setb P1.3 ;;;;;;;;///////////////////////////////////////////////////////// ; skip4: LCALL IN_HEX ; cjne a,#00000001B,skip1 ;p00 ; sjmp goiseton ;skip1: cjne a,#00000010B,skip2 ;p01 ; sjmp goisetoff ;skip2:cjne a,#00001000B,skip3 ; p03 ; sjmp goibegin ;skip3:cjne a,#00000100B,skip4 ; p02 ; */ doimain:jnb P1.0,goiseton jnb P1.1,goisetoff jnb P1.3,goibegin jnb P1.2,doimain ;;;;;;///////////////////////////////////////////////////////////////////////////////////// goiseton: LCALL bounce LCALL SET_ONP goisetoff:LCALL bounce LCALL SET_OFFP goibegin:LCALL bounce LJMP BEGIN ; ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; bounce: mov psw,#08h ; use second bank of registers mov r0,#2h ; how many loops x4b: mov r2,#0ffh ; how many of loops inside loops x5b: mov r5,#0ffh ; length of each loop x6b: djnz r5,x6b ; stay here for awhile djnz r2,x5b ; loop back up so many times djnz r0,x4b ; loop to do all the loops mov psw,#00h ; change back to first register bank ret ; go back ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TACGIA: LCALL INIT_LCD LCALL CLEAR_LCD LCALL WAIT_LCD MOV A,#' ' LCALL WRITE_TEXT MOV A,#'H' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'N' LCALL WRITE_TEXT MOV A,#'G' LCALL WRITE_TEXT MOV A,#'U' LCALL WRITE_TEXT MOV A,#'Y' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#'N' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'N' LCALL WRITE_TEXT MOV A,#'G' LCALL WRITE_TEXT MOV A,#'H' LCALL WRITE_TEXT MOV A,#'I' LCALL WRITE_TEXT MOV A,#'A' LCALL WRITE_TEXT LCALL LINE2 MOV A,#' ' LCALL WRITE_TEXT MOV A,#'D' LCALL WRITE_TEXT MOV A,#'T' LCALL WRITE_TEXT MOV A,#':' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'0' LCALL WRITE_TEXT MOV A,#'9' LCALL WRITE_TEXT MOV A,#'1' LCALL WRITE_TEXT MOV A,#'2' LCALL WRITE_TEXT MOV A,#'3' LCALL WRITE_TEXT MOV A,#'2' LCALL WRITE_TEXT MOV A,#'0' LCALL WRITE_TEXT MOV A,#'8' LCALL WRITE_TEXT MOV A,#'6' LCALL WRITE_TEXT MOV A,#'4' LCALL WRITE_TEXT ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HEX_ASCI: mov b,a ; b=a ; stores Acc in B anl a,#0f0h ; a=xxxx0000 ; A && #f0h (get the high nibble) swap a ; a=0000xxxx ; swap nibbles orl a,#30h ; a=0011xxxx ; add #30h, if nibble is push acc ; 0-9 we have the ASCII value push b ; stores A and B mov b,#3ah ; stores #3ah in B div ab ; divide A/#3ah jz chin1 ; if zero, nibble < #0Ah nibble1_ok: pop B ; recover B pop ACC ; recover A add a,#07h ; adds #07h to get ASCII of A-F xch A,B sjmp nibble2 chin1: pop b ; stores B pop acc ; stores A xch a,b nibble2: anl a,#0fh ; a=0000xxxx ; A && #0fh (get low nibble) orl a,#30h ; a=0011xxxx ; add #30h, if nibble is push acc ; 0-9 we have the ASCII value push b ; stores A and B mov b,#3ah ; stores #3ah in B div ab ; divide A/#3ah jz recupera2 ; if zero, nibble < #0Ah pop b ; recover B pop acc ; recover A add a, #07h ; adds #07h to get ASCII of A-F xch a,b ret ; return to main routine recupera2: pop b ; recover B pop acc ; recover A xch a,b ret ; return to main routine ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TIMER_ON: MOV TMOD,#01h; = (TMOD & 0x0F) | 0x20; /* Set Mode (8-bit timer with reload) */ push acc mov a,r2 push acc MOV R2,#HUNDRED AGAIN: MOV TH0,HIGH(COUNT) MOV TL0,LOW(COUNT) SETB TR0; ; /* Reload TL1 to count 100 clocks */ WAIT2: jnb TF0,WAIT2 ;TL1 = TH1; clr TF0 ; /* Enable Timer 1 Interrupts */ clr TR0 ; = 1; ;/* Start Timer 1 Running */ ;cjne r2,co ; co: inc R3 djnz r2,AGAIN ; = 1; pop acc mov r2,a pop acc ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAY_ON: push acc mov a, R6 push acc MOV R6,50H timeon:LCALL TIMER_ON DJNZ R6,timeon pop acc mov r6,acc pop acc ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAY_10S: LCALL TIMER_ON LCALL TIMER_ON LCALL TIMER_ON LCALL TIMER_ON LCALL TIMER_ON LCALL TIMER_ON LCALL TIMER_ON LCALL TIMER_ON LCALL TIMER_ON LCALL TIMER_ON ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAY_1PH: LCALL DELAY_10S LCALL DELAY_10S LCALL DELAY_10S LCALL DELAY_10S LCALL DELAY_10S LCALL DELAY_10S ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAY_10PH: LCALL DELAY_1PH LCALL DELAY_1PH LCALL DELAY_1PH LCALL DELAY_1PH LCALL DELAY_1PH LCALL DELAY_1PH LCALL DELAY_1PH LCALL DELAY_1PH LCALL DELAY_1PH LCALL DELAY_1PH ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAY_OFF: push acc mov a, R6 push acc MOV R6,51H timeoff:LCALL DELAY_1PH DJNZ R6,timeoff pop acc mov r6,acc pop acc ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IN_HEX: mov r3,#2 back: lcall GET_KEY jnc IN_HEX ; neu c=0 quay lai doc DJNZ r3,back ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GET_KEY: mov a,p1 cpl a anl a,#0Fh push acc mov r4,#4 onemore:clr c rlc a jc exit djnz r4, onemore sjmp nhayrathoi exit: setb c nhayrathoi:pop acc ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BEGIN: mov 80h,#00h ;0->p0 clr b1h ; clear P3.1 mov a0h,#00h ;0-> P2 clr b0h ; ; clr P3.0 LCALL TACGIA loopbegin: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p0.0 setb 80h LCALL DELAY_ON clr 80h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p0.1 setb 81h LCALL DELAY_ON clr 81h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p0.2 setb 82h LCALL DELAY_ON clr 82h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p0.3 setb 83h LCALL DELAY_ON clr 83h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p0.4 setb 84h LCALL DELAY_ON clr 84h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p0.5 setb 85h LCALL DELAY_ON clr 85h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p0.6 setb 86h LCALL DELAY_ON clr 86h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p0.7 setb 87h LCALL DELAY_ON clr 87h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p2.0 setb A0h LCALL DELAY_ON clr A0h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p2.1 setb A1h LCALL DELAY_ON clr A1h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p2.2 setb A2h LCALL DELAY_ON clr A2h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p2.3 setb A3h LCALL DELAY_ON clr A3h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p2.4 setb A4h LCALL DELAY_ON clr A4h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p2.5 setb A5h LCALL DELAY_ON clr A5h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p2.6 setb A6h LCALL DELAY_ON clr A6h LCALL DELAY_OFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;p2.7 setb A7h LCALL DELAY_ON clr A7h LCALL DELAY_OFF Ljmp loopbegin END |
| Topic | Author | Date |
| Help me,please | 01/01/70 00:00 | |
| RE: Help me,please | 01/01/70 00:00 | |
| ridiculous. | 01/01/70 00:00 | |
| RE: Some credit | 01/01/70 00:00 | |
| RE: Help me,please | 01/01/70 00:00 | |
| RE: Help me,please | 01/01/70 00:00 | |
| \'PRE\' and \'/PRE\' HTML Tags | 01/01/70 00:00 | |
RE: \'PRE\' and \'/PRE\' HTML Tags | 01/01/70 00:00 |



