小星星
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 500h
MOVWF L1
DELAY_1
MOVLW 900h
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 0x14
RETLW 0x94
RETL
W 0x94
RETLW 0xB4
RETLW 0xB4
RETLW 0x94
RETLW 0x74
RETLW 0x74
RETLW 0x54
RETLW 0x54
RETLW 0x34
RETLW 0x34
RETLW 0x14
RETLW 0x94
RETLW 0x94
RETLW 0x74
RETLW 0x74
RETLW 0x54
RETLW 0x54
RETLW 0x34
RETLW 0x94
RETLW 0x94
RETLW 0x74
RETLW 0x54
RETLW 0x54
RETLW 0x34
RETLW 0x14
RETLW 0x14
RETLW 0x94
RETLW 0x94
RETLW 0xB4
RETLW 0xB4
RETLW 0x94
RETLW 0x74
RETLW 0x74
RETLW 0x54
RETLW 0x54
RETLW 0x34
RETLW 0x34
RETLW 0x14
RETLW 0x00
;********************************************
end ;源程序结束
;********************************************