探讨矩阵键盘在lcd上的一个小问题
现在,我想用msp430通过矩阵键盘显示一下时间,我参照网上的例程,发现都是通过独立键盘,上下左右键控制,每次加1。我现在的问题是怎么通过矩阵键盘,直接把他改成当前时间,能否给个思路,或者给个例程??? 现在我能通过矩阵键盘显示在lcd上数字,但我按一个键后,他会把上一个键值覆盖,怎么可以不覆盖呢 举个例子,输入18,矩阵键盘有对应的数字键,先按个1,光标右移,再输入个8,完成输入,没有数字键通过上下左右键盘输入的,在十位光标处输入1,右键到个位光标处输入8.xiaodao35 发表于 2015-8-29 20:49
举个例子,输入18,矩阵键盘有对应的数字键,先按个1,光标右移,再输入个8,完成输入,没有数字键通过上下 ...
是lcd的光标右移么?我见过一个lcd菜单,通过输入一组数,如606,按确定键可进入下一级菜单,在按的过程中,这三个数可以随便按,只要不按确定键,就可以顺序的变换,这又是什么道理哈 输入三个数就是有三个空要填,按下第一个数,填第一个空,再按一个数填到第二个,再按一个填到第三个,没有确定再按数就等于又从第一个空填充。 xiaodao35 发表于 2015-8-30 11:53
输入三个数就是有三个空要填,按下第一个数,填第一个空,再按一个数填到第二个,再按一个填到第三个,没有 ...
有这种填空式键盘的例程么,参考一下{:smile:} 程序不好裁给你,大概思路
//如果要输入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里为最终数据
} 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();
}
} xiaodao35 发表于 2015-8-30 18:20
程序不好裁给你,大概思路
//如果要输入4位数,建立个临时缓冲区
unsigned char temp={0};
你好,键值填空这个问题能再探讨一下么
俩月了还没绕明白么...
页:
[1]