ORG 0000H
SJMP START
ORG 30H
start:
setb p2.1 ;SW1 = 1
setb p2.0 ;SW2 = 1
init: mov A,#01 ;Acc =b00000001
mov r0,8 ;r0 is a counter
cpl A ;complement Acc
while: mov p1,A ;LIGHT UP RIGHTMOST LED
acall delay ;FOR A WHILE
rl A ;shift to next LED on the left
djnz r0,while ;done 8 LED?
sjmp init ;start another round
delay:
mov r1,#40h
loop: djnz r1,loop
ret
end
@Ian, is there any particular reason that you left a hole between 0000h to 0030h?
init: mov R2, #16
mov R0, #40h
mov R1, #80h
move: mov A, @R0
mov @R1, A
inc R0
inc R1
djnz R2, move
ret
; 2 digit 7 segment counter 00 to 99
; date = 22.04.2013
; phase 1: display one digit 0-F only
org 0000h
jmp start
org 0030h
sa equ 01h
sb equ 02h
sc equ 04h
sd equ 08h
se equ 10h
sf equ 20h
sg equ 40h
sdp equ 80h
start:
setb p2.0 ;Make 1st digit cathode GND
mov b, #0 ;B reg is counter
mov a, b
call display ;disp content of B
mov p1, a
loop: call delay
inc b ;counter ++
anl b, #0fh ;mask off lower nibble
mov a, b ;move to A to display
call display
mov p1, a ;display it
jmp loop
display:
inc a
movc a,@a+pc ;PC is pointing to address
ret ;after the "ret" instruction
table: db sa+sb+sc+sd+se+sf ; 0
db sb+sc ; 1
db sa+sb+sg+se+sd ; 2
db sa+sb+sc+sd+sg ; 3
db sb+sc+sf+sg ; 4
db sa+sc+sd+sf+sg ; 5
db sa+sc+sd+se+sf+sg ; 6
db sa+sb+sc ; 7
db sa+sb+sc+sd+se+sf+sg ; 8
db sa+sb+sc+sd+sf+sg ; 9
db sa+sb+sc+se+sf+sg ; A
db sc+sd+se+sf+sg ; b
db sa+sd+se+sf ; C
db sb+sc+sd+se+sg ; d
db sa+sd+se+sf+sg ; E
db sa+se+sf+sg ; F
delay:
mov r1,#0A0h
loop1: djnz r1,loop1
ret
end
; 2 digit 7 segment counter 00 to 99
; date = 22.04.2013
; phase 1: display one digit 0-F only
; phase 2: display 2 digits 00-99
;
org 0000h
jmp start
org 0030h
sa equ 01h
sb equ 02h
sc equ 04h
sd equ 08h
se equ 10h
sf equ 20h
sg equ 40h
sdp equ 80h
start: mov dptr,#table
mov r2, #0 ; unit digit
mov r3, #0 ; tenth digit
call display ; display them
repeat:
; call delay
inc r2 ; unit +1
cjne r2,#10,ok
mov r2,#0
inc r3 ; tenth +1
cjne r3,#10,ok
clr a ; clear r2 & r3 to 0
mov r2,a
mov r3,a
ok: call display
jmp repeat
display:
mov b,#10 ; disp counter
disp_loop:
mov a,r2
call show ; show unit digit
setb p3.0 ; ON transistor Q1
call delay_20ms
clr p3.0 ; OFF Q1
mov a,r3
call show ; show tenth digit
setb p3.1 ; ON transistor Q2
call delay_20ms
clr p3.1 ; OFF Q2
djnz b,disp_loop ; loop 50 times
ret
show: movc a,@a+dptr ; get number patter for display
mov p1,a
ret
table: db sa+sb+sc+sd+se+sf ; 0
db sb+sc ; 1
db sa+sb+sg+se+sd ; 2
db sa+sb+sc+sd+sg ; 3
db sb+sc+sf+sg ; 4
db sa+sc+sd+sf+sg ; 5
db sa+sc+sd+se+sf+sg ; 6
db sa+sb+sc ; 7
db sa+sb+sc+sd+se+sf+sg ; 8
db sa+sb+sc+sd+sf+sg ; 9
db sa+sb+sc+se+sf+sg ; A
db sc+sd+se+sf+sg ; b
db sa+sd+se+sf ; C
db sb+sc+sd+se+sg ; d
db sa+sd+se+sf+sg ; E
db sa+se+sf+sg ; F
delay_20ms:
mov r1,#1
loop0: djnz r1,loop0
ret
delay:
mov r1,#040h
loop1: djnz r1,loop1
ret
end
Flash 24c32 are write limited... Its not advisable to use them as Random Access Memory.... You can get SPI Sram ... but the 8051 is geared up to connect to oodles of ram... I have a connection example on my computer at home... I'll post it later.....
I had to come off the computer last night... So I'll carry on tonight....
SPI is very easy to implement.... And fast...
T1_ISR:
PUSH A
PUSH PSW
PUSH DPH
PUSH DPL
clr TR1 ;stop timer1
mov TL1,sav_tl1 ;restore t1
mov TH1,sav_th1
setb TR1 ;start timer1
cpl d_flag ;toggle d_flag
jb d_flag,upper ;1=upper 0=lower
lower: clr p3.0 ;switch off both digits
clr p3.1
mov p1,unit_dig ;get new value
setb p3.0 ;turn on lower digit
sjmp isr_exit
upper: clr p3.0 ;switch off both digits
clr p3.1
mov p1,ten_dig ;get new value
setb p3.1 ;turn on upper digit
isr_exit:
clr TF1 ;clear timer1 flag
POP DPL
POP DPH
POP PSW
POP A
reti
; 2 digit 7 segment counter 00 to 99
; date = 25.04.2013
; phase 1: display one digit 0-F only
; phase 2: display 2 digits 00-99
; phase 3: interrupt driven display.
;
org 00h
jmp start
org 1bh
jmp T1_isr
org 30h
sa equ 01h
sb equ 02h
sc equ 04h
sd equ 08h
se equ 10h
sf equ 20h
sg equ 40h
sdp equ 80h
;
d_flag bit 20h.0 ; disp flag
sav_tl1 equ 80h ; temp for T1L
sav_th1 equ 81h ; temp for T1H
unit_dig equ 82h ; unit digit disp pattern
ten_dig equ 83h ; tenth digit disp pattern
;
start: mov sp,#90h ;init Stack Ptr to 80H
mov DPTR,#TABLE ; dptr = 7 segment table address
mov r2, #0 ; unit digit
mov r3, #0 ; tenth digit
mov TMOD,#0x10 ; set up timer1 for 10mS
mov TL1,#0xf0 ; Mode=1
mov TH1,#0xd8
mov sav_tl1,#0xf0
mov sav_th1,#0xd8
setb tr1 ; start timer1
call display ; display them
repeat:
; call delay
inc r2 ; unit +1
cjne r2,#10,ok ; r2<10 then ok
mov r2,#0 ; else zero it
inc r3 ; tenth +1
cjne r3,#10,ok
clr a ; zero both r2 & r3
mov r2,a
mov r3,a
ok: call display
jmp repeat ; repeat will br my main() loop
display:
mov a,r2
movc a,@a+dptr ; get number patter for display
mov unit_dig,a
mov a,r3
movc a,@a+dptr ; get number patter for display
mov ten_dig,a
ret
[COLOR="#FF0000"]T1_isr:
PUSH A
PUSH PSW
PUSH DPH
PUSH DPL
clr TR1 ;stop timer1
mov TL1,sav_tl1 ;restore t1
mov TH1,sav_th1
setb TR1 ;start timer1
cpl d_flag ;toggle d_flag
jb d_flag,upper ;1=upper 0=lower
lower: clr p3.0 ;switch off both digits
clr p3.1
mov p1,unit_dig ;get new value
setb p3.0 ;turn on lower digit
sjmp isr_exit
upper: clr p3.0 ;switch off both digits
clr p3.1
mov p1,ten_dig ;get new value
setb p3.1 ;turn on upper digit
isr_exit:
clr TF1 ;clear timer1 flag
POP DPL
POP DPH
POP PSW
POP A
reti
[/COLOR]
;
; 7 segment pattern table
;
table: db sa+sb+sc+sd+se+sf ; 0
db sb+sc ; 1
db sa+sb+sg+se+sd ; 2
db sa+sb+sc+sd+sg ; 3
db sb+sc+sf+sg ; 4
db sa+sc+sd+sf+sg ; 5
db sa+sc+sd+se+sf+sg ; 6
db sa+sb+sc ; 7
db sa+sb+sc+sd+se+sf+sg ; 8
db sa+sb+sc+sd+sf+sg ; 9
delay_20ms:
mov r1,#1
loop0: djnz r1,loop0
ret
delay:
mov r1,#040h
loop1: djnz r1,loop1
ret
end
d_flag bit 20h.0 ; disp flag
sav_tl1 equ 30h ; temp for T1L
sav_th1 equ 31h ; temp for T1H
unit_dig equ 32h ; unit digit disp pattern
ten_dig equ 33h ; tenth digit disp pattern
;
start:
mov DPTR,#TABLE ; dptr = 7 segment table address
mov r2, #0 ; unit digit
mov r3, #0 ; tenth digit
mov TMOD,#0x10 ; set up timer1 for 10mS
mov TL1,#0xf0 ; Mode=1
mov TH1,#0xd8
mov sav_tl1,#0xf0
mov sav_th1,#0xd8
setb tr1 ; start timer1
setb et1 ; **enable timer1 interrupt
setb ea ; **enable global interrupt
call display ; display them
; 2 digit 7 segment counter 00 to 99
; date = 25.04.2013
; phase 1: display one digit 0-F only
; phase 2: display 2 digits 00-99
; phase 3: interrupt driven display.
;
org 00h
jmp start
org 1bh
jmp T1_isr
org 30h
sa equ 01h
sb equ 02h
sc equ 04h
sd equ 08h
se equ 10h
sf equ 20h
sg equ 40h
sdp equ 80h
;
d_flag bit 20h.0 ; disp flag
sav_tl1 equ 30h ; temp for T1L
sav_th1 equ 31h ; temp for T1H
unit_dig equ 32h ; unit digit disp pattern
ten_dig equ 33h ; tenth digit disp pattern
;
start: mov sp,#90h ;init Stack Ptr to 80H
mov DPTR,#TABLE ; dptr = 7 segment table address
mov r2, #0 ; unit digit
mov r3, #0 ; tenth digit
mov TMOD,#010h ; set up timer1 for 10mS
mov TL1,#0f0h ; Mode=1
mov TH1,#0d8h
mov sav_tl1,#0f0h
mov sav_th1,#0d8h
setb et1 ; **enable timer1 interrupt
setb ea ; **enable global interrupt
setb tr1 ; start timer1
call display ; display them
repeat:
call delay_200ms
call delay_200ms
inc r2 ; unit +1
cjne r2,#10,ok ; r2<10 then ok
mov r2,#0 ; else zero it
inc r3 ; tenth +1
cjne r3,#10,ok
clr a ; zero both r2 & r3
mov r2,a
mov r3,a
ok: call display
jmp repeat ; repeat will br my main() loop
display:
mov a,r2
movc a,@a+dptr ; get number patter for display
mov unit_dig,a
mov a,r3
movc a,@a+dptr ; get number patter for display
mov ten_dig,a
ret
T1_isr:
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
clr TR1 ;stop timer1
mov TL1,sav_tl1 ;restore t1
mov TH1,sav_th1
setb TR1 ;start timer1
cpl d_flag ;toggle d_flag
jb d_flag,upper ;1=upper 0=lower
lower: clr p3.0 ;switch off both digits
clr p3.1
mov p1,unit_dig ;get new value
setb p3.0 ;turn on lower digit
sjmp isr_exit
upper: clr p3.0 ;switch off both digits
clr p3.1
mov p1,ten_dig ;get new value
setb p3.1 ;turn on upper digit
isr_exit:
clr TF1 ;clear timer1 flag
POP DPL
POP DPH
POP PSW
POP ACC
reti
;
; 7 segment pattern table
;
table: db sa+sb+sc+sd+se+sf ; 0 0x3F
db sb+sc ; 1 0x06
db sa+sb+sg+se+sd ; 2 0x53
db sa+sb+sc+sd+sg ; 3 0x4F
db sb+sc+sf+sg ; 4 0x66
db sa+sc+sd+sf+sg ; 5 0x6D
db sa+sc+sd+se+sf+sg ; 6 0x7D
db sa+sb+sc ; 7 0x07
db sa+sb+sc+sd+se+sf+sg ; 8 0x7F
db sa+sb+sc+sd+sf+sg ; 9 0x6F
delay_200ms:
mov r1,#0ffh
sjmp delay
delay_20ms:
mov r1,#1
loop0: djnz r1,loop0
ret
delay:
loop2: mov r1,#04Fh
loop1: djnz r1,loop1
djnz r5,loop1
ret
end
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?