在线情况
楼主
  • 头像
  • 级别
    • 积分4
    • 经验39
    • 文章3
    • 注册2012-02-20
    msp430g2231 矩阵键盘设计中遇到问题,真心求教。
    [SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]程序已经做到最简,[/FACE][/SIZE][FACE=宋体][SIZE=9pt]P1.0~[/FACE][/SIZE]P1.7口接矩阵键盘8个引脚(4×4键盘),实现扫描键盘,存入str中
    不知为何,在CCS V4中模拟时,watch str,得不到按键的数据。[/P][SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]比如,当我运行的时候每间断时间,按[/FACE][/SIZE][FACE=宋体][SIZE=9pt]2,[/FACE][/SIZE]str中没有任何显示2。连长得像个2的都没有。。。。[/P][SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]时钟是[/FACE][/SIZE][FACE=宋体][SIZE=9pt]32.768khz[/FACE][/SIZE][/P][SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]//后为注释。[/FACE][/SIZE]
    如需更多信息,可以加QQ:329974601 共同讨论。[/P][SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]
    问题[/FACE][/SIZE]1:是否要加入TIMER或中断?
    问题2:程序逻辑是否有问题?
    问题3:如何修改?[/P][SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]问题[/FACE][/SIZE][FACE=宋体][SIZE=9pt]4:因为我要做一个计算器,[/FACE][/SIZE]key_map能否改为: key_Map[16]={ [/P][SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]'1','2','3','+',
    '4','5','6','-',
    '7','8','9','*',
    '^','0','=','/'[/FACE][/SIZE][/P][SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]};

    多谢多谢~~[/FACE][/SIZE]

    程序如下:
    /**********************************************

    **********************************************/


    #include <msp430g2231.h>

    unsigned char key_Pressed, // if there is key pressed
                 key_val, // save the keyvalue
                 key_Flag; // 按键是否释放,即取消脉冲的干扰
                            // in otherwords, the program can scan the next value
    unsigned char tmp;
    unsigned char key_Map[16] ={ //keypad decode table
    0xc0,0xf9,0xa4,0xb0,
    0x99,0x92,0x82,0xf8,
    0x80,0x90,0x88,0x83,
    0xc6,0xa1,0x86,0x8e

    };
    unsigned char str[30]={0};
    int counter=0;
    //------------------------------------------------------------------------------
    // Function prototypes
    //------------------------------------------------------------------------------
    void init_Keyboard();
    void check_Key();
    void delay();
    void key_Event();
    /*********************************************
    * main()
    *********************************************/
    void main(void)
    {
    unsigned char str[30]={0};
    int counter=0;

    WDTCTL = WDTHOLD + WDTPW ; // stop watchdog

    init_Keyboard(); // 初始化 键盘[/P][SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]while(1)
    {
    key_Event(); //检测是否有按键按下[/FACE][/SIZE][/P][SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]if (key_Flag == 1) // if there is value
    {

    key_val = 0xFF;
    key_Flag = 0; // clear flag
    }

    }
    }

    void init_Keyboard(void)
    {
    P1DIR |= 0x0F; // P1.0~P1.3 设为输入[/FACE][/SIZE]
    P1DIR &= 0x0F; // set P1.4~P1.7 设为输出
    P1OUT |= 0xF0; // P1.4~P1.7 输出 0

    key_Flag = 0;// initialize key_Flag
    key_Pressed = 0;// initialize key_Pressed
    key_val = 0xFF;

    }
    /*********************************************
    * Check_Key(),get key value
    *********************************************/
    void check_Key(void){


    unsigned char row ,col,tmp1,tmp2;
    // 设置逐行扫描,单次,只选择一位输出0,其余位输出1,检测输入值,是否为0,若为0,则定位了行列
    tmp1 = 0x80;
    for(row=0;row<4;row++){
    P1OUT |= 0xF0;       // P1.4~P1.7=1
    P1OUT &= ~tmp1;             //onepin of P1.4~P1.7 is 0
    tmp1 >>= 1;            // tmp1 右移[/P][SIZE=3][/SIZE][P][FACE=宋体][SIZE=9pt]P1DIR |= 0x0F;
    delay();
    if ((P1IN & 0x0F) < 0x0f){ // if P1IN P1.0~P1.3has one 0
    tmp2 = 0x01; // tmp2is used to check which col is 0
    for(col =0;col<0x04;col++){ // check col
    if((P1IN & tmp2)!=0x00){ // judge this col
    key_val =key_Map[ row*4 +col] ; 查表得到键值[/FACE][/SIZE]
    str[counter]=key_val;           赋值给str
    counter++;

    return; // out of loop
    }
    tmp2 <<= 1; // tmp2 shuffer left
    }
    }
    if(key_val==0xFF)
    {
    key_Pressed = 0;
    }
    }

    }
    /***********************************************************
    * delay,cancel the glitch
    ************************************************************/
    void delay(){
    unsigned char tmpa;
    for(tmpa=0x0f;tmpa>0;tmpa--);
    }
    /************************************************************
    * key_Event(),check if there is key being pressed,if soget the value
    *************************************************************/
    void key_Event(void)
    {

    P1OUT &= 0x0F; // set P1.0 to 1.3 output 1
    P1OUT = 0xFF;
    P1DIR &= 0xF0; // P1.0~P1.3 set as input
    P1DIR |= 0xF0; // set P1.4~P1.7 set as output
    P1OUT &= 0x0F; // set P1OUT

    tmp = P1IN; // get P1IN
    if ((key_Pressed ==0x00)&&((tmp & 0x0F) < 0x0f))
    { //if there is key pressed
    key_Pressed = 1; // if so,set key_Pressed

    delay(); //cancel glitch

    check_Key(); // call check_Key(),get key value
    }else if ((key_Pressed ==1)&&((tmp & 0x0F) == 0x0F))
    { //if key is relessed
    key_Pressed = 0; // clear key_Pressed
    key_Flag = 1; // set key_Flag
    }

    }[/P][SIZE=3][/SIZE][P][FACE=Times New Roman][SIZE=3] [/FACE][/SIZE][/P][SIZE=3][/SIZE]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
      • 积分4
      • 经验39
      • 文章3
      • 注册2012-02-20
      [P]没有人知道么。。。。楼主快疯了。。[/P][P]又写了个更简单的。现在能部分实现键盘功能了。。[/P]
      微控网感谢您的参与
      在线情况
      3
      • 头像
      • 级别
      • 门派
      • 职务总版主
      • 声望+9
      • 财富5
      • 积分3065
      • 经验390701
      • 文章6744
      • 注册2006-03-07
      楼主你好,我觉得你提问的出发点有点儿搞错了。你这种将程序贴出来,然后让人帮你找问题的这类提问基本很难得到有人解答的。
      因为要别人参透你这样程序和思路,基本上没人去干这事。
      我觉得倒建议用一个建议性或思路方面的提问可能会更有助于得到更多的帮助。
      [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
      在线情况
      4
      • 头像
      • 级别
        • 积分3
        • 经验77
        • 文章3
        • 注册2012-02-05
        我也刚接触这系列的,求学习....
        即使今天心情疲惫,明天仍须进取.
        在线情况
        5
        • 头像
        • 级别
          • 积分4
          • 经验39
          • 文章3
          • 注册2012-02-20
          [P][QUOTE][b]下面引用由[u]DC[/u]发表的内容:[/b]

          楼主你好,我觉得你提问的出发点有点儿搞错了。你这种将程序贴出来,然后让人帮你找问题的这类提问基本很难得到有人解答的。
          因为要别人参透你这样程序和思路,基本上没人去干这事。
          我觉得倒建议用一个建议性...[/QUOTE]
          [/P][P]恩。我已经解决了键盘连接的问题了。但是你的建议真的受用。以后会注意。[/P]
          微控网感谢您的参与
          Powered by LeadBBS 9.2 .
          Page created in 0.2812 seconds with 5 queries.