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

📄 main.c

📁 基于HC908GP32的电子琴程序
💻 C
字号:
/*-----------------------------------------------------*
*工 程 名:	                                
*硬件连接:                                
*程序描述: SD-HC08 模板生成                            
*/
/*[头文件]*/
#include "GP32C.h"                //映像寄存器地址头文件
#include "KB.h" 
void PWMInit(unsigned int);     //PWM初始化
void PWMconf(unsigned int);      //PWM设置
void Delay_ms(unsigned char );
unsigned char KB1,KB2,KB3,KB4,KB5,KB6,i,KB_valve1,KB_valve2;
//DDRA=0xFF;PTA=0xFF;
/*[主函数]*/
void main()
  {  
  while(1)
  {
  KB_Init(); 
  T1SC0=0x0e;
  KB_valve1=KB_Scan1();
  KB_valve2=KB_Scan2();
  if((KB_valve1!=0xff)||(KB_valve2!=0xff))  //有键按下
  {
  KB1=KB_valve1;
  KB2=KB_valve2;
  KB1&=0b00001000;
  KB2&=0b00001000;
  if(KB1==0||KB2==0)   //L或H按下
  {
   KB3=KB5=KB_valve1;
   KB4=KB6=KB_valve2;
   KB3&=0b00010000;
   KB4&=0b00010000;
   KB5&=0b00100000;
   KB6&=0b00100000;
   if(KB3==0||KB4==0)  //L按下
   {
    if((KB_valve1==0xE6)||(KB_valve2==0xE6))PWMconf(262);
    if((KB_valve1==0xDE)||(KB_valve2==0xDE))PWMconf(294);                   
    if((KB_valve1==0xBE)||(KB_valve2==0xBE))PWMconf(330);
    if((KB_valve1==0xE5)||(KB_valve2==0xE5))PWMconf(349);
    if((KB_valve1==0xDD)||(KB_valve2==0xDD))PWMconf(392);
    if((KB_valve1==0xBD)||(KB_valve2==0xBD))PWMconf(440);
    if((KB_valve1==0xE3)||(KB_valve2==0xE3))PWMconf(494);
    }
    if(KB5==0||KB6==0)   //H按下
    {
     if((KB_valve1==0xEE)||(KB_valve2==0xEE))PWMconf(1046);
     if((KB_valve1==0xD6)||(KB_valve2==0xD6))PWMconf(1175);                   
     if((KB_valve1==0xBE)||(KB_valve2==0xBE))PWMconf(1318);
     if((KB_valve1==0xED)||(KB_valve2==0xED))PWMconf(1397);
     if((KB_valve1==0xD5)||(KB_valve2==0xD5))PWMconf(1568);
     if((KB_valve1==0xBD)||(KB_valve2==0xBD))PWMconf(1760);
     if((KB_valve1==0xEB)||(KB_valve2==0xEB))PWMconf(1976);                     
     }}
     else
     {
     switch(KB_valve1)
     {
     case 0xEE: PWMconf(523);break;                                           
     case 0xDE: PWMconf(558);break;
     case 0xBE: PWMconf(660);break;
     case 0xED: PWMconf(698);break;
     case 0xDD: PWMconf(784);break;
     case 0xBD: PWMconf(880);break;
     case 0xEB: PWMconf(988);break;
     default :  T1SC|=(1<<5);break;                            
     }}}}}
void Delay_ms(unsigned char i)
  {  unsigned char j;
     unsigned char u;
     for(j=0;j<i;j++)
         for(u=0;u<=250;u++) ;
  }


void PWMconf(unsigned int Hz)
  {
     unsigned int Period,Duty;
     Period=2457600/64/Hz;
     PWMInit(Period);
     Duty=Period/1.2;
     T1SC|=(1<<5);        //停止定时器1计数器计数
     //[设置PWM脉宽]
     T1CH0H = (Duty>>8);  //设置高字节
     T1CH0L = Duty;       //设置低字节
     T1SC&=~(1<<5);       //允许定时器1计数器计数
     Delay_ms(190);      //延时100ms
  }
  
  
/*PWMconf:PWM初始化设置--------------------------------*
* 功  能:PWM脉冲周期、占空比的设置                     *
* 参  数:rate=脉宽时钟数,cyc=脉冲周期时钟数            *
* 返  回:无                                            *
*-----------------------------------------------------*/
void PWMInit(unsigned int Period)
{    
    unsigned int Temp=Period;
    //不允许溢出中断,不启动计数,分频因子=64,置位TSTOP,TRST
    T1SC = 0x36;        
    //[设置PWM周期]
    T1MODH = (Temp>>8);     
    T1MODL = Period;      
    //[初始化设置PWM脉宽为0]
    T1CH0H = 0x00;
    T1CH0L = 0x00;
    //设为PWM模式,不允许输出比较中断,输出低电平,不带缓冲
    T1SC0  = 0x1E;      
    //允许定时器1计数寄存器计数           
    T1SC  &= 0xDF;      
} 


    



⌨️ 快捷键说明

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