- /*******************************************
- 函数名称:Decode
- 功 能:对来自键盘的信息进行解码,转换成对
- 应的ASCII编码并压入缓存
- 参 数:sc--键盘发送过来的信息
- 返回值 :是否收到有效数据:0--否,1--是
- 说明 :本程序只能对基本按键(即键被按下时产
- 生三个字节的扫描码的按键)做出解码,
- 包括所有的可显示字符键和Table,
- Back Space和Enter三个特殊功能键。
- 基本按键的扫描码由三个字节组成,第1个字节为接通
- 码,第2、3字节为断开码;其中第1字节和第3字节相
- 同,中间字节为断开标志0xf0。
- ********************************************/
- //在中断程序中每接收一个字节调用一次解码程序
- uchar Decode(uchar sc)
- {
- static uchar shift = 0; //Shift键是否按下标志:1--按下,0--未按
- static uchar up = 0; //键已放开标志: 1--放开,0--按下
- uchar i, flag = 0;
- if(sc == 0xf0) //如果收到的是扫描码的第2个字节---0xf0:按键断开标志
- {
- up = 1; //按键已经松开
- return 0;
- }
- else if(up == 1) //如果收到的是扫描码的第3个字节,即为通码
- {
- up = 0;
- if((sc == 0x12) || (sc == 0x59))
- shift = 0;
- return 0;
- }
- //如果收到的是扫描码的第1个字节
- if((sc == 0x12) || (sc == 0x59)) //如果是左右shift键,左shift:0x12,右shift:0x59
- {
- shift = 1; //设置Shift按下标志
- flag = 0;
- }
- else if(sc == 0x58) // ']'
- {
- shift = ~shift;
- if(shift != 0) // shift键按下
- {
- P1OUT &= ~BIT6; // 灯灭
- }
- else if(shift == 0) // shift键没有按下
- {
- P1OUT |= BIT6; // 灯亮
- }
- }
- else
- {
- if(shift) //shift按下,对按下Shift的键进行解码
- {
- /* for(i = 0;(shifted[i][0] != sc) && shifted[i][0];i++);
- if (shifted[i][0] == sc)
- {
- PutChar(shifted[i][1]);
- flag = 1;
- }*/
- for (i = 0;; i++)
- {
- if(shifted[i][0] == sc)
- {
- PutChar(shifted[i][1]);
- flag = 1;
- break;
- }
- }
- }
- else //直接对按键进行解码
- {
- for (i = 0; (unshifted[i][0] != sc) && unshifted[i][0]; i++)
- ;
- if(unshifted[i][0] == sc)
- {
- PutChar(unshifted[i][1]);
- flag = 1;
- }
- }
- }
- if(flag) // 按键处理完毕
- return 1;
- else
- return 0;
- }
复制代码
这个是解码的函数,就是接收到一个字节就解码一次,分别判断 通码 断码,可以读取组合按键,PS:我用的是小的数字键盘
一周热门 更多>