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

📄 pic_music.asm.txt

📁 这是一个PIC实现音乐播放程序
💻 TXT
字号:
;***********************************
    LIST      P=PIC16F877,R=DEC
    #INCLUDE  P16F877.INC
;***********************************
    Errorlevel -302,-305
 __CONFIG _DEBUG_OFF&_CP_ALL&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC;

;***********************************寄存器定义
    CBLOCK    0x20
    JP
    YP
    L1
    L2
    TA:2
    COUNT1
    COUNT2
    W_STACK
    ST_STACK
    ENDC
;************************************
    ORG    0X0000 
    nop                             ;放置一条MCD所必须的空指令
    GOTO   MAIN                     ;主程序
    ORG    0x0004
    BTFSC  PIR1,TMR1IF              ;中断子程序
    GOTO   T1                       ;转T1处理      
    RETFIE
    ORG    0x0010
;************************************
MAIN
    CLRWDT                          ;喂狗
    BCF    STATUS,RP0
    CLRF   INTCON                   ;清除其他中断标志位
    CLRF   PORTC
    CLRF   PIR1                     ;清除TMR1中断标志位
    BSF    STATUS,RP0
    BSF    PIE1,0                   ;使能TMR1中断
    MOVLW  B'10111111'              ;除RC6口输出外,其他口都设为输入
    MOVWF  TRISC                    
    BCF    STATUS,RP0 
    MOVLW  0xC0                     ;开启中断总允许位GIE跟PEIE
    MOVWF  INTCON
REPLAY
    CLRF   COUNT1                   ;从头开始查表(亦即从头开始唱歌)
SING
    CLRF   TMR1L                    
    CLRF   TMR1H                    ;清零TMR1定器
    MOVF   COUNT1,0
    CALL   TABLE                    
    MOVWF  COUNT2                   ;暂存查表结果于COUNT2中
    BCF    STATUS,Z
    SUBLW  0x00                     ;判断是否查表到最后一个数值
    BTFSC  STATUS,Z
    GOTO   REPLAY                   ;是,说明音乐播放完成,重头开始播放
    MOVF   COUNT2,0    
    ANDLW  0x0F                     ;去掉高4位只保留低4位
    MOVWF  JP                       ;保存到JP中
    SWAPF  COUNT2,0                 ;高低半字节交换
    ANDLW  0x0F                     ;去掉高4位只保留低4位
    MOVWF  YP                       ;保存到YP中,这样查表的结果的被分成高低半字节两部分分别存放在YP跟JP中
    DECF   YP,1
    MOVF   YP,0
    CALL   TABLE_YP                 
    MOVWF  TMR1H                    ;作为TMR1初值的高8位
    MOVWF  TA                       ;暂存TA中
    INCF   YP,0
    CALL   TABLE_YP
    MOVWF  TMR1L                    ;作为TMR1初值的低8位
    MOVWF  TA+1                     ;暂存TA+1中
    BSF    T1CON,TMR1ON             ;开启TMR1定时器
    CALL   DELAY                    ;延时一段时间
    INCF   COUNT1                   ;COUNT1加1,以便查表得到下一个播放的音调
    GOTO   SING                     ;返回播放下一个音调

;**************************延时程序
DELAY                         
    MOVLW  200            
    MOVWF  L1            
DELAY_1
    MOVLW  225            
    MOVWF  L2             
DELAY_2
    DECFSZ L2,1          
    GOTO   DELAY_2         
    DECFSZ L1,1          
    GOTO   DELAY_1                         
    DECFSZ JP,1
    GOTO   DELAY
    CLRWDT
    RETURN  
;*************************中断现场保护              
PUSH
    MOVWF  W_STACK                ;保存W的值
    MOVF   STATUS,0
    MOVWF  ST_STACK               ;保存STATUS的值
    RETURN
;************************中断现场恢复
POP
    MOVF   ST_STACK,0
    MOVWF  STATUS                 ;恢复STATUS的值
    MOVF   W_STACK,0              ;恢复W的值
    RETURN
;************************中断处理子程序
T1
    CALL   PUSH                   ;调用现场保护程序
    MOVLW  0x40                   ;RC6口输出取反
    XORWF  PORTC,1
    MOVF   TA,0                  
    MOVWF  TMR1H                  
    MOVF   TA+1,0
    MOVWF  TMR1L                  ;给TMR1赋初值
    BSF    T1CON,TMR1ON           ;开启定时器
    BCF    PIR1,TMR1IF            ;清除标志位
    CALL   POP                    ;调用现场恢复程序
    RETFIE

TABLE_YP
    ADDWF  PCL,1        
    RETLW  0xFC   ;1
    RETLW  0x44
    RETLW  0xFC   ;2
    RETLW  0xAC
    RETLW  0xFD   ;3
    RETLW  0x09
    RETLW  0xFD   ;4
    RETLW  0x34
    RETLW  0xFD   ;5
    RETLW  0x82
    RETLW  0xFD   ;6
    RETLW  0xC8
    RETLW  0xFE   ;7
    RETLW  0x06   
TABLE
    ADDWF  PCL,1
    RETLW  0x14
    RETLW  0x34
    RETLW  0x54
    RETLW  0x14
    RETLW  0x14
    RETLW  0x34
    RETLW  0x54
    RETLW  0x14
    RETLW  0x54
    RETLW  0x74
    RETLW  0x98
    RETLW  0x54
    RETLW  0x74
    RETLW  0x98
    RETLW  0x93
    RETLW  0xB1
    RETLW  0x93
    RETLW  0x71
    RETLW  0x54
    RETLW  0x14
    RETLW  0x93
    RETLW  0xB1
    RETLW  0x93
    RETLW  0x71
    RETLW  0x54
    RETLW  0x14
    RETLW  0x14
    RETLW  0x94
    RETLW  0x18
    RETLW  0x14
    RETLW  0x94
    RETLW  0x18
    RETLW  0x00    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -