📄 12.asm
字号:
LCD_RS BIT P2.0
LCD_RW BIT P2.1
LCD_EN BIT P2.2
LCD_X EQU 3FH
SPK BIT P0.0
ORG 0000H
JMP MAIN
ORG 000BH
LJMP TIMER0
ORG 0030H
MAIN:
MOV SP,#60H
CLR LCD_EN
CALL INIT_LCD
CALL DELAY1
MOV DPTR,#INFO1
MOV A,#1
CALL LCD_SHOW
MOV DPTR,#INFO2
MOV A,#2
CALL LCD_SHOW
LJMP MAIN1
RET
INFO1: DB "MUSIC PLAYER",0 ;LCD 第一行显示信息
INFO2: DB "YANGLU MUSIC_1",0 ;LCD 第二行显示信息
;LCD 接口初始化
;8位I/O控制
INIT_LCD:
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY1
MOV A,#0CH ;开显示,关光标,
CALL WCOM
CALL DELAY1
MOV A,#01H ;清除 LCD 显示屏
CALL WCOM
CALL DELAY1
RET
LCD_SHOW: ;在LCD的第一行或第二行显示信息字符
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1: MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
JMP FILL
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
FILL: CLR A ;填入字符
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1: CALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
;写入命令子程序
WCOM: ;以8位控制方式将命令写至LCD
MOV P0,A ;写入命令
CALL ENABLE
RET
;写入数据子程序
WDATA: ;以8位控制方式将数据写至LCD
MOV P0,A ;写入数据
CALL ENABLE1
RET
ENABLE: ;写指令使能
CLR LCD_RS ;RS=L,LCD_RW=L,D0-D7=指令码,E=高脉冲
CLR LCD_RW
SETB LCD_EN
CALL DELAY0
CLR LCD_EN
RET
ENABLE1: ;写数据使能
SETB LCD_RS ;RS=H,RW=L,D0-D7=数据,E=高脉冲
CLR LCD_RW
SETB LCD_EN
CALL DELAY0
CLR LCD_EN
RET
DELAY0: MOV R7,#250 ;延时500微秒
DJNZ R7,$
RET
DELAY1: ;延时3MS
MOV R6,#15
D2: MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
RET
MAIN1: MOV TMOD,#01H ;置CT0定时工作方式1
MOV IE,#82H ;CPU开中断,CT0开中断
MOV R5,#0
PLAY:
MOV A,R5
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV R6,A
INC R5
MOV A,R5
MOVC A,@A+DPTR
MOV R7,A
INC R5
MOV A,R5
MOVC A,@A+DPTR
JNZ PLAY1
MOV R5,#0
LJMP NEXT
PLAY1:
MOV B,#3
MUL AB
MOV R2,A
MOV B,#7
MOV A,R7
MUL AB
ADD A,R6
DEC A
MOV R6,A
MOV DPTR,#FREQH
MOVC A,@A+DPTR
MOV R4,A
MOV DPTR,#FREQL
MOV A,R6
MOVC A,@A+DPTR
MOV R3,A
LCALL SONG ;调用音符播放程序
INC R5
SJMP PLAY ;转入调用下一个音符OV R3,A
MOV R5,#00H
NEXT:
MOV A,R5 ;R5存放取数的变地址
MOV DPTR,#TABLE ;DPTR置音高节拍表首地址
MOVC A,@A+DPTR ;从音高节拍表取中取音高高位参数
MOV R4,A ;R4存放音高高位参数
INC R5
MOV A,R5
MOVC A,@A+DPTR ;从音高节拍表取中取音高低位参数
MOV R3,A ;R3存放音高低位参数
INC R5
MOV A,R5
MOVC A,@A+DPTR ;从音高节拍表取中取节拍参数
JNZ NEXT1
MOV R5,#00H
LJMP PLAY ;唱完后循环(节拍参数为#00H表示歌曲结束)
NEXT1:
MOV R2,A ;R2存放节拍参数
LCALL SONG ;调用音符播放程序
INC R5
SJMP NEXT ;转入调用下一个音符
SONG:
MOV TH0,R4
MOV TL0,R3
SETB TR0 ;启动CT0(开始唱某一音符)
DELAY:
MOV R1,#85H ;节拍延时(即某一音符唱多长时间)
DEL1:
MOV R0,#0FFH
DEL0:
NOP
NOP
NOP
DJNZ R0,DEL0
DJNZ R1,DEL1
DJNZ R2,DELAY
CLR TR0 ;禁止CT0(某一音符唱完后停止)
RET
TIMER0: ;定时中断程序(用于决定某一音符唱多高)
CPL SPK
MOV TH0,R4
MOV TL0,R3
RETI
TABLE: ; 音高节拍表,休止符用"FFH,FFH",结束用节拍为00H表示
DB 0FFH,0FFH,01H,0FDH, 08H,02H,0FDH, 08H,02H,0FDH, 08H,02H,0FDH, 08H,02H,0FDH, 08H,02H,0FDH, 08H,02H
DB 0FDH, 5BH,04H,0FDH, 08H,02H,0FCH,0ABH,02H,0FCH, 0BH,02H,0FCH, 0BH,02H,0FFH,0FFH,01H,0FCH, 0BH,02H
DB 0FCH,0ABH,02H,0FCH,0ABH,02H,0FCH,0ABH,02H,0FCH,0ABH,02H,0FCH,0ABH,04H,0FCH,0ABH,02H,0FCH,0ABH,02H
DB 0FBH, 8FH,02H,0FCH, 0BH,02H,0FCH, 0BH,04H,0FFH,0FFH,01H
DB 0FDH, 08H,02H,0FDH, 08H,02H,0FDH, 08H,02H,0FDH, 08H,04H,0FDH, 08H,02H,0FDH, 08H,02H
DB 0FDH, 5BH,04H,0FDH, 08H,02H,0FCH,0ABH,04H,0FDH, 08H,06H
DB 0FBH,08FH,02H,0FBH,08FH,02H,0FBH,08FH,02H,0FBH,08FH,02H,0FBH,08FH,02H,0FBH, 03H,02H,0FAH, 14H,02H
DB 0FCH,0ABH,04H,0FCH,0ABH,02H,0FCH,0ABH,02H,0FCH,0ABH,02H,0FCH, 0BH,02H,0FCH, 0BH,04H
DB 0FFH,0FFH,01H,0FDH, 08H,02H,0FDH, 08H,02H,0FDH, 08H,02H,0FDH, 08H,02H,0FDH, 08H,02H,0FDH, 08H,02H
DB 0FDH, 5BH,04H,0FDH, 08H,02H,0FCH,0ABH,04H,0FDH, 08H,06H
DB 0FBH,08FH,02H,0FBH,08FH,02H,0FBH,08FH,02H,0FBH,08FH,02H,0FBH,08FH,02H,0FBH, 03H,02H,0FAH, 14H,02H
DB 0FCH,0ABH,04H,0FCH,0ABH,02H,0FCH,0ABH,02H,0FCH,0ABH,02H,0FCH, 0BH,02H,0FCH, 0BH,04H, 00H, 00H,00H
TABLE1:
DB 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1
DB 6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1
DB 6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2
DB 5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1
DB 2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
; 音阶频率表
FREQH:
DB 0F2H,0F3H,0F5H,0F5H,0F6H,0F7H,0F8H
DB 0F9H,0F9H,0FAH,0FAH,0FBH,0FBH,0FCH, 0FCH ;1,2,3,4,5,6,7,8,i
DB 0FCH,0FDH,0FDH,0FDH,0FDH,0FEH
DB 0FEH,0FEH,0FEH,0FEH,0FEH,0FEH,0FFH
FREQL:
DB 42H, 0C1H, 17H, 0B6H,0D0H,0D1H,0B6H
DB 21H, 0E1H, 8CH, 0D8H,68H, 0E9H, 5BH, 8FH ;1,2,3,4,5,6,7,8,i
DB 0EEH,44H, 6BH,0B4H,0F4H,2DH
DB 47H, 77H,0A2H,0B6H,0DAH,0FAH,16H
END
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -