打印

怎样对4*4键盘按键次数计数??怎么办??

[复制链接]
6163|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangzk|  楼主 | 2010-7-13 10:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
void main ()
{
  SP=0x5f;
  req=0;
  busy=1;
  TMOD=0x01;
  EA = 1;
  ET0 = 1;
  TH0 = 0xdc;
  TL0 = 0x00;/////////定时10ms扫描键盘基时
  TR0 = 1;
  while(1)
  {
        uchar   key_num;
       if (Key_Scan_F)///这句话什么意思??
      {
         Key_Scan_F = 0;
          key_num= keyscan();////接受键盘键值////////
         //////my  other  code ///////
     }
  }
}
void Timer0SRV (void) interrupt 1 using 2
{
TH0 = 0xdc;
TL0 = 0x00;
Key_Scan_F = 1;   //允许扫描键盘
}

问题,按键按下一次,lcd显示键值,再按一次,lcd显示下一个键值怎么办??是否涉及对键盘按键次数??在程序那个位置对按键次数计数?思考了很久,baidu  gugu了不少资料还是有些茫然.
:L 按键每按下一次,lcd显示地址就要加一.最后再把这些数组成一个 long 整形,存储在24c01里面!

相关帖子

沙发
zljzlj| | 2010-7-13 10:31 | 只看该作者
是想把对应的 16个按键的键值显示出来,还是利用按键 触发某一个事件值的增减啊?

使用特权

评论回复
板凳
wangzk|  楼主 | 2010-7-13 10:32 | 只看该作者
本帖最后由 wangzk 于 2010-7-13 10:39 编辑

回楼上的 :  我是想把16个按键键值都在lcd显示出来!  比如按键1按下第一次,
在lcd坐标(8,10)显示按键键值"1",第二次按键2按下(也有可能是其他按键),在lcd
坐标(9,10)显示出来'2'.不是控制事件  准确的是把16个按键中的9个阿拉伯数字都
显示出来  其他是功能键.

使用特权

评论回复
地板
zljzlj| | 2010-7-13 10:34 | 只看该作者
这个有什么难度吗?
定义好你的按键模式,如有且只有一个有效,还是允许多个同时有效,总之见到驱动中有有效的按键,就把对应的值发给显示drv就可以了,

----------------------------------
只提供思路,不提供代码

使用特权

评论回复
5
zljzlj| | 2010-7-13 11:18 | 只看该作者
ok!
你的描述还是不够清晰,是否是这样子
1.有16个按键,其中9个为 数字键盘,其它7个为功能按键
2.9个数字键是否位置固定呢?还是不分先后,谁先按下就从1往后排序,一直到9呢?
3.不管2如何定义,看似你在LCD上显示1-9的坐标是固定的
4.LCD显示缓冲定义,对应显示的1—9
5.根据2的定义,将数值放在显示缓冲里,至于一次显示一个,还是保留前一个,完全是你定义决定的。


建议:  做一个东东之前,自己先写一个 SRS,根据这个在写一个SDS,否则很难说清楚的了
祝你成功!

使用特权

评论回复
6
wangzk|  楼主 | 2010-7-13 12:38 | 只看该作者
真无语了  我觉得自己也没表达清楚  估计表达清楚了 ,问题也就明朗了

使用特权

评论回复
7
wangzk|  楼主 | 2010-7-13 12:44 | 只看该作者
本帖最后由 wangzk 于 2010-7-13 13:00 编辑

再试着说一遍::L
我其实是想在lcd2个位置由4×4键盘输入2组数据  这两组数据长度是固定的
一个数据长度是××××,4个阿拉伯数;另一个数据是××××××××,8个阿拉伯数
思路:lcd开始接收键盘值时要有“设置”键,接收数据结束时要有“enter”键

但具体怎么办~~~还是摸不着头脑~~~

我现在能做到的,也只是在lcd上显示一个键盘字符:

if (Key_Scan_F)
  {
   Key_Scan_F = 0;
   key_num= keyscan();
   disp_eng(key_num);
  }

至于怎么接受××××4个键值    很迷惑

使用特权

评论回复
8
开始的梦想| | 2010-7-13 12:48 | 只看该作者
路过

使用特权

评论回复
9
wangzk|  楼主 | 2010-7-13 13:01 | 只看该作者
感谢zljzlj关注  !:) 5# zljzlj

使用特权

评论回复
10
zljzlj| | 2010-7-13 14:13 | 只看该作者
是你所说的4X4键盘误导了观众、
你所描述的问题 应该就是一个如何按键 + 显示 + EEPROM 读写的问题吧(可能类似一个EE写入器)
这个和几个按键没什么太大关系(取决于你是想一个位置对应一个数字输入,还是一个位置通过+ — 按键输入)

再猜测一下:楼主是否想要将一个 4byte 的变量 + 8byte的变量通过按键输入(lcd显示),再经按键确认后存储的EEPROM里

你可以反过来想,不要想按那个按键,显示出什么数字,而是针对lcd固定位置所能接受的数据范围作**

比如按键分为 set,enter,cancle, left,right,up,down类似于导航按键
1在初始化后显示默认值,或当前值
2按下set按键进入设置状态A      4字节区域1234进入被设置状态,4位置闪烁状态,此时可通过up,down
按键改变当前数值(0-9);如果按left按键位置3进入被设置闪烁状态,此时可通过up,down按键改变当前位置数值(0-9),以此类推,可以循环调整1234各位置的数值,当按下enter按键确认后,可以自动进入8字节区域设置状态B     12345678,默认第8位置闪烁,方式同4字节区域一样.........................

3 至于怎么接受按键键值
  按键只是产生具体键值即可,如按键up,假设其键值为0x01,那么由此可演化出up的短、中、长按下以及对应的抬起,如果你不需要这么复杂,干脆就一个短按+短抬算了(要有抬起状态,否则如果一直产生一个键值,就乱了)
  假设 EK_UpSP  = 0x01
           EK_UpSL = 0x21
           利用sp或sl都可以
如: upSL --- oKey_Up ---  对应被调整位置变量加1




关于按键消息的处理很重要,如果你能把这个搞懂,以后做复杂的应用会很顺利,否则可能会很乱。。。。
好了,不知你现在是否能理解

使用特权

评论回复
11
wangzk|  楼主 | 2010-7-13 14:26 | 只看该作者

没看懂 笨死了

本帖最后由 wangzk 于 2010-7-13 14:43 编辑

ls的好老师啊  赞个!  虽然还没理解:L待我慢慢看吧

使用特权

评论回复
12
木字四点水| | 2010-7-13 14:57 | 只看该作者
顶个,加分,哈哈,学习了

使用特权

评论回复
13
xiazai1| | 2010-7-13 19:13 | 只看该作者
利用按键 触发某一个事件值的增减

使用特权

评论回复
14
wangzk|  楼主 | 2010-7-14 08:17 | 只看该作者
怎样去接收 4×4键值  ???
还不明白 :L

使用特权

评论回复
15
wangzk|  楼主 | 2010-7-14 09:57 | 只看该作者
uchar keyscan()  
{
         uchar        key;
         uchar        keytmp;
         P1_4=0;
         P1_5=1;
         P1_6=1;
         P1_7=1;
         keytmp= ~(key_jk)&0x0f;
         switch (keytmp)                               
          {
           case 1:key=0x30;
           break;
           case 2:key=0x31;
           break;
           case 4:key=0x32;
           break;
           case 8:key=0x33;
           break;   
           default:break;
           }
         P1_4=1;
         P1_5=0;
         P1_6=1;
         P1_7=1;
         keytmp= ~(key_jk)&0x0f;
         switch (keytmp)
          {
           case 1:key=0x34;
           break;
           case 2:key=0x35;
           break;
           case 4:key=0x36;
           break;
           case 8:key=0x37;
           break;   
           default:break;
          }
         P1_4=1;
         P1_5=1;
         P1_6=0;
         P1_7=1;
         keytmp= ~(key_jk)&0x0f;
         switch (keytmp)
          {
           case 1:key=0x38;
           break;
           case 2:key=0x39;
           break;
           case 4:key=0x2e;
           break;
           case 8:key=0x41;
           break;
           default:break;
           }
  
         P1_4=1;
         P1_5=1;
         P1_6=1;
         P1_7=0;
         keytmp= ~(key_jk)&0x0f;
         switch (keytmp)
          {
          case 1:key=0x42;
          break;
          case 2:key=0x43;
          break;
          case 4:key=0x44;
          break;
          case 8:key=0x45;
          break;
          default:break;
          }   
   return (key);                  
}

使用特权

评论回复
16
wangzk|  楼主 | 2010-7-14 09:59 | 只看该作者
中断10ms调用一次
void main ()
{
  SP=0x5f;
  req=0;
  busy=1;
  TMOD=0x01;
  EA = 1;
  ET0 = 1;
  TH0 = 0xdc;
  TL0 = 0x00;/////////定时10ms扫描键盘基时
  TR0 = 1;
  while(1)
  {
        uchar   key_num;
       if (Key_Scan_F)///这句话什么意思??
      {
         Key_Scan_F = 0;
          key_num= keyscan();////接受键盘键值////////
         //////my  other  code ///////
     }
  }
}
void Timer0SRV (void) interrupt 1 using 2
{
TH0 = 0xdc;
TL0 = 0x00;
Key_Scan_F = 1;   //允许扫描键盘
}

使用特权

评论回复
17
zljzlj| | 2010-7-14 10:13 | 只看该作者
刚好上午有一点时间,再画两张草图,仅此而已了啊!

绘图1_页面_1.jpg (183.36 KB )

绘图1_页面_1.jpg

绘图1_页面_2.jpg (177.44 KB )

绘图1_页面_2.jpg

使用特权

评论回复
18
joing1999| | 2010-7-14 10:48 | 只看该作者
问题很简单,过程很纠结

使用特权

评论回复
19
wangzk|  楼主 | 2010-7-14 11:05 | 只看该作者
服了  这两张草图 没少费力气吧??是我估计得画2天 :L

顶礼膜拜。。。

使用特权

评论回复
20
tcc8073| | 2010-7-14 14:09 | 只看该作者
键盘程序在中断外,进键盘程序,查询是否按下键盘,防抖,关中断;读取口的数据,和给定值对比确定按下的键的位置从而确定相关功能,判定键盘松开否,重启中断;如果键盘程序是在中断内部,可以不查询键盘松开,因为下一个中断自然又进入键盘查询,但是要把中断需要处理的其他地方处理好.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:[url=http://huiqianxi.taobao.com]http://huiqianxi.

91

主题

680

帖子

0

粉丝