📄 电子琴.txt
字号:
#include "2407A.h"
void initial(); /*初始化子程序 */
void timer3initial(); /*定时器3初始化子程序 */
void pwminitial(); /*PWM初始化子程序 */
unsigned int CMPR1; /*设置PWM周期变量 */
unsigned int T1PER; /*设置Timer1周期变量 */
void inline disable()
{
asm(" SETC INTM"); /*禁止所有中断*/
}
void inline enable()
{
asm(" CLRC INTM"); /*开放所有中断 */
}
void initial()
{
asm(" SETC SXM"); /*抑制符号位扩展 */
asm(" SETC OVM"); /*根据遇到溢出的情况,累加器被设置为它的最大正值或负值 */
asm(" SETC CNF"); /*B0被设置为程序存储空间 */
*SCSR1=0X87FE; /*clock=fin;使能ADC、SCI、SPI、CAN、EVA、EVB模块*/
*WDCR=0X0E8; /*不使能看门狗*/
*IMR=0X0002; /*允许INT2中断*/
*IFR=0X0FFFF; /*清除全部中断标志*/
WSGR=0X00; /*禁止所有等待状态*/
*MCRA=*MCRA|0X0040; /*IOPA6端口设置为基本功能,PWM1 */
*MCRC=*MCRC&0X0FF00; /*IOPE端口设置为一般的I/O功能 */
*PADATDIR=*PADATDIR|0X4000; /*IOPA6设置为输出方式*/
*PEDATDIR=*PEDATDIR|0X0000; /*IOPE端口设置为输入方式*/
}
void timer3initial()
{
*EVBIMRA=*EVBIMRA|0X0080; /*允许定时器3的周期中断 */
*EVBIFRA=*EVBIFRA|0Xffff; /*清除定时器3周期中断标志*/
*T3CON=0X170C; /*Timer3为连续增计数模式,预分频值为128,使用内部时钟*/
*T3PER=0X0c350; /*Timer3的周期寄存器的值根据0.64s延时和预分频值确定,改状态*/
*T3CNT=0X0000; /*Timer3的计数器清零*/
}
void pwminitial()
{
*ACTRA=0X0002; /*PWM1高有效*/
*DBTCONA=0X0000; /*不使能死区控制*/
*CMPR1=CMPR1; /*设置CMPR1,以确定输出占空比*/
*T1PER=T1PER; /*设置Timer1周期寄存器,以确定PWM周期*/
*COMCONA=0X8200; /*使能比较操作*/
*T1CON=0X100C; /*Timer1为连续增计数模式,预分频值为1,使用内部时钟*/
}
void interrupt T3_INT()
{
unsigned int flag;
unsigned int key;
flag=*EVBIFRA&0X0080;
if(flag!=0X0080)
{
enable(); /*开中断*/
return; /*中断返回 */
}
*T3CNT=0X0000; /*Timer3计数器清零*/
*EVBIFRA=*EVBIFRA|0X0080; /*清除定时器3周期中断标志 */
key=*PEDATDIR&0X00FF;
switch(key)
{
case 1: //do 00000001
CMPR1=0X4A9C;
T1PER=0X9538; /*F=261.5Hz,T=3.82ms */
pwminitial(); /*PWM输出初始化 */
*T1CON=*T1CON|0X0040; /*启动Timer1 */
break;
case 2: //re 00000010
CMPR1=0X429A;
T1PER=0X8534; /*F=293.4Hz,T=3.41ms */
pwminitial();
*T1CON=*T1CON|0X0040;
break;
case 4: //mi 00000100
CMPR1=0X3B60;
T1PER=0X76C0; /*F=328.9Hz,T=3.04ms */
pwminitial();
*T1CON=*T1CON|0X0040;
break;
case 8: //fa 00001000
CMPR1=0X37DC;
T1PER=0X6FB8; /*F=349.2Hz,T=2.86ms*/
pwminitial();
*T1CON=*T1CON|0X0040;
break;
case 16: //so 00010000
CMPR1=0X319C;
T1PER=0X6338; /*F=393Hz,T=2.54ms*/
pwminitial();
*T1CON=*T1CON|0X0040;
break;
case 32: //la 00100000
CMPR1=0X2C56;
T1PER=0X58AC; /*F=440Hz,T=2.27ms*/
pwminitial();
*T1CON=*T1CON|0X0040;
break;
case 64: //si 01000000
CMPR1=0X37A6;
T1PER=0X4F4C; /*F=492.1Hz,T=2.03ms */
pwminitial();
*T1CON=*T1CON|0X0040;
break;
case 128: //!do 10000000
CMPR1=0X251C;
T1PER=0X4A38; /*F=525.2Hz,T=1.9ms*/
pwminitial();
*T1CON=*T1CON|0X0040;
break;
}
enable(); /*开中断*/
return; /*中断返回 */
}
void interrupt nothing( )
{
enable();
return;
}
main()
{
disable();
initial();
timer3int();
enable();
*T3CON=*T3CON|0X0040; /*启动Timer3*/
while(1)
{
asm(" nop");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -