搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2015-8-29 20:37:59 | 显示全部楼层 |阅读模式
现在,我想用msp430通过矩阵键盘显示一下时间,我参照网上的例程,发现都是通过独立键盘,上下左右键控制,每次加1。我现在的问题是怎么通过矩阵键盘,直接把他改成当前时间,能否给个思路,或者给个例程???

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2015-8-29 20:40:11 | 显示全部楼层
现在我能通过矩阵键盘显示在lcd上数字,但我按一个键后,他会把上一个键值覆盖,怎么可以不覆盖呢

出0入0汤圆

发表于 2015-8-29 20:49:50 | 显示全部楼层
举个例子,输入18,矩阵键盘有对应的数字键,先按个1,光标右移,再输入个8,完成输入,没有数字键通过上下左右键盘输入的,在十位光标处输入1,右键到个位光标处输入8.

出0入0汤圆

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

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

出0入0汤圆

发表于 2015-8-30 11:53:21 | 显示全部楼层
输入三个数就是有三个空要填,按下第一个数,填第一个空,再按一个数填到第二个,再按一个填到第三个,没有确定再按数就等于又从第一个空填充。

出0入0汤圆

 楼主| 发表于 2015-8-30 17:31:26 | 显示全部楼层
xiaodao35 发表于 2015-8-30 11:53
输入三个数就是有三个空要填,按下第一个数,填第一个空,再按一个数填到第二个,再按一个填到第三个,没有 ...

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

出0入0汤圆

发表于 2015-8-30 18:20:08 | 显示全部楼层
程序不好裁给你,大概思路
//如果要输入4位数,建立个临时缓冲区
unsigned char temp[4]={0};
unsigned char cur=0;

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

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

出0入0汤圆

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

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

/***************全局变量***************/
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[row * 4 + col];  // 获取键值
                    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();
    }     
}

出0入0汤圆

 楼主| 发表于 2015-10-28 20:46:42 | 显示全部楼层
xiaodao35 发表于 2015-8-30 18:20
程序不好裁给你,大概思路
//如果要输入4位数,建立个临时缓冲区
unsigned char temp[4]={0};

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

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-26 19:42

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

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