📄 综合a.asm
字号:
sbic acsr,aco
mov data,temp2
lsr temp1
dec cnt
brne nextd
rcall dataconv
mov r4,hsb ;转换结果送显示。
mov r3,msb
mov r2,lsb
rjmp adag
dataconv: ;把已经转换的16进制换算为双字节的确10进制数。
ldi datal,125
clr datah ;c*p=hl
ldi cnt,8
lsr datal
m8u_1: brcc m8u_2
add datah,data
m8u_2: ror datah
ror datal
dec cnt
brne m8u_1
ldi cnt,6
d_64: clc
ror datah
ror datal
dec cnt
brne d_64
clr hsb
bcd8_1: subi datal,100
brcs bcd8_2
inc hsb
rjmp bcd8_1
bcd8_2: tst datah
breq bcd8_3
dec datah
inc hsb
rjmp bcd8_1
bcd8_3: subi datal,-100
bcd8_4: subi datal,10
brcs bcd8_5
inc msb
rjmp bcd8_4
bcd8_5: subi datal,-10
ret
.ORG $0500
LCD: clr r4
clr r5
clr r6
clr r7
clr zh
clr xh
clr yh
rcall indipramc ;调用初始化显示内存。
ldi temp,$ff
out ddrd,temp
out portd,temp
ldi temp,$00
out ddrb,temp
out portb,temp
ldi temp1,$01
rcall contd
RCALL DELAYY
ldi temp1,$38
rcall contd
LDI TEMP1,$06
rcall contd
LDI TEMP1,$0c
RCALL CONTD
RCALL WR1RAM
RCALL WR2RAM
scanadc:ldi temp,$07
ldi yl,$60
scannc:rcall scan1c
brts scannc
scankc:rcall scan1c
brtc scankc
rcall scan1c
scansc: clc
cpi keyn,$10
brcc commkeyc
rcall wraddramc
dec temp
cpi temp,$03
brne scannc
rjmp scanadc
commkeyc:nop
cpi keyn,$13
brne zadd
rjmp reset
zadd: cpi keyn,$12
breq srmemc
cpi keyn,$11
breq epmemc
cpi keyn,$10
breq directtc
rjmp scannc
srmemc: rjmp srmemtc
epmemc: rjmp epmemtc
directtc: rjmp direct
epmemtc: rcall meradd ;调用由R7-R4产生的地址入TEMP2TEMP1。
cpi temp2,$02 ;EEPROM必须小于0200H。
brcs epdownc
ldi temp2,$01
ldi temp1,$ff
rcall dviadd
epdownc:out eearh,temp2
out eearl,temp1
sbi eecr,$00
in temp1,eedr
mov r2,temp1
mov r8,temp1
rcall dtor32 ;数据放入R3R2中。
rcall disbyregc ;改变显示内存。
epscannc:rcall scan1c ;键扫
brts epscannc
epscankc:rcall scan1c
brtc epscankc
rcall scan1c
epscansc:cpi keyn,$13
brne epreturnc
rjmp reset
epreturnc:cpi keyn,$10
brcc epcommkeyc
mov r3,keyn
rcall disbyregc
escannc:rcall scan1c
brts escannc
escankc:rcall scan1c
brtc escankc
rcall scan1c
escansc:cpi keyn,$13
brne ereturnc
rjmp reset
ereturnc:cpi keyn,$10
brcc ecommkeyc
mov r2,keyn
rcall disbyregc
rjmp epscannc
epcommkeyc:cpi keyn,$13
brne epreturn1c
rjmp reset
epreturn1c:cpi keyn,$1e
breq eplastkeyc
cpi keyn,$1f
breq epnextkeyc
rjmp epscannc
ecommkeyc:cpi keyn,$13
brne ereturn1c
rjmp reset
ereturn1c:cpi keyn,$1e
breq eplastkeyc
cpi keyn,$1f
breq epnextkeyc
rjmp escannc
eplastkeyc:rcall meradd
mov temp,r3
swap temp
or temp,r2
cp temp,r8
breq eplastc
cbi eecr,$00
out eearh,temp2
out eearl,temp1
sbi eecr,$02
sbi eecr,$01
epwrwtc: sbic eecr,$01
rjmp epwrwtc
eplastc:cpi temp1,$00
brne eplastkey1c
cpi temp2,$00
brne eplastkey1c
rjmp epscannc
eplastkey1c:clc
subi temp1,$01
sbci temp2,$00
rcall dviadd
rjmp epmemtc
epnextkeyc:rcall meradd
mov temp,r3
swap temp
or temp,r2
cp temp,r8
breq epnextc
cbi eecr,$00
out eearh,temp2
out eearl,temp1
sbi eecr,$02
sbi eecr,$01
epwrwtnc:sbic eecr,$01
rjmp epwrwtnc
epnextc:cpi temp1,$ff
brne epnextkey1c
cpi temp2,$01
brne epnextkey1c
rjmp epscannc
epnextkey1c:inc temp1
brne epnextkey2c
inc temp2
epnextkey2c:rcall dviadd
rjmp epmemtc ;整段EEPROM读写结束。
srmemtc:rcall meradd ;调用由R7-R4产生的地址入TEMP2TEMP1。
cpi temp2,$02
brcc srbeginc
cpi temp2,$01
breq srdownc
cpi temp1,$70
brcc srdownc
ldi temp1,$70
clr temp2
rjmp srdownc
srbeginc:ldi temp2,$01
ldi temp1,$ff
srdownc:rcall dviadd
rcall meradd
mov yh,temp2
mov yl,temp1
ld temp1,y
mov r2,temp1
mov r8,temp1
rcall dtor32 ;数据放入R3R2中。
rcall disbyregc ;改变显示内存。
srscannc:rcall scan1c ;键扫
brts srscannc
srscankc:rcall scan1c
brtc srscankc
rcall scan1c
srscansc:cpi keyn,$13
brne srreturnc
rjmp reset
srreturnc:cpi keyn,$10
brcc srcommkeyc
mov r3,keyn
rcall disbyregc
sscannc:rcall scan1c
brts sscannc
sscankc:rcall scan1c
brtc sscankc
rcall scan1c
sscansc:cpi keyn,$13
brne sreturnc
rjmp reset
sreturnc:cpi keyn,$10
brcc scommkeyc
mov r2,keyn
rcall disbyregc
rjmp srscannc
srcommkeyc:cpi keyn,$13
brne srreturn1c
rjmp reset
srreturn1c:cpi keyn,$1e
breq srlastkeyc
cpi keyn,$1f
breq srnextkeyc
rjmp srscannc
scommkeyc:cpi keyn,$13
brne srreturn2c
rjmp reset
srreturn2c:cpi keyn,$1e
breq srlastkeyc
cpi keyn,$1f
breq srnextkeyc
rjmp sscannc
srlastkeyc:rcall meradd
mov temp,r3
swap temp
or temp,r2
cp temp,r8
breq srlastc
mov yh,temp2
mov yl,temp1
st y,temp
nop
nop
srlastc:cpi temp1,$70
brne srlastkey1c
cpi temp2,$00
brne srlastkey1c
rjmp srscannc
srlastkey1c:clc
subi temp1,$01
sbci temp2,$00
rcall dviadd
rjmp srmemtc
srnextkeyc:rcall meradd
mov temp,r3
swap temp
or temp,r2
cp temp,r8
breq srnextc
mov yh,temp2
mov yl,temp1
st y,temp
nop
nop
srnextc:cpi temp1,$ff
brne srnextkey1c
cpi temp2,$01
brne srnextkey1c
rjmp srscannc
srnextkey1c:inc temp1
brne srnextkey2c
inc temp2
srnextkey2c:rcall dviadd
rjmp srmemtc ;整段EEPROM读写结束。
indipramc: ldi zh,high(label*2) ;初始化显示内存。
ldi zl,low(label*2)
ldi xl,$60
ldi temp,$50
st x+,temp
LDI TEMP,$20
clr temp1
inlpc:st x+,temp
inc temp1
cpi temp1,$05
brne inlpc
ldi xl,$60
ret
SCAN1c: push xh ;键扫显示子程序。
PUSH XL
PUSH TEMP3
PUSH TEMP2
PUSH TEMP1
PUSH TEMP
LDI XL,$60
SET
LDI CNT,$04
LDI SCNN,$00
LDI KSNI,0B11110111
COL1c:ldi temp,$0f
OUT DDRC,TEMP
OUT PORTC,KSNI
RCALL DELAY
LDI TEMP1,$04
RCALL DELYT
IN TEMP,PINc
ANDI TEMP,0B11110000
SWAP TEMP
KROWc:SEC
ROR TEMP
BRCS NOKEYc
CLT
MOV KEYN,SCNN
CBI DDRD,$07
CBI PORTD,$07
SBIS PINd,$07
ADIW KEYN,$10
RJMP WDISLCD
NOKEYc: INC SCNN
DEC TEMP1
BRNE KROWc
SEC
ROR KSNI
NOSKc: DEC CNT
BRNE COL1c
WDISLCD:RCALL DISLCD
LDI TEMP,$FF
OUT DDRC,TEMP
OUT PORTC,TEMP
POP TEMP
POP TEMP1
POP TEMP2
POP TEMP3
POP XL
pop xh
RET
DISLCD:ldi temp,$ff
out ddrd,temp
out portd,temp
ldi temp,$00
out ddrb,temp
out portb,temp
rcall wr2ram
ret
wr2ram: LDI CNT1,04
LDI TEMP1,$a8
RCALL CONTD
clr zh
ldi zl,$60
LPC: LD R0,Z+
MOV TEMP1,R0
RCALL WRITD
DEC CNT1
BRNE LPC
ldi temp1,$20
rcall writd
ld r0,z+
mov temp1,r0
rcall writd
ld r0,z
mov temp1,r0
rcall writd
ret
.org $0700
ldi cnt,$8
ldi temp1,$a8
rcall contd
lp80: ldi temp1,$20
rcall writd
dec cnt
brne lp80
lp8: clr cnt1 ;循环程序。
lp81: clr cnt
ldi temp1,$a8
rcall contd
lp82: cp cnt1,cnt
brne lp83
ldi temp1,$7E ;字符代码。
lp84: rcall writd
inc cnt
cpi cnt,$10
brne lp82
ldi temp,$40
rcall delaypa
inc cnt1
cpi cnt1,$10
brne lp81
rjmp lp88
lp83: ldi temp1,$20
rjmp lp84
lp88: ldi cnt1,$10 ;循环程序。
lp881: ldi cnt,$00
ldi temp1,$a8
rcall contd
lp882: cp cnt1,cnt
brne lp883
ldi temp1,$7f ;字符代码。
lp884: rcall writd
inc cnt
cpi cnt,$10
brne lp882
ldi temp,$40
rcall delaypa
dec cnt1
brne lp881
rjmp lp8
lp883: ldi temp1,$20
rjmp lp884
.org $0740
ldi cnt,$8 ;0--F循环程序。
ldi temp1,$a8
rcall contd
lpw0: ldi temp1,$20
rcall writd
dec cnt
brne lpw0
lpw: clr temp3
ldi zh,high(labelc*2)
ldi zl,low(labelc*2)
lpww: clr cnt1
lpm
inc zl
lpw1: clr cnt
ldi temp1,$a8
rcall contd
lpw2: cp cnt1,cnt
brne lpw3
mov temp1,r0
lpw4: rcall writd
inc cnt
cpi cnt,$10
brne lpw2
ldi temp,$40 ;设置时间常数TEMP。
rcall delaypa ;调用延时子程序。
inc cnt1
cpi cnt1,$10
brne lpw1
inc temp3
cpi temp3,$10
brne lpww
rjmp lpw
lpw3: ldi temp1,$20
rjmp lpw4
.org $0800 ;LCD显示LCD字符
wr2ram1:LDI ZL,LOW($0BC0*2)
LDI ZH,HIGH($0BC0*2)
ldi cnt1,$07
lp1: LDI CNT,16
LDI TEMP1,$a8
RCALL CONTD
LP: LPM
MOV TEMP1,R0
RCALL WRITD
LD R0,Z+
DEC CNT
BRNE LP
dec cnt1
breq lp2
rcall delayY
rcall delayY
rjmp lp1
lp2: rcall delayY
ldi zl,low($Cc0*2)
ldi zh,high($Cc0*2)
ldi cnt,168
mov prl,zl
mov prh,zh
rout: ldi cnt1,$16
ldi temp1,$a8
rcall contd
rout1: lpm
mov temp1,r0
rcall writd
ld r0,z+
dec cnt1
brne rout1
rcall delayY
dec cnt
breq wr2ram1
rcall incprlh
rjmp rout
incprlh:mov xl,prl
mov xh,prh
ld r0,x+
mov prl,xl
mov prh,xh
mov zl,prl
mov zh,prh
ret
wr1ram: wdr
ldi temp1,$80
rcall contd
ldi cnt1,$02
w1r:ldi cnt,20
ldi zl,low($Ba0*2)
ldi zh,high($Ba0*2)
redsp:lpm
mov temp1,r0
rcall writd
ld r0,z+
dec cnt
brne redsp
dec cnt1
brne w1r
ret
syset: wdr
ldi temp1,$01
RCALL contd
ldi temp1,$38
rcall contd
ldi temp1,$06
rcall contd
ret
CONTD: LDI TEMP,0B00110000
OUT PORTD,TEMP
RCALL DELT3
CBI PORTD,$05
RCALL DELT3
sbi portd,$05
BUSYY: WDR
SBIC PINB,$07
RJMP BUSYY
ldi temp,0b00100000
OUT PORTD,TEMP
RCALL DELT3
LDI TEMP,$ff
OUT DDRB,TEMP
OUT PORTB,TEMP1
WDR
cBI PORTD,$05
RCALL DELT3
LDI TEMP,0B00111000
OUT PORTD,TEMP
CLR TEMP
OUT DDRB,TEMP
OUT PORTB,TEMP
RET
WRITD: LDI TEMP,0B00110000
OUT PORTD,TEMP
RCALL DELT3
cbi portd,$05
rcall delt3
sbi portd,$05
BUZY1:WDR
SBIC PINB,$07
RJMP BUZY1
LDI TEMP,0B00101000
OUT PORTD,TEMP
OUT PORTB,TEMP1
LDI TEMP,$ff
OUT DDRB,TEMP
cbi PORTD,$05
RCALL DELT3
LDI TEMP,0B00111000
OUT PORTD,TEMP
RCALL DELT3
CLR TEMP
OUT DDRB,TEMP
OUT PORTB,TEMP
RET
DELT3: LDI TEMP2,$24
DT111:WDR
DEC TEMP2
BRNE DT111
RET
delayY: ldi temp,$55
delaypa:push temp
m1: push temp
m2: push temp
m3: dec temp
brne m3
pop temp
dec temp
brne m2
pop temp
dec temp
brne m1
pop temp
dec temp
brne delaypa
ret
.cseg ;LCD第一行显示GZ Shuang Long
.org 0xBa0
.db 0x20,0x47,0x5a,0x20,0x53,0x68,0x75,0x61
.db 0x6e,0x67,0x20,0x4c,0x6f,0x6e,0x67,0x20
.cseg
.org 0xBc0 ;LCD第二显示字符
.db 0x20,0x57,0x65,0x6c,0x63,0x6f,0x6d,0x65,0x20,0x62
.db 0x72,0x6f,0x77,0x73,0x65,0x20
.db 0x20,0x20,0x6f,0x75,0x72,0x20,0x20,0x77,0x65,0x62
.db 0x73,0x69,0x74,0x65,0x20,0x20
.db 0x20,0x48,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x20,0x20
.db 0x20,0x20,0x20,0x20,0x20,0x20
.db 0x20,0x20,0x77,0x77,0x77,0x2e,0x53,0x4c,0x2e,0x63
.db 0x6f,0x6d,0x2e,0x63,0x6e,0x20
.db 0x20,0x20,0x48,0x65,0x72,0x65,0x20,0x79,0x6f,0x75
.db 0x20,0x63,0x61,0x6e,0x20,0x20
.db 0x20,0x66,0x69,0x6e,0x64,0x20,0x77,0x68,0x61,0x74
.db 0x20,0x79,0x6f,0x75,0x20,0x20
.db 0x20,0x20,0x20,0x20,0x20,0x20,0x77,0x61,0x6e,0x74
.db 0x2e,0x20,0x20,0x20,0x20,0x20
.cseg
.org 0xCc0 ;LCD所有显示字符
.db 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39
.db 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50
.db 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x61,0x62,0x63,0x64,0x65,0x66
.db 0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x75,0x76,0x77
.db 0x78,0x79,0x7a,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e
.db 0x2f,0x3b,0x3c,0x3d,0x3e,0x3f,0x5b,0x5c,0x5d,0x5e,0x5f,0x7b,0x7d,0x7c,0x7e,0xa1
.db 0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
.db 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
.db 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf
.db 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf
.db 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef
.db 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
.cseg
.org $0f00 ;LED字形表0-F
.dw 0x063f,0x4f5b,0x6d66,0x077d
.dw 0x6f7f,0x7c77,0x5e39,0x7179
.dw 0x0000
.cseg
.org $0f10 ;LCD显示0-F ;
.dw 0x3130,0x3332,0x3534,0x3736
.dw 0x3938,0x4241,0x4443,0x4645
.equ plytab=0x0f20
.equ mustab=0x0fda
.cseg
.org plytab ;祝你生日快乐曲码
.db 20,02,00,01,20,01,22,04,20,04
.db 25,04,24,04,00,04
.db 20,02,00,01,20,01,22,04,20,04
.db 27,04,25,04,00,04
.db 20,02,00,01,20,01,32,04,29,04
.db 25,04,24,04,22,04
.db 30,02,00,01,30,01,29,04,25,04
.db 27,04,25,04,00,04
; 万水千山总是情曲码
.db 17,04,18,04,20,06,20,02,22,04,20,04,17,12,15,04 ;
.db 13,06,17,02,15,04,13,04,10,12,10,04,8,8,13,04 ;
.db 15,04,17,04,20,04,22,04,17,04,15,15,15,04,00,04 ;
.db 17,04,18,04,20,06,20,02,22,04,20,04,17,12,15,04 ;
.db 13,06,17,02,15,04,13,04,10,12,10,04,8,8,13,06 ;
.db 17,02,15,06,13,02,13,04,10,04,13,15,13,8,17,04 ;
.db 20,04,22,12,25,10,22,04,18,04,20,06,22,02,20,12 ;
.db 17,04,20,8,17,04,20,04,22,12,25,04,25,04,22,04 ;
.db 20,04,17,04,15,15,15,8,17,04,18,04,20,06,20,02 ;
.db 22,04,20,04,17,12,15,04,13,06,17,02,15,04,13,04 ;
.db 10,12,10,04,8,8,13,04,17,04,15,06,13,02,10,04
.db 12,04,13,15,13,15 ;
.db 00,00
.cseg
.org mustab ;音符表
.dw 63627,63730,63835,63927
.dw 64020,64102,64185,64259
.dw 64330,64399,64463,64523
.dw 64579,64632,64683,64731
.dw 64776,64819
.dw 64859,64897
.dw 64933,64967,64999,65029
.dw 65057,65084,65109,65133
.dw 65156,65177,65197,65216
.dw 65243,65251,65267,65282
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -