1178951695 发表于 2015-8-29 20:37:59

探讨矩阵键盘在lcd上的一个小问题

现在,我想用msp430通过矩阵键盘显示一下时间,我参照网上的例程,发现都是通过独立键盘,上下左右键控制,每次加1。我现在的问题是怎么通过矩阵键盘,直接把他改成当前时间,能否给个思路,或者给个例程???

1178951695 发表于 2015-8-29 20:40:11

现在我能通过矩阵键盘显示在lcd上数字,但我按一个键后,他会把上一个键值覆盖,怎么可以不覆盖呢

xiaodao35 发表于 2015-8-29 20:49:50

举个例子,输入18,矩阵键盘有对应的数字键,先按个1,光标右移,再输入个8,完成输入,没有数字键通过上下左右键盘输入的,在十位光标处输入1,右键到个位光标处输入8.

1178951695 发表于 2015-8-29 21:56:44

xiaodao35 发表于 2015-8-29 20:49
举个例子,输入18,矩阵键盘有对应的数字键,先按个1,光标右移,再输入个8,完成输入,没有数字键通过上下 ...

是lcd的光标右移么?我见过一个lcd菜单,通过输入一组数,如606,按确定键可进入下一级菜单,在按的过程中,这三个数可以随便按,只要不按确定键,就可以顺序的变换,这又是什么道理哈

xiaodao35 发表于 2015-8-30 11:53:21

输入三个数就是有三个空要填,按下第一个数,填第一个空,再按一个数填到第二个,再按一个填到第三个,没有确定再按数就等于又从第一个空填充。

1178951695 发表于 2015-8-30 17:31:26

xiaodao35 发表于 2015-8-30 11:53
输入三个数就是有三个空要填,按下第一个数,填第一个空,再按一个数填到第二个,再按一个填到第三个,没有 ...

有这种填空式键盘的例程么,参考一下{:smile:}

xiaodao35 发表于 2015-8-30 18:20:08

程序不好裁给你,大概思路
//如果要输入4位数,建立个临时缓冲区
unsigned char temp={0};
unsigned char cur=0;

if(key<10)        //有效的0-9数字
{
temp=key;
key=nokey;
cur=(cur+1)%4;
//temp里为临时数据
}

if(key==enter)        //有效的功能键
{
key=nokey;
//temp里为最终数据
}

1178951695 发表于 2015-8-30 20:29:43

xiaodao35 发表于 2015-8-30 18:20
程序不好裁给你,大概思路
//如果要输入4位数,建立个临时缓冲区
unsigned char temp={0};


我现在键盘扫描程序,没问题,但如何实现它的按键功能呢???
#include<msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned intuint;

/***************全局变量***************/
uchar key_Pressed;      //按键是否被按下:1--是,0--否
uchar key_val;          //存放键值
uchar key_Flag;         //按键是否已放开:1--是,0--否
//设置键盘逻辑键值与程序计算键值的映射
uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

/*******************************************
函数名称:Init_Keypad
功    能:初始化扫描键盘的IO端口
参    数:无
返回值:无
********************************************/
void Init_Keypad(void)
{   
    P1DIR = 0xf0;       //P1.0~P1.3设置为输入状态, P1.4~P1.7设置为输出状态
    P1OUT |= 0xf0;      // P1.4~P1.7输出高电平
    key_Flag = 0;      
    key_Pressed = 0;   
    key_val = 0;
}
/*******************************************
函数名称:Check_Key
功    能:扫描键盘的IO端口,获得键值
参    数:无
返回值:无
********************************************/
void Check_Key(void)
{
    uchar row ,col,tmp1,tmp2;
   
    tmp1 = 0x80;
    for(row = 0;row < 4;row++)            //行扫描
    {
      P1OUT = 0xf0;                      //P1.4~P1.7输出全1
      P1OUT -= tmp1;                      //P1.4~p1.7输出四位中有一个为0
      tmp1 >>=1;                              
      if ((P1IN & 0x0f) < 0x0f)         //是否P1IN的P1.0~P1.3中有一位为0
      {                     
            tmp2 = 0x01;                         // tmp2用于检测出那一位为0
            for(col = 0;col < 4;col++)            // 列检测
            {         
                if((P1IN & tmp2) == 0x00)         // 是否是该列,等于0为是
                {         
                  key_val = key_Map;// 获取键值
                  return;                         // 退出循环
                }
                tmp2 <<= 1;                        // tmp2右移1位
            }
      }
    }      
}
/*******************************************
函数名称:delay
功    能:延时约15ms,完成消抖功能
参    数:无
返回值:无
********************************************/
void delay()
{
    uint tmp;
   
    for(tmp = 12000;tmp > 0;tmp--);
}
/*******************************************
函数名称:Key_Event
功    能:检测按键,并获取键值
参    数:无
返回值:无
********************************************/
void Key_Event(void)
{   
    uchar tmp;
   
    P1OUT &= 0x00;            // 设置P1OUT全为0,等待按键输入
    tmp = P1IN;               // 获取 p1IN
    if ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下
    {                     
      key_Pressed = 1;      // 如果有按键按下,设置key_Pressed标识
      delay();                //消除抖动
      Check_Key();            // 调用check_Key(),获取键值
    }   
    else if ((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放
    {                     
      key_Pressed = 0;      // 清除key_Pressed标识
      key_Flag    = 1;      // 设置key_Flag标识
    }
    else
    {
      _NOP();
    }   
}

1178951695 发表于 2015-10-28 20:46:42

xiaodao35 发表于 2015-8-30 18:20
程序不好裁给你,大概思路
//如果要输入4位数,建立个临时缓冲区
unsigned char temp={0};


你好,键值填空这个问题能再探讨一下么

腹黑男 发表于 2015-11-23 10:27:06

俩月了还没绕明白么...
页: [1]
查看完整版本: 探讨矩阵键盘在lcd上的一个小问题