سلام دوستان
من يه مشكل دارم اميدوارم كه اينجا كمكم كنيد.
من يه مدار براي تعيين عدد اول با 8051 درست كردم ولي درست كار نميكنه. هميشه يه عدد ثابت نشون ميده.
برنامشو ميذارم لطف كنيد ببيندي برنامش مشكلي نداره. ممنون ميشم.
; Mina Computer 8051 Code
; Create By Masoud Samadi Group
; copy Right 2006
;
;Portable :
;
; Port 0 = Seven Segment Data Bus
; Port 1 = Seven Segment Address Adapter (0 .. 2)
; Prot 2 = LPT 8 Bit Data
; Port 3 = Control For Start / LED Red / LED Green ( 0 = IN ST C ) | ( 1 = Green LED ) | ( 2 = Red LED )
ORG 0 ; STRAT FROM ADDRESS 0 PROGRAM FALSH MEMORY
MOV P3,#0FFH ; MACK PORT 3 INPUT
MOV P2,#0FFH ; MACK PORT 2 INPUT
MOV R1,#01000000B ; REGISTRY 1 IS DATA SEGMENT 1 ( DATA SHOW ZERO )
MOV R2,#01000000B ; REGISTRY 2 IS DATA SEGMENT 2 ( DATA SHOW ZERO )
MOV R3,#01000000B ; REGISTRY 3 IS DATA SEGMENT 3 ( DATA SHOW ZERO )
START :
LA1 : LCALL DISPLAY
JB P3.0,LA1 ; WAIT FOR START ( READ CONTROL DATA and WHEN P3.0 = 0 THEN START)
MOV R1,#01000000B ; REGISTRY 1 IS DATA SEGMENT 1 ( DATA SHOW ZERO )
MOV R2,#01000000B ; REGISTRY 2 IS DATA SEGMENT 2 ( DATA SHOW ZERO )
MOV R3,#01000000B ; REGISTRY 3 IS DATA SEGMENT 3 ( DATA SHOW ZERO )
MOV P3,#0FFH ; MACK P3 OUT PUT & LEDs IS OFF
MOV R7,P2
CJNE R7,#1,LET1 ; READ DATA ( R7 IS MAIN DATA )
LCALL COUNTER
LJMP EDPRG_G
LET1 :
CJNE R7,#0,LET2 ; READ DATA ( R7 IS MAIN DATA )
LJMP EDPRGerr
LET2 :
MOV A,R7
MOV B,#2
DIV AB
MOV R6,A
MOV A,B
CJNE A,#0,LA2
LJMP LA3
LA2 : INC R6
LA3 : INC R6
MOV R5,#2 ; REGISTRE 5 IS CONTER
RETEST : LCALL DISPLAY
MOV A,R6
CJNE A,5,LA4
LJMP EDPRG_R
LA4: MOV A,R7
MOV B,R5
DIV AB
LCALL COUNTER
MOV A,B
CJNE A,#0,LA5
LJMP EDPRG_G
LA5: INC R5
LCALL DELAYRED
LJMP RETEST
EDPRG_R :
LCALL COUNTER
LCALL DELAYRED
MOV P3,#0FFH
CLR P3.2
LJMP START
EDPRG_G :
LCALL DELAYRED
LCALL COUNTER
MOV P3,#0FFH
CLR P3.1
LJMP START
EDPRGerr : MOV P3,#0FFH
LCALL DATAiserr
LCALL DELAYRED
CLR P3.1
CLR P3.2
LCALL START
;--------------------------------------- END -----------------------------------
DELAYRED : ; WAIT 1s FOR RED LED
PUSH 7
PUSH 6
PUSH 5
MOV P3,#0FFH
CLR P3.2
MOV R7,#1
L25 : MOV R6,#5
L26 : MOV R5,#50
L27 : LCALL DISPLAY
DJNZ R5,L27
DJNZ R6,L26
DJNZ R7,L25
SETB P3.2
MOV R7,#1
L30 : MOV R6,#5
L31 : MOV R5,#50
L32 : LCALL DISPLAY
DJNZ R5,L32
DJNZ R6,L31
DJNZ R7,L30
POP 5
POP 6
POP 7
RET
DELAY30NS : ; DELAY FOR MULTIPLEX 30 nS
Push 1
Push 2
Push 3
MOV R2,#1
L21 : MOV R3,#10
L22 : MOV R1,#10
L23 : NOP
NOP
DJNZ R1,L23
DJNZ R3,L22
DJNZ R2,L21
Pop 3
Pop 2
Pop 1
RET
DISPLAY : ; MULTIPLEX DISPLAY DATA & ADDRESS
SETB P1.0 ; SET ADDRESS DATA
CLR P1.1 ; SET ADDRESS DATA
CLR P1.2 ; SET ADDRESS DATA
MOV P0,R1 ; SEND SEGMENT 1 DATA
LCALL DELAY30NS
CLR P1.0 ; SET ADDRESS DATA
SETB P1.1 ; SET ADDRESS DATA
CLR P1.2 ; SET ADDRESS DATA
MOV P0,R2 ; SEND SEGMENT 2 DATA
LCALL DELAY30NS
CLR P1.0 ; SET ADDRESS DATA
CLR P1.1 ; SET ADDRESS DATA
SETB P1.2 ; SET ADDRESS DATA
MOV P0,R3 ; SEND SEGMENT 3 DATA
LCALL DELAY30NS
RET
COUNTER :
PUSH ACC
CJNE R1,#10010000B,CLA1
CJNE R2,#10010000B,CLA1
MOV A,R3
MOV R4,A
LCALL CONVERT
MOV A,R4
MOV R3,A
CLA1 : CJNE R1,#10010000B,CLA2
MOV A,R2
MOV R4,A
LCALL CONVERT
MOV A,R4
MOV R2,A
CLA2 : MOV A,R1
MOV R4,A
LCALL CONVERT
MOV A,R4
MOV R1,A
POP ACC
RET
Convert : ; COUNTER 1 BIT ( R1 = R1 + 1)
CJNE R4,#01000000B,Conv1
MOV R4,#11111001B
RET
Conv1: CJNE R4,#11111001B,Conv2
Mov R4,#00100100B
RET
Conv2: CJNE R4,#00100100B,Conv3
MOV R4,#10110000B
RET
Conv3: CJNE R4,#10110000B,Conv4
MOV R4,#00011001B
RET
Conv4: CJNE R4,#00011001B,Conv5
MOV R4,#10010010B
RET
Conv5: CJNE R4,#10010010B,Conv6
MOV R4,#00000010B
RET
Conv6: CJNE R4,#00000010B,Conv7
MOV R4,#11111000B
RET
Conv7: CJNE R4,#11111000B,Conv8
MOV R4,#00000000B
RET
Conv8: CJNE R4,#00000000B,Conv9
MOV R4,#10010000B
RET
Conv9: MOV R4,#01000000B
RET
DATAiserr :
MOV R1,#10101111B
MOV R2,#10101111B
MOV R3,#10000110B
RET
End ; End of Program