基于STMS的电子琴课设.docx
《基于STMS的电子琴课设.docx》由会员分享,可在线阅读,更多相关《基于STMS的电子琴课设.docx(15页珍藏版)》请在冰豆网上搜索。
基于STMS的电子琴课设
基于STMS的电子琴课设
stm8/
#include"mapping.inc"
#include"stm8s105k4.inc"
segment'ram0'
KEYNAMEds.b1
T20msBds.b1
R01ds.b1
R02ds.b1
R10ds.b1
R11ds.b1
segment'rom'
main.l
;initializeSP
ldwX,#stack_end
ldwSP,X
#ifdefRAM0
;clearRAM0
ram0_start.bEQU$ram0_segment_start
ram0_end.bEQU$ram0_segment_end
ldwX,#ram0_start
clear_ram0.l
clr(X)
incwX
cpwX,#ram0_end
jruleclear_ram0
#endif
#ifdefRAM1
;clearRAM1
ram1_start.wEQU$ram1_segment_start
ram1_end.wEQU$ram1_segment_end
ldwX,#ram1_start
clear_ram1.l
clr(X)
incwX
cpwX,#ram1_end
jruleclear_ram1
#endif
;clearstack
stack_start.wEQU$stack_segment_start
stack_end.wEQU$stack_segment_end
ldwX,#stack_start
clear_stack.l
clr(X)
incwX
cpwX,#stack_end
jruleclear_stack
intel
;*********************主程序*************
;/***************初始化PD用作临时测试*******************/
;MOVPD_DDR,#0fh
;MOVPD_CR1,#0fh
;MOVPD_ODR,#0fh
;BRESPC_CR2,#2
;SETPC_ODR,#2
;/***********PB口初始化*******************
LDA,PB_DDR
ANDA,#0f0h
LDPB_DDR,A;初始化PB0~3为输入
LDA,PB_CR1
ORA,#0fh
LDPB_CR1,A;上拉
BRESEXTI_CR1,#2;初始化外部中断
BSETEXTI_CR1,#3
BSETITC_SPR2,#0
BSETITC_SPR2,#1
LDA,PB_CR2
ORA,#0fh
LDPB_CR2,A;允许PB中断
;/***********PD口初始化*******************
BSETPD_DDR,#0
BSETPD_CR1,#0
BSETPD_DDR,#1
BSETPD_CR1,#1
;***************输出全为0的扫描码************/
LDA,PD_ODR
ANDA,#0f4h;11111100输出全为0的扫描码
LDPD_ODR,A
;/*******************************************
;BRESPA_DDR,#6;初始化PA6为输入
;BSETPA_CR1,#6;上拉
;BRESEXTI_CR1,#0;初始化外部中断
;BSETEXTI_CR1,#1
;BSETPA_CR2,#6;允许PA中断
;*************初始化频率输出引脚***************
bsetPC_DDR,#1
bsetPC_CR1,#1
bresPC_CR2,#1
;.................初始化TIM2...........
;MOVTIM2_PSCR,#02h;4分频
;MOVTIM2_ARRH,#{HIGH1000};
;MOVTIM2_ARRL,#{LOW1000};即十进制2000
;MOVTIM2_CR1,#04h;每2ms产生一次中断
;BSETTIM2_EGR,#0
;BSETTIM2_IER,#0;允许更新中断
;BSETTIM2_CR1,#0;使CEN位为1,启动
;.................初始化TIM1...........
MOVTIM1_SMCR,#00h
BRESTIM1_ETR,#6
MOVTIM1_PSCRH,#{HIGH40};初始化预分频器
MOVTIM1_PSCRL,#{LOW40}
MOVTIM1_ARRH,#{HIGH41};初始化重装载寄存器
MOVTIM1_ARRL,#{LOW41}
MOVTIM1_RCR,#00H;初始化重复计数寄存器
MOVTIM1_CR1,#04H
BSETTIM1_EGR,#0
BRESTIM1_SR1,#0
BSETTIM1_IER,#0;允许中断
BSETTIM1_CR1,#0;使CEN位为1,启动
MOVTIM1_CCMR1,#38H
MOVTIM1_CCR1H,#{HIGH20}
MOVTIM1_CCR1L,#{LOW20}
MOVTIM1_BKR,#80h
;BSETTIM1_CCER1,#0;使能输出
BSETTIM1_CCER1,#1;高电平有效
rim
;................
infinite_loop.l
jrainfinite_loop
;/**************按键检测****************
*************/
Key_Check_Proc.L
PUSHWX
PUSHWY
PUSHCC
PUSHA
;开始扫描
MOVR11,#00000010B
CLRR10
Key_Check_Proc_LOOP1.l
LDA,PD_ODR
ANDA,#11111100B
ORA,R11
LDPD_ODR,A
nop
BTJTPB_IDR,#0,Key_Check_Proc_NEXT20
;PB0引脚输入为0,说明PB0有按键输入
MOVR11,#0
JPFKey_Check_Proc_NEXT3
Key_Check_Proc_NEXT20.l
BTJTPB_IDR,#1,Key_Check_Proc_NEXT21
;PB1引脚输入为0,说明PB1JPFKey_Check_Proc_NEXT3
MOVR11,#1
JPFKey_Check_Proc_NEXT3
Key_Check_Proc_NEXT21.l
BTJTPB_IDR,#2,Key_Check_Proc_NEXT22
;PB2引脚输入为0,说明PB2有按键输入
MOVR11,#2
JPFKey_Check_Proc_NEXT3
Key_Check_Proc_NEXT22.l
BTJTPB_IDR,#3,Key_Check_Proc_NEXT23
;PB3引脚输入为0,说明PB3有按键输入
MOVR11,#3
JRTKey_Check_Proc_NEXT3
Key_Check_Proc_NEXT23.l
;本列没有按键按下,扫描下一列
LDA,R11
SCF;令C标志位1
RLCA
ANDA,#3h;仅保留扫描码
LDR11,A
INCR10
LDA,R10
CPA,#2
JRCKey_Check_Proc_LOOP1
;已扫描所有列,没有发现按键
JPKey_Check_Proc_EXIT
Key_Check_Proc_NEXT3.l
;形成按键扫描码
CLRWX
LDA,R11
LDXL,A
LDA,#2
MULX,A
LDA,XL
ADDA,R10
LDXL,A
LDA,(KEYTAB,X)
;ORA,#80h
LDKEYNAME,A
;/***************对应输出音调******************
CPA,#00h
JREQMusic_1
CPA,#01h
JREQMusic_2
CPA,#02h
JREQMusic_3
CPA,#03h
JREQMusic_4
CPA,#04h
JREQMusic_5
CPA,#05h
JREQMusic_6
CPA,#06h
JREQMusic_7
JPMusic_8
;***************对应输出音调1***********************
Music_1.L
MOVTIM1_PSCRH,#{HIGH43};初始化预分频器
MOVTIM1_PSCRL,#{LOW43}
MOVTIM1_ARRH,#{HIGH44};初始化重装载寄存器
MOVTIM1_ARRL,#{LOW44}
JPDelay_ms;输出对应音调之后跳转到延时
;***************对应输出音调2***********************
Music_2.L
MOVTIM1_PSCRH,#{HIGH40};初始化预分频器
MOVTIM1_PSCRL,#{LOW40}
MOVTIM1_ARRH,#{HIGH41};初始化重装载寄存器
MOVTIM1_ARRL,#{LOW41}
JPDelay_ms;输出对应音调之后跳转到延时
;***************对应输出音调3***********************
Music_3.L
MOVTIM1_PSCRH,#{HIGH38};初始化预分频器
MOVTIM1_PSCRL,#{LOW38}
MOVTIM1_ARRH,#{HIGH39};初始化重装载寄存器
MOVTIM1_ARRL,#{LOW39}
JRTDelay_ms;输出对应音调之后跳转到延时
;***************对应输出音调4***********************
Music_4.L
MOVTIM1_PSCRH,#{HIGH37};初始化预分频器
MOVTIM1_PSCRL,#{LOW37}
MOVTIM1_ARRH,#{HIGH38};初始化重装载寄存器
MOVTIM1_ARRL,#{LOW38}
JRTDelay_ms;输出对应音调之后跳转到延时
;***************对应输出音调5***********************
Music_5.L
MOVTIM1_PSCRH,#{HIGH35};初始化预分频器
MOVTIM1_PSCRL,#{LOW35}
MOVTIM1_ARRH,#{HIGH36};初始化重装载寄存器
MOVTIM1_ARRL,#{LOW36}
JRTDelay_ms;输出对应音
调之后跳转到延时
;***************对应输出音调6***********************
Music_6.L
MOVTIM1_PSCRH,#{HIGH33};初始化预分频器
MOVTIM1_PSCRL,#{LOW33}
MOVTIM1_ARRH,#{HIGH34};初始化重装载寄存器
MOVTIM1_ARRL,#{LOW34}
JRTDelay_ms;输出对应音调之后跳转到延时
;***************对应输出音调7***********************
Music_7.L
MOVTIM1_PSCRH,#{HIGH31};初始化预分频器
MOVTIM1_PSCRL,#{LOW31}
MOVTIM1_ARRH,#{HIGH32};初始化重装载寄存器
MOVTIM1_ARRL,#{LOW32}
JRTDelay_ms;输出对应音调之后跳转到延时
;***************对应输出音调1'**********************
Music_8.L
MOVTIM1_PSCRH,#{HIGH30};初始化预分频器
MOVTIM1_PSCRL,#{LOW30}
MOVTIM1_ARRH,#{HIGH31};初始化重装载寄存器
MOVTIM1_ARRL,#{LOW31}
JRTDelay_ms;输出对应音调之后跳转到延时
;***********延时*************************
Delay_ms:
BSETTIM1_CCER1,#0;使能输出
LDA,PB_IDR
ORA,#11110000B
CPA,#0ffh
JRNEDelay_ms
;movR01,#200;R2赋值200
;Delay_Xunhuan:
;movR02,#200;R2赋值200
;Delay_Xunhuan1:
;DECR02
;JRNEDelay_Xunhuan1;循环
;DECR01
;JRNEDelay_Xunhuan;循环
;********************************************
Key_Check_Proc_EXIT.l
BRESTIM1_CCER1,#0;禁止输出
LDA,PD_ODR
ANDA,#0f4h
LDPD_ODR,A
LDA,PB_CR2
ORA,#0fh
LDPB_CR2,A;允许PB中断
POPA
POPCC
POPWY
POPWX
RETF
RETF
RETF
RETF
Delay_us.l
PUSHWX
PUSHWY
PUSHCC
PUSHA
movR02,#50;R2赋值200
Delay_Xunhuan1:
DECR02
JRNEDelay_Xunhuan1;循环
POPA
POPCC
POPWY
POPWX
RETF
RETF
RETF
RETF
;***************按键扫描码及按键名******************
KEYTAB.l
DC.B00H;扫描码为0对应音调1
DC.B01H;扫描码为1对应音调2
DC.B02H;扫描码为2对应音调3
DC.B03H;扫描码为3对应音调4
DC.B04H;扫描码为4对应音调5
DC.B05H;扫描码为5对应音调6
DC.B06H;扫描码为6对应音调7
DC.B07H;扫描码为7对应音调8
;*****************************************************/
interruptPORTB_INT
PORTB_INT.l
;TNZT20msB
;JRNEPORTB_INT_EXIT
;MOVT20msB,#10
CALLFDelay_us
LDA,PB_IDR
ORA,#11110000B
CPA,#0ffh
JREQPORTB_INT_EXIT
LDA,PB_CR2
ANDA,#0f0h
LDPB_CR2,A
;BRESPC_ODR,#2
CALLFKey_Check_Proc
PORTB_INT_EXIT.l
iret
iret
iret
iret
interruptNonHandledInterrupt
NonHandledInterrupt.l
iret
motorola
segment'vectit'
dc.l{$82000000+main};reset
dc.l{$82000000+NonHandledInterrupt};trap
dc.l{$82000000+NonHandledInterrupt};irq0
dc.l{$82000000+NonHandledInterrupt};irq1
dc.l{$82000000+NonHandledInterrupt};irq2
dc.l{$82000000+NonHandledInterrupt};irq3
dc.l{$82000000+PORTB_INT};irq4
dc.l{$82000000+NonHandledInterrupt};irq5
dc.l
{$82000000+NonHandledInterrupt};irq6
dc.l{$82000000+NonHandledInterrupt};irq7
dc.l{$82000000+NonHandledInterrupt};irq8
dc.l{$82000000+NonHandledInterrupt};irq9
dc.l{$82000000+NonHandledInterrupt};irq10
dc.l{$82000000+NonHandledInterrupt};irq11
dc.l{$82000000+NonHandledInterrupt};irq12
dc.l{$82000000+NonHandledInterrupt};irq13
dc.l{$82000000+NonHandledInterrupt};irq14
dc.l{$82000000+NonHandledInterrupt};irq15
dc.l{$82000000+NonHandledInterrupt};irq16
dc.l{$82000000+NonHandledInterrupt};irq17
dc.l{$82000000+NonHandledInterrupt};irq18
dc.l{$82000000+NonHandledInterrupt};irq19
dc.l{$82000000+NonHandledInterrupt};irq20
dc.l{$82000000+NonHandledInterrupt};irq21
dc.l{$82000000+NonHandledInterrupt};irq22
dc.l{$82000000+NonHandledInterrupt};irq23
dc.l{$82000000+NonHandledInterrupt};irq24
dc.l{$82000000+NonHandledInterrupt};irq25
dc.l{$82000000+NonHandledInterrupt};irq26
dc.l{$82000000+NonHandledInterrupt};irq27
dc.l{$82000000+NonHandledInterrupt};irq28
dc.l{$82000000+NonHandledInterrupt};irq29
end