📄 main.asm
字号:
;变songend值直接读
read
movf addr,0;将地址变量送W
movwf songend;经W送songend寄存器
clrf addr;将地址变量清0,从曲目开头读起
;*************** e2prom read1 子程序 *******************
;入口参数;把 即将读取的单元地址addr预先放入了W中
;出口参数:是把读出的数据保存在W 中
;********************************************************
read1
bcf status,rp0
bsf status,rp1
movf addr,w ;取地址
movwf eeadr ;送地址寄存器
bsf status,rp0 ;bank3
bcf eecon1,eepgd ;选定e2prom 为访问对象
bsf eecon1,rd ;启动读操作
bcf status,rp0 ;bank2
movf eedata,w ;取数据,即键值
bcf status,rp1;体0为当前体
movwf portc;;送显LED
movwf yinfu;;保存在定义的寄存器中
call checkyinch;;查表得对应音长
movwf count;;通过W传给参数COUNT
movf yinfu,0;;将翻译键值送到W
call checkyingao;;查表得对应音调
movwf temp0;;通过W传给参数TEMP0
call fangbo;;调用FANGBO子程序
call delay64
incf addr,f;;地址变量递增
movf addr,w;;送到W
xorwf songend,0;;与songend寄存器内容比较:songend曲目终点
btfss status,z
goto read1;;没读完!回read1继续读
clrf addr;;读完!将地址变量清0
goto write;;回到大循环起点
return
;************** eeprom end ************
;*******************************************
;************* lcd 初始化 *****************
;*********************************************
lcdinitiate
movlw 00h;
bsf status,rp0;转到体1
movwf trisd;设置端口d,e为输出
movwf trise;
movlw 7h
movwf option_reg;设置定时器tmr0分频比为1:256
bcf status,rp0;恢复体0
;call delay10
movlw b'00110000'
call lcddownwrite
nop
movlw b'00110000'
call lcddownwrite
nop
movlw b'00110000'
call lcddownwrite
nop
movlw b'00111000';功能设置,8bit操作,2行显示,5x7点阵
call lcddownwrite;
movlw b'00001000';关显示
call lcddownwrite;
movlw b'00000001';清屏
call lcddownwrite;下降触发并写入
movlw b'00000110';设置输入方式 增量方式显示,无位移
call lcddownwrite;
movlw b'00001110';显示开,光标开,字符闪烁关
call lcddownwrite;
;bsf status,rp0;转到体1
;movlw 0ffh;将端口D设置为输入
;movwf trisd;
;bcf status,rp0;恢复体0
return
;*****************************************************
;****************下降沿触发并设置*************
lcddownwrite
bsf porte,enable ;enable端设置触发
bcf porte,rs ;RS寄存器选择 数据寄存器
movwf portd;
nop
nop
nop
bcf porte,enable ;下降沿产生
call delay10 ;延时,便于观察
;call delay64
;call delay64
return
;****************delay64ms子程序*******************
delay64
bcf intcon,2 ;清除tmr0溢出标志位
movlw 6 ;tmr0赋初值
movwf tmr0 ;并重新启动定时计数
loop1
btfss intcon,2 ;检查tmr0溢出标志位
goto loop1 ;没有溢出,循环检测
return
;***************************************************
;************** delay10ms *******************
delay10
bcf intcon,2
movlw d'216'
movwf tmr0
loop2
btfss intcon,2
goto loop2
return
;******************* enableport 产生下降沿 **********
enableport
bsf porte,rs ;指令符10xxxxxxxx
bsf porte,enable
movwf portd
nop
nop
nop
bcf porte,enable;产生一个下降沿
call delay10
;call delay64
;call delay64
;call delay64
return
;********* 功能选择提示********
functlist
movlw b'01010111'
call enableport
movlw b'01000101'
call enableport
movlw b'01001100'
call enableport
movlw b'01000011'
call enableport
movlw b'01001111'
call enableport
movlw b'01001101'
call enableport
movlw b'01000101'
call enableport
movlw b'00100001'
call enableport ;welcome!
movlw b'11000000'
call lcddownwrite ;改变显示位置到第2行第1位
movlw b'01000011'
call enableport
movlw b'00111010'
call enableport
movlw b'01000101'
call enableport
movlw b'01001100'
call enableport
movlw b'01000101'
call enableport
movlw b'01000011'
call enableport
movlw b'01010100'
call enableport
movlw b'01010010'
call enableport
movlw b'01001111';o
call enableport
movlw b'01001110';n
call enableport
movlw b'01001001'
call enableport
movlw b'01000011';c
call enableport
movlw b'10000000';
call enableport
movlw b'01001111'
call enableport
movlw b'01010010';r
call enableport
movlw b'01000111'
call enableport
movlw b'00000111'
call lcddownwrite;设置AC为增量方式,显示移位
movlw b'01000001';a
call enableport
movlw b'01001110'
call enableport
movlw b'10000000'
call enableport
movlw b'01000100';d,save
call enableport
movlw b'00111010'
call enableport
movlw b'01010011'
call enableport
movlw b'01000001'
call enableport
movlw b'01010110'
call enableport
movlw b'01000101'
call enableport
movlw b'10000000'
call enableport
movlw b'01000101';e,play
call enableport
movlw b'00111010'
call enableport
movlw b'01010000'
call enableport
movlw b'01001100'
call enableport
movlw b'01000001'
call enableport
movlw b'01011001'
call enableport
movlw b'10000000'
call enableport
movlw b'01000110';f,wish
call enableport
movlw b'00111010'
call enableport
movlw b'01010111'
call enableport
movlw b'01001001'
call enableport
movlw b'01010011'
call enableport
movlw b'01001000'
call enableport
movlw b'10000000'
call enableport
movlw h'10'
movwf lcdr
circle
decfsz h'10',1
goto loop3
return
;-------------------------
loop3
movlw b'00011100'
call lcddownwrite
call delay64
call delay64
call delay64
call delay64
goto circle
;***************************************************
;***************** lcd end ****************
;*****************************************************
;****************song*************
song
incf special,1
call check
movlw 77h
subwf value,w
btfsc status,z
call song1
movlw 7bh
subwf value,w
btfsc status,z
call song2
goto loopmain
;***********************************
song1
movlw .189; 3
movwf count
movlw .132
movwf temp0
call fangbo
movlw .189; 3
movwf count
movlw .132
movwf temp0
call fangbo
movlw .168; 2
movwf count
movlw .117
movwf temp0
call fangbo
movlw .252; 3
movwf count
movlw .132
movwf temp0
call fangbo
movlw .189; 3
movwf count
movlw .132
movwf temp0
call fangbo
movlw .225; 5
movwf count
movlw .152
movwf temp0
call fangbo
movlw .189; 3
movwf count
movlw .132
movwf temp0
call fangbo
movlw .168; 2
movwf count
movlw .117
movwf temp0
call fangbo
movlw .252; 3
movwf count
movlw .132
movwf temp0
call fangbo
movlw .150; 1
movwf count
movlw .100
movwf temp0
call fangbo
movlw .150; 1
movwf count
movlw .100
movwf temp0
call fangbo
movlw .168; 2
movwf count
movlw .117
movwf temp0
call fangbo
movlw .189; 3
movwf count
movlw .132
movwf temp0
call fangbo
movlw .225; 5
movwf count
movlw .152
movwf temp0
call fangbo
movlw .189; 3
movwf count
movlw .132
movwf temp0
call fangbo
movlw .168; 2
movwf count
movlw .117
movwf temp0
call fangbo
movlw .168; 2
movwf count
movlw .117
movwf temp0
call fangbo
movlw .150; 1
movwf count
movlw .100
movwf temp0
call fangbo
movlw .224; 2
movwf count
movlw .117
movwf temp0
call fangbo
return
song2
movlw .150; 1
movwf count
movlw .100
movwf temp0
call fangbo
movlw .168; 2
movwf count
movlw .117
movwf temp0
call fangbo
movlw .189; 3
movwf count
movlw .132
movwf temp0
call fangbo
movlw .134; 4
movwf count
movlw .139
movwf temp0
call fangbo
movlw .150; 5
movwf count
movlw .152
movwf temp0
call fangbo
movlw .168; 6
movwf count
movlw .163
movwf temp0
call fangbo
movlw .189; 7
movwf count
movlw .173
movwf temp0
call fangbo
movlw .200; 6
movwf count
movlw .178
movwf temp0
call fangbo
return
;*********************************************
;************delaytemp******************
delaytemp
lp0 movlw n2
movwf data2
lp1 decfsz data2,1
goto lp1
decfsz data1,1
goto lp0
return
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -