- UID
- 45755
- 阅读权限
- 55
- 推广
-
- 幽默
-
- 注册时间
- 2009-8-18
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2011-8-10 14:31:48
|
显示全部楼层
汇编程序如下:
ORG 0000H ;有按键蜂鸣声,调按键有纠错功能。
ajmp start
ORG 000BH
AJMP YS200
ORG 0030h
start:
clr p1.2
setb p1.3;蜂鸣器。
MOV IE,#82H
MOV TMOD,#11H
MOV IP,#00H
MOV TH0,#00H
MOV TL0,#0F5H
SETB TR0 ;定时器0廷时子程序。
MOV 30H,#00H
MOV R1,#00H;在7位LED模块显示转灯,12:34:56
mov 2eh,#00h;按键暂处理。
MOV 78H,#00H
mov 3ch,#00h;调时用闪烁位。
setb p3.7 ; SM1628复位线。
clr p3.5 ;SM1628时钟线
acall aa000
ab000:
acall cc ;读时钟HT1380。
acall cc0;分解1380数字
acall aa001;取模转换。
acall aa003;发送数据到SM1628显示储存RAM地址中。
ACALL key ;调时钟按键处理。
ACALL keyss ;按键送到显示测试。
acall aa004 ;转灯处理。
ACALL KEYSL
ajmp ab000
aa000:
MOV 6FH,#80H
MOV 34H,#00H
mov 60h,#04h
mov 61h,#03h
mov 62h,#01h
mov 63h,#0ah ;试按键显示。
MOV 64H,#05H
mov 65h,#06h
MOV 66H,#0AH
mov 67h,#0ah
mov 68h,#02h
MOV 69H,#0AH
MOV 70H,#0FFH
ret
aa001:
MOV A,32H ;调时间用闪烁位。
cjne a,#01h,uu0 ;第一位闪烁处理。
jb 2fh.6,bs
mov 63h,#0ah
uu0:
cjne a,#02h,uu1
jb 2fh.6,bs
mov 62h,#0ah
uu1:
cjne a,#03h,uu2
jb 2fh.6,bs
mov 68h,#0ah
uu2:
cjne a,#04h,uu3
jb 2fh.6,bs
mov 61h,#0ah
uu3:
cjne a,#05h,uu4
jb 2fh.6,bs
mov 60h,#0ah
uu4:
cjne a,#06h,uu5
jb 2fh.6,bs
mov 64h,#0ah
uu5:
cjne a,#07h,bs
jb 2fh.6,bs
mov 65h,#0ah
bs:
VV:
MOV R0,#70H
MOV R1,#60H
MOV DPTR,#TAB
AA1:
MOV A,@R1
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC R1
CJNE R1,#6AH,AA1
MOV 20h,#00h
mov 21h,#00h
mov 22h,#00h
mov 23h,#00h
mov 24h,#00h
mov 25h,#00h
mov 26h,#00h
mov 27h,#00h
mov 28h,#00h
mov 29h,#00h
mov 2ah,#00h
mov 2bh,#00h
mov 2ch,#00h
mov 2dh,#00h
KEY2:
UU:
MOV 76H,#0CH
MOV 77H,36H
MOV R1,#6FH
AA0:
MOV R0,#20H
AA2:
MOV A,@R1
CLR C
RLC A
MOV @R1,A
MOV A,@R0
RLC A
MOV @R0,A
INC R0
INC R0
CJNE R0,#2EH,AA2
INC R1
CJNE R1,#77H,AA0
MOV R1,#77H
AA3:
MOV R0,#21H
AA4:
MOV A,@R1
CLR C
RLC A
MOV @R1,A
MOV A,@R0
RLC A
MOV @R0,A
INC R0
INC R0
CJNE R0,#02FH,AA4
INC R1
CJNE R1,#79H,AA3
ret
YS200:
MOV TH0,#00H
MOV TL0,#00H
PUSH ACC
PUSH PSW
INC 30H
MOV A,30H
CJNE A,#08H,YS1;调闪烁位时间。
MOV 30H,#00H
cpl 2fh.6
INC 31H
MOV A,31H
CJNE A,#08H,YS1
MOV 31H,#00H
YS1:
jc ys2
mov 31h,#00h
ys2:
POP PSW
POP ACC
RETI
RET
aa003:
clr p3.7
nop
nop
mov a,#03h ;设定7位10段显示模式。
acall ss
setb p3.7
nop
nop
nop
nop
clr p3.7
mov a,#40h ;写显示RAM,地址由00H--0DH中。地址自动加一。
acall ss
setb p3.7
nop
nop
nop
nop
clr p3.7
nop
nop
mov a,#0c0h;写显示RAM,地址由00H起。
acall ss
mov r0,#20h
aa:
mov a,@r0
acall ss ;发送数据到SM1628中。
inc r0
cjne r0,#2Eh,aa
setb p3.7
nop
nop
nop
nop
nop
clr p3.7
mov a,#8fh
acall ss
setb p3.7
ret
aa004:
;转灯处理,廷时处理。
AB1:
MOV DPTR,#TAB2
MOV A,31H ;30H由中断定时器计数得来。
MOVC A,@A+DPTR
MOV 6FH,A
CLR C
RRC A
CLR A
MOV ACC.7,C
MOV 36H,A ;试转灯第八段。
AB3:
ret
AJMP VV
TAB:
DB 07eH 0cH 0b6H 9eH 0ccH 0daH 0faH 0EH 0FEH 0deH 00H
TAB2:
DB 0C7H 067H 02FH 03BH 0B9H 0F8H 0DCH 0D6H
ss: ;发送字节到SM1628中。
mov 4eh,#08h
bb:
rrc a
mov p3.6,c
nop
nop
setb p3.5
nop
nop
nop
nop
nop
clr p3.5
djnz 4eh,bb
ret
CC:
MOV A,#8EH ;读HT1380时钟数据,读出放在50-50H中
MOV 5CH,#01H ;50h=秒,51H=分钟,52=小时。53H=日期。
MOV 5DH,#00H ;54H=月分,55H=星期,56H=年份。
MOV R0,#5DH ;57H=写保护。
ACALL FS1
MOV R0,#50H
MOV A,#0BFH
MOV 5CH,#08H
ACALL FS2
MOV A,50H
JNB ACC.7,fh
MOV A,#080H
mov r0,#5Dh
MOV 5CH,#01H
MOV 5DH,#00H
ACALL FS1
fh:
RET
ww1380:
mov a,#0beh
mov r0,#50h
mov 5ch,#08h
acall fs1
ret
FS1:
CLR P1.2;时钟=P1.0,数据=P1.1,复位=P1.2。
nop
nop
nop
nop
CLR P1.0
NOP
NOP
NOP
SETB P1.2
MOV R5,#08H
FASONG:
NOP
RRC A
MOV P1.1,C
NOP
NOP
SETB P1.0
NOP
NOP
NOP
NOP
NOP
CLR P1.0
DJNZ R5,FASONG
NOP
NOP
ZIESOU:
MOV A,@R0
MOV R5,#08H
NOP
NOP
fs08H:
RRC A
NOP
MOV P1.1,C
NOP
NOP
SETB P1.0
NOP
NOP
NOP
NOP
CLR P1.0
DJNZ R5,fs08h
NOP
INC R0
DJNZ 5CH,ZIESOU
NOP
CLR P1.2
RET
FS2:
CLR P1.2
NOP
NOP
CLR P1.0
NOP
NOP
NOP
NOP
SETB P1.2
NOP
NOP
NOP
MOV R5,#08H
NOP
NOP
ZSOU:
RRC A
MOV P1.1,C
NOP
NOP
SETB P1.0
NOP
NOP
NOP
NOP
NOP
CLR P1.0
DJNZ R5,ZSOU
NOP
NOP
NOP
CLR A
CLR C
ZSOU1:
MOV R5,#08H
NOP
ZSOU2:
NOP
MOV C,P1.1
RRC A
NOP
SETB P1.0
NOP
NOP
NOP
NOP
CLR P1.0
DJNZ R5,ZSOU2
NOP
MOV @R0,A
INC R0
DJNZ 5CH,ZSOU1
NOP
CLR P1.2
RET
cc0:
MOV R0,#50H ;分解时钟。
MOV A,@R0
MOV R1,#65H
XCHD A,@R1
SWAP A
MOV R1,#64H
XCHD A,@R1
INC R0
MOV A,@R0
MOV R1,#60H
XCHD A,@R1
SWAP A
MOV R1,#61H
XCHD A,@R1
INC R0
MOV A,@R0
MOV R1,#68H
XCHD A,@R1
SWAP A
MOV R1,#62H
XCHD A,@R1
mov a,62h ;消除无效10时位零。
jnz zzz
mov 62h,#0ah
zzz:
mov 63h,#0ah ;前一位不显示。
RET
key:;按键处理。
mov r0,#37h
clr p3.7
nop
nop
mov a,#42h ;读键命令发送。
acall ss
nop
nop
nop
nop
nop
nop
setb p3.6;置高数据线,等待读键。
clr a
dzb0:
nop
mov r5,#08h
dzb1:
nop
nop
nop
mov c,p3.6
rrc a
setb p3.5
nop
nop
nop
nop
nop
nop
clr p3.5
nop
nop
nop
djnz r5,dzb1
mov @r0,a
inc r0
cjne r0,#3ch,dzb0
setb p3.7
ret
keyss:;按键显示测试。
mov r0,#37h ;37H-3BH为按键暂存RAM。
mov a,@r0
mov c,acc.0
mov 2eh.0,c
mov c,acc.1
mov 2eh.1,c
mov c,acc.3
mov 2eh.2,c
mov c,acc.4
mov 2eh.3,c
ret
ys10ms: ;廷时10MS子程序。
mov 3eh,#0aah
ys10ms1:
mov 3fh,#0aah
djnz 3fh,$
djnz 3eh,ys10ms1
ret
keykz: ;按键放开处理子程序。
acall key
acall keyss
mov a,2eh
acall ys10ms;廷时10MS。
cjne a,#00h,keykz
ret
ZSS0:;暂时处理显示。
MOV 40H,63H
MOV 41H,62H
MOV 42H,68H
MOV 43H,61H
MOV 44H,60H
MOV 45H,64H
MOV 46H,65H
RET
zss1:
mov 63h,40h
mov 62h,41h
mov 68h,42h
mov 61h,43h
mov 60h,44h
mov 64h,45h
mov 65h,46h
ret
KEYSL: ;按键处理子程序。
mov 4fh,#0ffh ;廷时后退出寄存器。
mov a,2eh
cjne a,#01h,key3
acall ys10ms
acall key; 读键一次。
acall keyss;把键值放在2EH中。
MOV A,2EH
JZ KEY3
CJNE A,#01H,KEY3
acall fm;蜂鸣一次。
mov 2eh,#00h
acall cc0;分解时钟一次。
MOV A,62H
CJNE A,#0AH,KEY1;恢复十位0。
MOV 62H,#00H
KEY1:
mov 63h,#00h
acall zss0 ;保护好要显示的数据。
mov 32h,#01h;闪烁第一位。
acall keykz;松开调时间按键后进入。
;廷时退回主程序。
KEY5:;进入按键处理子程序。
ysts:
djnz 4fh,key4 ;廷时退回主程序
ysts1:
;djnz 3dh,ysts
;djnz 3ch,ysts1
acall wz1380;写入1380一次。
AJMP KEY3;返回主程序。
KEY4:
acall s1628
mov a,2eh
cjne a,#01h,key12
acall ys10ms
acall key
acall keyss
mov a,2eh
cjne a,#01h,key12
mov 4fh,#0ffh;增加廷时。
acall fm;蜂鸣一下。
inc 32h
mov a,32h
cjne a,#08h,key12
mov 32h,#01h
key12:
mov a,2eh
cjne a,#02h,key13 ;处理闪烁位加一。
ajmp jy ;转到加一子程序中。
key13:
acall keykz ;松开?
key11:
AJMP KEY5
KEY3: ;返回主程序。
mov 32h,#00h
RET
jy:;闪烁位加一子程序。
acall ys10ms
acall KEY
acall keyss
mov a,2eh
cjne a,#02h,zy09
acall fm;蜂鸣一次。
mov 4fh,#0ffh ;增加廷时时间。
acall keykz;放开按键了?
mov a,32h
cjne a,#01h,zy00
inc 40h
mov a,40h
cjne a,#0ah,zy091;处理
MOV 40H,#00H
AJMP ZY09
ZY091:
JC ZY09
MOV 40H,#00H
AJMP ZY09;如果40H大于0A就放入#00H。
zy00:
cjne a,#02h,zy01
inc 41h
mov a,41h
cjne a,#0ah,zy092
mov 41h,#00h
ajmp zy09
ZY092:
JC ZY09
MOV 41H,#00H
AJMP ZY09
zy01:
cjne a,#03h,zy02
inc 42h
mov a,42h
cjne a,#0ah,zy093
mov 42h,#00h
ajmp zy09
ZY093:
JC ZY09
MOV 42H,#00H
AJMP ZY09
zy02:
cjne a,#04h,zy04
inc 43h
mov a,43h
cjne a,#0ah,zy094
mov 43h,#00h
ajmp zy09
ZY094:
JC ZY09
MOV 43H,#00H
AJMP ZY09
zy04:
cjne a,#05h,zy05
inc 44h
mov a,44h
cjne a,#0ah,zy095
mov 44h,#00h
ajmp zy09
ZY095:
JC ZY09
MOV 44H,#00H
AJMP ZY09
ZY09:
AJMP ZY099
zy05:
cjne a,#06h,zy06
inc 45h
mov a,45h
cjne a,#0ah,zy096
mov 45h,#00h
ajmp zy09
ZY096:
JC ZY09
MOV 45H,#00H
AJMP ZY09
zy06:
cjne a,#07h,zy07
inc 46h
mov a,46h
cjne a,#0ah,zy097
mov 46h,#00h
AJMP ZY09
ZY097:
JC ZY09
MOV 46H,#00H
zy07:
zy099:
acall s1628
mov 31h,#0e0h
ajmp key5;返回加闪烁位子程序。
s1628:
acall zss1 ;恢复送1628显示数据。
acall key ;读SM1628按键子程序。
acall keyss ;按键处理。
ACALL aa001 ;取模转换成1628显示字模。
acall aa003 ;发送到1628中。
ret
wz1380: ;调好后回写一次HT1380时钟数据。
mov a,45h
swap a
add a,46h
mov 50h,a
mov a,43h
swap a
add a,44h
mov 51h,a
mov a,41h
swap a
add a,42h
mov 52h,a
acall ww1380
acall fm;蜂鸣一次.
ret
fm:
MOV R2,#088H
FM1:
clr P1.3
FM0:
MOV r3,#0a0H
DJNZ r3,$
cpl P1.3
fm2:
DJNZ R2,FM0
setb p1.3
RET
end
|
|