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

📄 keydrvavr(16m).c

📁 AVR单片机应用开发指南及实例,包含许多实例,挺不错
💻 C
📖 第 1 页 / 共 3 页
字号:
        Key_status[i]=0;
        Key_hit_status[i]=0;
    }
    
    PORTD |= (1<<P33);    //打开电压驱动

   

    
    TIFR |= (1<<TOV1) ;  //TOV1  clr
     
     
    TCCR1B = 0x00;       //stop
    TCNT1 = 0x7d00;         
    TCCR1B = 0x05;       //128us      //总为4S
    //
    //
    init_status=0x00;
    
    TCNT2 = 0xbf;        //计数初值
                         //TIFR,TOV2    
    TIFR |= (1<<TOV2) ;  //TOV2  clr 
    TCCR2 = 0x07 ;       // 一个计数   1/1024clk     
    TIMSK = 0x40;
    SREG = 0x80;         //allow  I int
     
    /////测试专用
     
    //键自检
    //从1号键开始, 每隔4S ,
    for(i=0;i<8;i++)
    {
          
        Key_status[i] = 0x11;   //动作标志  0x11  动作  0x22 保持
        Key_hit_status[i] = 0x00;
        Key_hit_time[i] = 0x30;   //时间长度
        Key_lidu_reg[i] = 0xb0;   //动作频率   
        Key_lidu_high[i] = 0xa0;
        Key_lidu_low[i] = 255-0xa0;
        PORTB |= (1<<i);
        while( !(TIFR&(1<<TOV1)) )
        {
            if(timer_status_reg==0x01)
            {
                timer_status_reg=0x00;
                //轮判断键的状态和对应的动作    key_status_xx :  00 关闭  0x11动作  0x22保持 
                //Key_status_   ;Key_lidu_  ;Key_lidu_reg_ ;Key_hit_time_; 
                if(Key_status[i]==0x11)
                {
                    if(Key_hit_time[i]==0)
                    {  //击键结束,到保持阶段
					   PORTD ^= (1<<TXDLED);
                        Key_status[i]=0x22;
                        PORTB|=(1<<i);   //1  保持
                        
                        PORTA |=(1<<i);  //打开保持信号 
                    }
                    else     //击键过程
                    {
                        Key_lidu_reg[i]--;
                        if(Key_lidu_reg[i]==0)
                        {
                
                            if(Key_hit_status[i]==0)            //0  表示目前是高电平   
                            {
                                Key_hit_status[i]=1; 
                                Key_lidu_reg[i]=Key_lidu_low[i];
                            }
                            else
                            {
                                Key_hit_status[i]=0; 
                                Key_lidu_reg[i]=Key_lidu_high[i];    
                            }
                            Key_hit_time[i]--;    
              
                            PORTB ^= (1<<i); // PORTB0=~PORTB0 ; //脉冲
                        }
                    }
                }//NO.
            }
       /////轮巡结束        
           else        //定时未到
           {
           }       
        } 
        
        PORTB&=~(1<<i);       //关闭键
        PORTA&=~(1<<i); 
           //
        TIFR|=(1<<TOV1) ;  //TOV1  clr    
        TCNT1=0x7d00;        
    ///////
    }    
    ////完成前8个键自检
  
  
  
    i=8;
    j=0;
    k=4;  
    for(i=8;i<12;i++)
    {
        
        Key_status[i] = 0x11;   //动作标志  0x11  动作  0x22 保持
        Key_hit_status[i]=0x00;
        Key_hit_time[i]=0x30;   //时间长度
        Key_lidu_reg[i]=0xb0;   //动作频率   
        Key_lidu_high[i]=0xa0;
        Key_lidu_low[i]=255-0xa0;
        PORTC|=(1<<j);
        while(!(TIFR&(1<<TOV1)))
        {
            if(timer_status_reg==0x01)
            {
                timer_status_reg=0x00;
                //轮判断键的状态和对应的动作    key_status_xx :  00 关闭  0x11动作  0x22保持 
                //Key_status_   ;Key_lidu_  ;Key_lidu_reg_ ;Key_hit_time_; 
     
                if(Key_status[i]==0x11)
                {
                    if(Key_hit_time[i]==0)
                    {   //击键结束,到保持阶段
                        Key_status[i]=0x22;
                        PORTC|=(1<<j);   //1   //保持 
                      //PORTB |=(1<<PORTB0)   1 // PORTB0=0x00;//关闭PWM
                        PORTC |=(1<<k); //    PORTA0=1;        //打开保持信号 
                    }
                    else     //击键过程
                    {
                        Key_lidu_reg[i]--;
                        if(Key_lidu_reg[i]==0)
                        {
                            if(Key_hit_status[i]==0)            //0  表示目前是高电平   
                            {
                                Key_hit_status[i]=1; 
                                Key_lidu_reg[i]=Key_lidu_low[i];
                            }
                            else
                            {
                                Key_hit_status[i]=0; 
                                Key_lidu_reg[i]=Key_lidu_high[i];    
                            }
                            Key_hit_time[i]--;    
              
                            PORTC ^= (1<<j); // PORTB0=~PORTB0 ; //脉冲
                        }
                    }
                }//NO.
            }
            /////轮巡结束        
            else        //定时未到
            {
            }       
        } 
        
        PORTC&=~(1<<j);       //关闭键
        PORTC&=~(1<<k); 
         //
         j++;
         k++;
         //
         TIFR|=(1<<TOV1) ;  //TOV1  clr    
        TCNT1=0x7d00; 
    } 
     
    //完成后四个键自检            
    
    ////自检完毕    
    uart_init();         //UART 初始化
    TCCR1B=0x00;   //Timer1 stop     
    init_status=0x01;
    Midi_data_flow[0]=0;
	PORTD|= (1<<TXDLED);
//**********************************************
////      
///////////////////
/***********************************************/
//主循环开始   
    while(1)
    {
        
		  
            if (Midi_data_flow[data_out]!=0)        //
               {
               	Midi_data_flow[data_out]=0;
               	data_out++;
               	if(data_out>249)
               	 {
               	 data_out=0;
               	 }
               	 data_temp2=Midi_data_flow[data_out]; //
               	 Meboard_key_num = (data_temp2-0x1a)%12;  //本板的键序号
               	 //
               	 Midi_data_flow[data_out]=0;
               	 data_out++;
               	if(data_out>249)
               	 {
               	 data_out=0;
               	 }
               	 data_temp2=Midi_data_flow[data_out];  //力度
               	 
               	 if(data_temp2==0)     //关闭键
                         {
						   
                             switch(Meboard_key_num)        //具体键号
                             {
                                 case  0:    PORTB&=~(1<<PORTB0);       //PORTB0=0;       //关闭PWM
                                             PORTA&=~(1<<PORTA0);       //=0;        //关闭保持信号
                                             Key_status[Meboard_key_num]=00;   //关闭状态
                                             break;    

                                 case  1:    PORTB&=~(1<<PORTB1);       
                                             PORTA&=~(1<<PORTA1);       
                                             Key_status[Meboard_key_num]=00;   
                                             break;    

                                 case  2:    PORTB&=~(1<<PORTB2);      
                                             PORTA&=~(1<<PORTA2);         
                                             Key_status[Meboard_key_num]=00;   
                                             break;    

                                 case  3:    PORTB&=~(1<<PORTB3);     
                                             PORTA&=~(1<<PORTA3);          
                                             Key_status[Meboard_key_num]=00;   
                                             break;    

                                 case  4:    PORTB&=~(1<<PORTB4);     
                                             PORTA&=~(1<<PORTA4);        
                                             Key_status[Meboard_key_num]=00;   
                                             break;    

                                 case  5:    PORTB&=~(1<<PORTB5);     
                                             PORTA&=~(1<<PORTA5);          
                                             Key_status[Meboard_key_num]=00;   
                                             break;    

                                 case  6:    PORTB&=~(1<<PORTB6);     
                                             PORTA&=~(1<<PORTA6);         
                                             Key_status[Meboard_key_num]=00;   
                                             break;    

                                 case  7:    PORTB&=~(1<<PORTB7);     
                                             PORTA&=~(1<<PORTA7);          
                                             Key_status[Meboard_key_num]=00;   
                                             break;    

⌨️ 快捷键说明

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