py-industry 发表于 2015-8-31 15:15:53

TM1629B键盘扫描 键值处理

看过很多前辈的处理程式 觉得我的比较简洁和明朗。发出来给大家参考和建议!总觉得很简单的程式 在这上面看到的都是很复杂化的东西!也许上面的东西原本就不是实际使用的东西!
采用了2片TM1629,程序有点长,都是同类化的东西,主要是明朗,扫描占MCU的时间也少!
感谢昨天在这帮助我的前辈们!细化的东西自己想想再加入。技术人主要是找方法,不是找程式!
图片在这上不了,自己也很少来这里! 图片可以查看我昨天的求助帖子!
再次谢谢大家的帮助!

uint8 Key_A_buf,Key_B_buf,key_val,key_get;

void SPI_Read_A(unsigned char *KeyBuff_A)
{
        unsigned char N,i,RetDat=0;
        NOP();
        NOP();
        PORTC|=(1<<ASTB);
        PORTC|=(1<<BSTB);
        PORTC|=(1<<DIO);
        PORTC|=(1<<CLK);
        NOP();
    NOP();
        SPI_Write_A(0x42); //发送读键盘命令//      
        NOP();
        NOP();
        PORTC|=(1<<DIO);
        DDRC&=~(1<<DIO);   //设定为输入//
        NOP();
        NOP();
        for(i=0;i<4;i++)   
        {      
                for(N=0;N<8;N++)
                {
                       
                        RetDat>>=1;
                        PORTC&=~(1<<CLK);
                        NOP();
                        NOP();
                        NOP();
                        NOP();
                  PORTC|=(1<<CLK);
            NOP();
                        NOP();
                        if((PINC&0x02)!=0)
                       {
                          RetDat|=0x80;
                       }
                        NOP();
                        NOP();                  
                }
           *(KeyBuff_A+i)=RetDat;
           RetDat=0;
           NOP();
           NOP();
        }
        PORTC|=(1<<ASTB);
        PORTC|=(1<<DIO);
        DDRC|=(1<<DIO);   //设定为输出//
        NOP();
        NOP();                        
}
void SPI_Read_B(unsigned char *KeyBuff_B)
{
        unsigned char N,i,RetDat=0;
        NOP();
        NOP();
        PORTC|=(1<<ASTB);
        PORTC|=(1<<BSTB);
        PORTC|=(1<<DIO);
        PORTC|=(1<<CLK);
    NOP();
        NOP();
        SPI_Write_B(0x42);    //发送读键盘命令//      
        NOP();
        NOP();
        PORTC|=(1<<DIO);
        DDRC&=~(1<<DIO);   //设定为输入//
        NOP();
        NOP();
        for(i=0;i<4;i++)   
        {      
                for(N=0;N<8;N++)
                {
                        RetDat>>=1;
                        PORTC&=~(1<<CLK);
                        NOP();
                        NOP();
                        NOP();
                        NOP();
                        PORTC|=(1<<CLK);
                        NOP();
                        NOP();
                        if((PINC&0x02)!=0)
                       {
                          RetDat|=0x80;
                       }
                        NOP();
                        NOP();                     
                }
                *(KeyBuff_B+i)=RetDat;
                RetDat=0;
                NOP();
                NOP();
        }
        PORTC|=(1<<BSTB);
        PORTC|=(1<<DIO);
        DDRC|=(1<<DIO);   //设定为输出//                        
    NOP();
        NOP();
}

//键盘键值扫描//
void key_val_pro(void)
{
uint8 N,M;
SPI_Read_A(Key_A_buf);
for(N=0;N<4;N++)
{
switch(Key_A_buf)
{
   case 0x08:
             switch(N)
                          {
                           case 0://sw2//
                                key_val=2;    //键值//
                                          key_get=1;    //压键标志//
                                          break;
                           case 1://sw4//
                                key_val=4;   
                                          key_get=1;   
                                          break;
                           case 2://sw6//
                                key_val=6;   
                                          key_get=1;
                                          break;
                           case 3://sw8//
                                key_val=8;   
                                          key_get=1;
                                          break;
                           default:
                                break;
                          }
             break;
   case 0x80:
             switch(N)
                          {
                           case 0:   //sw3//
                                key_val=3;   
                                          key_get=1;
                                          break;
                           case 1:   //sw5//
                                key_val=5;   
                                          key_get=1;
                                          break;
                           case 2:   //sw7//
                                key_val=7;   
                                          key_get=1;
                                          break;
                           case 3:   //sw9//
                                key_val=9;   
                                          key_get=1;
                                          break;
                           default:
                                break;
                          }
             break;
   case 0x04:
             switch(N)
                          {
                           case 0:   //sw10//
                                key_val=10;   
                                          key_get=1;
                                          break;
                           case 1:   //sw12//
                                key_val=12;   
                                          key_get=1;
                                          break;
                           case 2://sw14//
                                key_val=14;   
                                          key_get=1;
                                          break;
                           case 3://sw16//
                                key_val=16;   
                                          key_get=1;
                                          break;
                           default:
                                break;
                          }
             break;
   case 0x40:
             switch(N)
                          {
                           case 0:   //sw11//
                                key_val=11;   
                                          key_get=1;
                                          break;
                           case 1:   //sw13//
                                key_val=13;   
                                          key_get=1;
                                          break;
                           case 2:   //sw15//
                                key_val=15;   
                                          key_get=1;
                                          break;
                           case 3:   //sw17//
                                key_val=17;   
                                          key_get=1;
                                          break;
                           default:
                                break;
                          }
             break;
   default:
             break;
}
}

SPI_Read_B(Key_B_buf);
for(M=0;M<4;M++)
{
switch(Key_B_buf)
{
   case 0x08:
             switch(M)
                          {
                           case 0://sw18//
                                key_val=18;    //键值//
                                          key_get=1;    //压键标志//
                                          break;
                           case 1://sw20//
                                key_val=20;   
                                          key_get=1;   
                                          break;
                           case 2://sw22//
                                key_val=22;   
                                          key_get=1;
                                          break;
                           case 3://sw_nop//
                                //key_val=88;   
                                          //key_get=0;
                                          break;
                           default:
                                break;
                          }
             break;
   case 0x80:
             switch(M)
                          {
                           case 0:   //sw19//
                                key_val=19;   
                                          key_get=1;
                                          break;
                           case 1:   //sw21//
                                key_val=21;   
                                          key_get=1;
                                          break;
                           case 2:   //sw23//
                                key_val=23;   
                                          key_get=1;
                                          break;
                           case 3:   //sw_nop//
                                //key_val=88;   
                                          //key_get=0;
                                          break;
                           default:
                                break;
                          }
             break;
   case 0x04:
             switch(M)
                          {
                           case 0:   //sw24//
                                key_val=24;   
                                          key_get=1;
                                          break;
                           case 1:   //sw26//
                                key_val=26;   
                                          key_get=1;
                                          break;
                           case 2://sw28//
                                key_val=28;   
                                          key_get=1;
                                          break;
                           case 3://sw_nop//
                                //key_val=88;   
                                          //key_get=0;
                                          break;
                           default:
                                break;
                          }
             break;
   case 0x40:
             switch(M)
                          {
                           case 0:   //sw25//
                                key_val=25;   
                                          key_get=1;
                                          break;
                           case 1:   //sw27//
                                key_val=27;   
                                          key_get=1;
                                          break;
                           case 2:   //sw29//
                                   key_val=29;   
                                          key_get=1;
                                          break;
                           case 3:   //sw_nop//
                                //key_val=88;   
                                          //key_get=0;
                                          break;
                           default:
                                break;
                          }
             break;
   default:
             break;
}
}
}


void main(void )
{
uint8 i;
init_devices();
PORTC&=~(1<<P_LED);
init_TM1629B();
delay_ms(1000);
dis_coun=98765;   //计数器//
disdat_A=(WELD|OFF);   //LED_A 点亮数据//
disdat_B=(COUN|CUR|FUN);   //LED_B 点亮数据//
display_A();
TM1629B_Write_A(Dis_Buf_A);
delay_ms(1000);
display_B();
display_COUN();
TM1629B_Write_B(Dis_Buf_B);

while(1)
{
delay_ms(1);
key_val_pro();
delay_ms(1);
dis_coun=key_val;
display_B();
display_COUN();
TM1629B_Write_B(Dis_Buf_B);
delay_ms(1);
}       
}


lingergz 发表于 2015-8-31 15:27:01

居然是沙发,不错,整齐!

myxiaonia 发表于 2015-8-31 15:57:17

正如你所说的 主要是讲方法能够简要讲解下思路吗

Andyndy313 发表于 2015-8-31 16:19:20

楼主写的很好,受教了
页: [1]
查看完整版本: TM1629B键盘扫描 键值处理