微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 帮我看看这段按键处理的代码

帮我看看这段按键处理的代码

时间:10-02 整理:3721RD 点击:

void main()
{
while(1)
{
        read_key(); //键盘扫描程序,这是TM1668芯片的键盘扫描程序,如果有按键按下将会把按键的值存入KEY1,KEY2,                                    //KEY3,KEY4,KEY5,这个五个变量中,这是TM1668决定的,只能这样接收
        if(key2 <= 8 && key2>0)  //key2按键的值只有0x01和0x08,因为我只接了两个按键
            {
                if(key2==8)
                    {   
                        s1++;
                    }   
                if(s1!=0)
                    {
                        if(s1==1)
                            {
                                tm1668(table[0],table[0],table[0],table[0],table[0]);
                            }
                        if(s1==2)
                            {
                                tm1668(table[1],table[1],table[1],table[1],table[1]);
                            }
                        if(s1==3)
                            {
                                tm1668(table[2],table[2],table[2],table[2],table[2]);
                            }
                        if(s1==4)
                            {
                                tm1668(table[3],table[3],table[3],table[3],table[3]);
                            }
                        if(s1==5)
                            {
                                s1=0;
                            }
                      }
              }
      }
}
//向TM1668写入1位数据
void send_data1668(unsigned char dat)   
{   
unsigned char i;
STB=0;
for(i=0;i<8;i++)   
  {   
   CLK=0;   
   if(dat & (1 << i))  {DIO=1;}   
     else  {DIO=0;}   
    _nop_();   
   CLK=1;      
  }   
}
//读取1位数据
uchar read_data()
{
    uchar i,k=0;    //i——控制循环次数,k——临时保存读到的数据
   
    DIO=1;                  //释放DIO为输入
    STB=0;                  //保证“STB”为低电平,程序不依赖于之前端口的状态
                            //保证程序在实际运行中不会出现“端口迷失”
    for(i=0;i<8;i++)
    {
        CLK=0;              //先将“CLK”清零
        k=k>>1;
        
        if(DIO == 0)
        {
            k=k&0x7f;     //如果“DIO”为低电平,则把k的最高位清“0”,其他各位保持不变
        }
        else
        {                   //如果“DIO”为高电平,则把k的最高位置“1”,其他各位保持不变
            k=(k|0x80&0xff);
        }
        CLK=1;              //送时钟的上升沿
    }                       //送完一个字节后退出循环
    return(k);              //返回读到的1字节数据
}
//读取键盘值,一次读五个字节
void read_key()
{
    STB=1;
    send_data1668(0x42);
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    key1=read_data();
    key2=read_data();
    key3=read_data();   
    key4=read_data();
    key5=read_data();
    STB=1;   
}
//向tm1668发送数据让数码管显示
void tm1668_led(uchar data6)
{
    STB=1;
    _nop_();
    STB=0;
    send_data1668(0x03);//显示模式设置
    STB=1;
    _nop_();
    STB=0;
    send_data1668(0x44);//固定地址模式
    STB=1;
    _nop_();
    STB=0;
    send_data1668(0xca);//发送地址,LED灯
    send_data1668(data6);//发送数据,data6
    STB=1;
    _nop_();
    STB=0;
    send_data1668(0x8B);//发送显示命令
}
void tm1668(uchar data1,data2,data3,data4,data5)
{
    STB=1;
    _nop_();
    STB=0;
    send_data1668(0x03);//显示模式设置
    STB=1;
//    _nop_();
    STB=0;
    send_data1668(0x44);//固定地址模式
    STB=1;
//    _nop_();
    STB=0;
    send_data1668(0xc0);//发送地址数码管第一位
    send_data1668(data1);//发送数据
    STB=1;
//    _nop_();
    STB=0;
    send_data1668(0xc2);//发送地址第二位
    send_data1668(data2);//发送数据
    STB=1;
//    _nop_();
    STB=0;
    send_data1668(0xc4);//发送地址第三位
    send_data1668(data3);//发送数据
    STB=1;
//    _nop_();
    STB=0;
    send_data1668(0xc6);//发送地址第四位
    send_data1668(data4);//发送数据
    STB=1;
//    _nop_();
    STB=0;
    send_data1668(0xc8);//发送地址,第五位
    send_data1668(data5);//发送数据,data5
    STB=1;
//    _nop_();
    STB=0;
    send_data1668(0x8B);//发送显示命令
}
现在有个问题,当按下按键的时候(比如这个按键发送过来是数据是0x02),这个芯片会一直发送0x02,我想只接收第一个0x02后就不再接收之后的0x02,这样好处理s1,直等到松手后,再按下这个按键,再接收第二0x02

你解决了没有?是怎么解决的。我也遇到了这个问题。

可以相互讨论一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top