📄 keydrvavr(16m).c
字号:
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 + -