⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12.asm

📁 音乐发生程序
💻 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 + -