highgear大堂主输给俺菜鸟一回,极力要挽回堂主的面子,追着俺纠缠不放。 唉,俺找了一个为大堂主挽回面子的事情:
LastNew请教各位高手:下面他写的键盘程序,有什么不妥?哪里需要改进? highgear不是一直宣称自己R&D大堂主玩键盘小菜吗?您不是希望挽回自己堂主的声誉吗?这不是机会来了。
帮我们小辈初手仔细分析讲解一下下面的键盘功能程序原理,哪里不妥,哪里可以简化,这岂不是获得论坛人人敬仰,功名留坛之举?
虽然有点屈才,但总比和俺这样非专业菜鸟PK强吧,万一输了,本来就晚景凄惨了,不好办啦。本来心理就极度脆弱了,会不会有什么极端行为发生?万一真的发生了,可真让俺一生都内疚了。 换一种方式找回大堂主的尊严,这样好。
#define _keyscan_h_
#include <keyscan.h>
void KeyInit(void) { keyread_index=0; keywaiting_index=0; key_counter=0; key_ok=0; KeybuffCount=0; }
void KeyScan(unsigned char * key) { unsigned char key_temp=0x00;
if (KeyPressed(&key_temp)) //有键按下 //键扫描,获得键值 { if (key_temp == last_key) { key_counter++; if (key_counter>=KEYDELAY) //连续键 { *key=key_temp+0x80; //连续键码值在单键基础上加0x80 key_counter-=KEYLOOP;
key_ok=1; } } else { key_counter=0; last_key=key_temp; } } else //键抬起 { if ((key_counter>=3)&&(key_counter<(KEYDELAY-KEYLOOP))) { key_ok=1; *key=last_key; //step key decode //单键解码 } key_counter=0; }
}
void KeyUpdate(void) { unsigned char key;
KeyScan(&key);
if(key_ok==0) return;
key_ok=0; if(KeybuffCount<KEYPAD_RECV_BUFFERF_LENGTH+1) { KeybuffCount++; keyrev_buff[keywaiting_index++]=key; if(keywaiting_index>KEYPAD_RECV_BUFFERF_LENGTH) { keywaiting_index=0; } } else { keyrev_buff[keywaiting_index]=key; } }
bit GetKeyCode(unsigned char * key) { KeyUpdate();
if(KeybuffCount) { *key=keyrev_buff[keyread_index++];
if(keyread_index>KEYPAD_RECV_BUFFERF_LENGTH) { keyread_index=0; }
KeybuffCount--; return 1; } return 0; }
bit KeyPressed(unsigned char * getkey) { // bit fgKeyRelease = 1; unsigned char bKeySatus = 0;
//init KEY1-KEY4 KEY1 = 1;KEY2 = 1;KEY3 = 1;KEY4 = 1; //KEY:4/3/2/1 if (KEY1 == 0) { bKeySatus = 1; } else if (KEY2 == 0) { bKeySatus = 2; } else if (KEY3 == 0) { bKeySatus = 3; } else if (KEY4 == 0) { bKeySatus = 4; } else { //KEY:1-2/1-3/1-4 //init KEY1-KEY4 KEY1 = 0;KEY2 = 1;KEY3 = 1;KEY4 = 1;
if (KEY2 == 0) { bKeySatus = 5; } else if (KEY3 == 0) { bKeySatus = 6; } else if (KEY4 == 0) { bKeySatus = 7; }
//KEY: 2-3/2-4 //init KEY1-KEY4 KEY1 = 1;KEY2 = 0;KEY3 = 1;KEY4 = 1; if (KEY3 == 0) { bKeySatus = 8; } else if (KEY4 == 0) { bKeySatus = 9; }
//KEY: 3-4/ //init KEY1-KEY4 KEY1 = 1;KEY2 = 1;KEY3 = 0;KEY4 = 1; if (KEY4 == 0) { bKeySatus = 10; } }
if (bKeySatus != 0) { *getkey=bKeySatus ; return 1; } return 0; }
LastNew: 一直按着同一按键的问题,00、xwy还有路过的前辈教教我
做了个键盘,有按键缓冲,想做长按键功能 于是有了关于这方面的问题: (此时暂不考虑缓冲的必要性问题,即默认有缓冲情况下) 如果做成加速键,那么多长时间重发一次比较合适,如果是100ms的样子,那缓冲会不会很快就满了? 如果做成长按键,那如果一直按着不放,怎么样处理比较合适使它不重复发长按键?(也就是只在第一次长按有效,要不很别扭啊;这个问题普通键也有吧,因为有的情况下可能复用的键没有安排长按功能)
好了,还有个问题就是缓冲究竟有没有必要?因为这就是个很简单的系统,实时的任务只有遥控,连串口通讯都没有
最普遍的方法应该就是最好的方法吧(对于这些常见问题)
|