?? 電子琴.txt
字號(hào):
#include "2407A.h"
void initial(); /*初始化子程序 */
void timer3initial(); /*定時(shí)器3初始化子程序 */
void pwminitial(); /*PWM初始化子程序 */
unsigned int CMPR1; /*設(shè)置PWM周期變量 */
unsigned int T1PER; /*設(shè)置Timer1周期變量 */
void inline disable()
{
asm(" SETC INTM"); /*禁止所有中斷*/
}
void inline enable()
{
asm(" CLRC INTM"); /*開放所有中斷 */
}
void initial()
{
asm(" SETC SXM"); /*抑制符號(hào)位擴(kuò)展 */
asm(" SETC OVM"); /*根據(jù)遇到溢出的情況,累加器被設(shè)置為它的最大正值或負(fù)值 */
asm(" SETC CNF"); /*B0被設(shè)置為程序存儲(chǔ)空間 */
*SCSR1=0X87FE; /*clock=fin;使能ADC、SCI、SPI、CAN、EVA、EVB模塊*/
*WDCR=0X0E8; /*不使能看門狗*/
*IMR=0X0002; /*允許INT2中斷*/
*IFR=0X0FFFF; /*清除全部中斷標(biāo)志*/
WSGR=0X00; /*禁止所有等待狀態(tài)*/
*MCRA=*MCRA|0X0040; /*IOPA6端口設(shè)置為基本功能,PWM1 */
*MCRC=*MCRC&0X0FF00; /*IOPE端口設(shè)置為一般的I/O功能 */
*PADATDIR=*PADATDIR|0X4000; /*IOPA6設(shè)置為輸出方式*/
*PEDATDIR=*PEDATDIR|0X0000; /*IOPE端口設(shè)置為輸入方式*/
}
void timer3initial()
{
*EVBIMRA=*EVBIMRA|0X0080; /*允許定時(shí)器3的周期中斷 */
*EVBIFRA=*EVBIFRA|0Xffff; /*清除定時(shí)器3周期中斷標(biāo)志*/
*T3CON=0X170C; /*Timer3為連續(xù)增計(jì)數(shù)模式,預(yù)分頻值為128,使用內(nèi)部時(shí)鐘*/
*T3PER=0X0c350; /*Timer3的周期寄存器的值根據(jù)0.64s延時(shí)和預(yù)分頻值確定,改狀態(tài)*/
*T3CNT=0X0000; /*Timer3的計(jì)數(shù)器清零*/
}
void pwminitial()
{
*ACTRA=0X0002; /*PWM1高有效*/
*DBTCONA=0X0000; /*不使能死區(qū)控制*/
*CMPR1=CMPR1; /*設(shè)置CMPR1,以確定輸出占空比*/
*T1PER=T1PER; /*設(shè)置Timer1周期寄存器,以確定PWM周期*/
*COMCONA=0X8200; /*使能比較操作*/
*T1CON=0X100C; /*Timer1為連續(xù)增計(jì)數(shù)模式,預(yù)分頻值為1,使用內(nèi)部時(shí)鐘*/
}
void interrupt T3_INT()
{
unsigned int flag;
unsigned int key;
flag=*EVBIFRA&0X0080;
if(flag!=0X0080)
{
enable(); /*開中斷*/
return; /*中斷返回 */
}
*T3CNT=0X0000; /*Timer3計(jì)數(shù)器清零*/
*EVBIFRA=*EVBIFRA|0X0080; /*清除定時(shí)器3周期中斷標(biāo)志 */
key=*PEDATDIR&0X00FF;
switch(key)
{
case 1: //do 00000001
CMPR1=0X4A9C;
T1PER=0X9538; /*F=261.5Hz,T=3.82ms */
pwminitial(); /*PWM輸出初始化 */
*T1CON=*T1CON|0X0040; /*啟動(dòng)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; /*啟動(dòng)Timer3*/
while(1)
{
asm(" nop");
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -