搜索
bottom↓
回复: 3

TM1629B键盘扫描 键值处理

[复制链接]

出0入0汤圆

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

uint8 Key_A_buf[4],Key_B_buf[4],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[N])
  {
   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[M])
  {
   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[7]=(WELD|OFF);   //LED_A 点亮数据//
disdat_B[4]=(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);
}       
}


阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-8-31 15:27:01 | 显示全部楼层
居然是沙发,不错,整齐!

出0入0汤圆

发表于 2015-8-31 15:57:17 | 显示全部楼层
正如你所说的 主要是讲方法  能够简要讲解下思路吗

出0入0汤圆

发表于 2015-8-31 16:19:20 | 显示全部楼层
楼主写的很好,受教了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表