📄 nedu_drive_key.c
字号:
/*
*********************************************************************************************************************
* 东软培训中心教学项目:基于ARM和uc/os-II的PDA系统
*
* (c) Copyright 2005, 东软培训中心
* All Rights Reserved
*
* 模块名称:驱动程序模块
* 文件名:NEDU_DRIVE_KEY.C
* 作者:朱成果
* 时间:2005年9月20日
* 版本:V0.01
**********************************************************************************************************************
*/
#include "44b.h"
#include "def.h"
#include "Zlg7289.h"
#include "uhal.h"
#include "ucos_ii.h"
#include "driven.h"
#include "maro.h"
///////////////ZLG7289的信号线/////////////////////
#define ZLG7289_CS (0x20) //GPB5
#define ZLG7289_KEY (0x10) //GPG4
#define ZLG7289_ENABLE() do{Zlg7289SIOBand=rSBRDR; Zlg7289SIOCtrl=rSIOCON; \
rSIOCON=0x31; rSBRDR=0xff; rPDATB&=(~ZLG7289_CS);}while(0)
#define ZLG7289_DISABLE() do{rPDATB|=ZLG7289_CS; rSBRDR=Zlg7289SIOBand; rSIOCON=Zlg7289SIOCtrl;}while(0)
///////////////ZLG7289的命令字/////////////////////
#define ZLG7289_CMD_RST 0xA4 //复位
#define ZLG7289_CMD_TEST 0xBF //测试模式
#define ZLG7289_CMD_LSHIFT 0xA1 //左移
#define ZLG7289_CMD_RSHIFT 0xA0 //右移
#define ZLG7289_CMD_CLSHIFT 0xA3 //循环左移
#define ZLG7289_CMD_CRSHIFT 0xA2 //循环右移
#define ZLG7289_CMD_DATA0 0x80 //下载数据且按方式0 译码
#define ZLG7289_CMD_DATA1 0xC8 //下载数据且按方式1 译码
#define ZLG7289_CMD_DATA3 0x90 //下载数据但不译码
#define ZLG7289_CMD_FLASH 0x88 //闪烁控制
#define ZLG7289_CMD_HIDE 0x98 //消隐控制
#define ZLG7289_CMD_LDOT 0xE0 //段点亮指令
#define ZLG7289_CMD_HDOT 0xC0 //段关闭指令
#define ZLG7289_CMD_RDKEY 0x15 //读键盘数据指令
extern U32 Sub_Mode;
extern U8 state,number,numlock;
/*
**********************************************************************************************************************
* 键值映射表
*
* 说明: 由于ZLG7289可以管理64键键盘,因此扫描码为0 ~ 63,通过映射表进行扫描码到键值的转换
*
**********************************************************************************************************************
*/
unsigned char KeyBoard_Map[]={7,4,1,0,11,0,0,0,8,5,
2,0,12,0,0,0,9,6,3,17,
13,14,0,0,15,0,16,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0
}; //64,键值映射表
int Zlg7289SIOBand;
int Zlg7289SIOCtrl;
/*
**********************************************************************************************************************
* GETKEY
*
* 作者:北京博创兴业科技有限公司,朱成果部分修改
*
* 时间:2005年9月20日
*
* 描述:函数自动判断是否有键按下,当查询到有键按下后将扫描码打印到串口0,并返回键值。
*
* 参数:无
*
* 返回值:返回32位键值。
*
***********************************************************************************************************************
*/
U32 GetKey()
{
U16 kl;
while(1)
{
while((rPDATG&ZLG7289_KEY))
OSTimeDly(10); //朱成果修改,无键按下,挂起10个Tick
kl=Zlg7289_ReadKey(); //得到按键扫描码
if(kl < 64)
{ //扫描码有效
Uart_Printf("\n%d",kl); //朱成果修改,不打印扫描码到串口
kl = KeyBoard_Map[kl]; //通过键盘映射表得到按键值
OSTimeDly(5); //朱成果修改,延时5Tick
break;
}
}
return kl;
}
/**********************************************************************************************************************
* ZLG7289_READKEY
*
* 作者:北京博创兴业科技有限公司
*
* 时间:2005年9月20日
*
* 描述:函数自动连接键盘模块,并获得扫描码。
*
* 参数:无
*
* 返回值:无符号整数
*
***********************************************************************************************************************
*/
unsigned int Zlg7289_ReadKey()
{
unsigned int key;
ZLG7289_ENABLE();
WriteSDIO(ZLG7289_CMD_RDKEY);
key=ReadSDIO();
ZLG7289_DISABLE();
return key;
}
/*
**********************************************************************************************************************
* ZLG7289_RESET
*
* 作者:北京博创兴业科技有限公司
*
* 时间:2005年9月20日
*
* 描述:复位键盘模块。
*
* 参数:无
*
* 返回值:无
*
***********************************************************************************************************************
*/
void Zlg7289_Reset()
{
ZLG7289_ENABLE();
WriteSDIO(ZLG7289_CMD_RST);
ZLG7289_DISABLE();
Delay(20);
}
//end of key module
/*
**********************************************************************************************************************
* GETMAINXY
*
* 作者:胡仲华 曹攀
*
* 时间:2007年7月7日
*
* 描述:得到键盘按键的输入,将得到的值赋给Sub_Mode 全局娈量
*
* 参数:无
*
* 返回值:无
*
***********************************************************************************************************************
*/
void GetSETKEY(void)
{
OS_CPU_SR cpu_sr;
U32 key;
key=GetKey();//得到键盘输入
OSTimeDly(5);//延迟时间
switch(key)
{
case 17: // . del
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_Del;
OS_EXIT_CRITICAL();
break;
case 16: // Enter
Uart_Printf("\n\tenter");
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_ENTER;
OS_EXIT_CRITICAL();
break;
case 15: // +
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_PLUS;
OS_EXIT_CRITICAL();
break;
case 14: // -
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_MINUS;
OS_EXIT_CRITICAL();
break;
case 13: // *
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_STAR;
OS_EXIT_CRITICAL();
break;
case 12: // /
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_SLASH;
OS_EXIT_CRITICAL();
break;
case 11: //NumLock
if (state == SETREC)
{
numlock++;
if(numlock > 2)
numlock = 0;
}
else
{
OS_ENTER_CRITICAL();
Sub_Mode = TCH_RETURN;
OS_EXIT_CRITICAL();
}
break;
case 10: //暂无
break;
case 9: // 9
if(numlock == 2 && state == SETREC)//判断是不是在输入法2
{
if(Sub_Mode == TCH_K_9)
{
number++;
if(number > 3)
number = 1;
}
else
number = 1;
}
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_9;
OS_EXIT_CRITICAL();
break;
case 8: // 8
if(numlock == 2 && state == SETREC)//判断是不是在输入法2
{
if(Sub_Mode == TCH_K_8)
{
number++;
if(number > 3)
number = 1;
}
else
number = 1;
}
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_8;
OS_EXIT_CRITICAL();
break;
case 7: // 7
if(numlock == 2 && state == SETREC)//判断是不是在输入法2
{
if(Sub_Mode == TCH_K_7)
{
number++;
if(number > 3)
number = 1;
}
else
number = 1;
}
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_7;
OS_EXIT_CRITICAL();
break;
case 6: // 6
if(numlock == 2 && state == SETREC)//判断是不是在输入法2
{
if(Sub_Mode == TCH_K_6)
{
number++;
if(number > 3)
number = 1;
}
else
number = 1;
}
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_6;
OS_EXIT_CRITICAL();
break;
case 5: // 5
if(state == NORMAL) //判断是不是在主界面
{ //是主界面就进入第五项
OS_ENTER_CRITICAL();
state = SETREC;
OS_EXIT_CRITICAL();
}
else if(numlock == 2 && state == SETREC)//判断是不是在输入法2
{
if(Sub_Mode == TCH_K_5)
{
number++;
if(number > 3)
number = 1;
}
else
number = 1;
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_5;
OS_EXIT_CRITICAL();
}
else
{
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_5;
OS_EXIT_CRITICAL();
}
break;
case 4: // 4
if(state == NORMAL)//判断是不是在主界面
{ //是主界面就进入第四项
OS_ENTER_CRITICAL();
state = SETRTC;
OS_EXIT_CRITICAL();
}
else if(numlock == 2 && state == SETREC)//判断是不是在输入法2
{
if(Sub_Mode == TCH_K_4)
{
number++;
if(number > 3)
number = 1;
}
else
number = 1;
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_4;
OS_EXIT_CRITICAL();
}
else
{
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_4;
OS_EXIT_CRITICAL();
}
break;
case 3: // 3
if(state == NORMAL)//判断是不是在主界面
{ //是主界面就进入第三项
OS_ENTER_CRITICAL();
state = DISREC;
OS_EXIT_CRITICAL();
}
else if(numlock == 2 && state == SETREC)//判断是不是在输入法2
{
if(Sub_Mode == TCH_K_3)
{
number++;
if(number > 3)
number = 1;
}
else
number = 1;
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_3;
OS_EXIT_CRITICAL();
}
else
{
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_3;
OS_EXIT_CRITICAL();
}
break;
case 2: // 2
if(state == NORMAL)//判断是不是在主界面
{ //是主界面就进入第二项
OS_ENTER_CRITICAL();
state = DISDATE;
OS_EXIT_CRITICAL();
}
else if(numlock == 2 && state == SETREC)//判断是不是在输入法2
{
if(Sub_Mode == TCH_K_2)
{
number++;
if(number > 3)
number = 1;
}
else
number = 1;
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_2;
OS_EXIT_CRITICAL();
}
else
{
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_2;
OS_EXIT_CRITICAL();
}
break;
case 1: // 1
if(state == NORMAL)//判断是不是在主界面
{ //是主界面就进入第一项
OS_ENTER_CRITICAL();
state = DISTIME;
OS_EXIT_CRITICAL();
}
else if(numlock == 2 && state == SETREC)//判断是不是在输入法2
{
if(Sub_Mode == TCH_K_1)
{
number++;
if(number > 3)
number = 1;
}
else
number = 1;
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_1;
OS_EXIT_CRITICAL();
}
else
{
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_1;
OS_EXIT_CRITICAL();
}
break;
case 0: // 0
if(numlock == 2 && state == SETREC)//判断是不是在输入法2
{
if(Sub_Mode == TCH_K_0)
{
number++;
if(number > 3)
number = 1;
}
else
number = 1;
}
OS_ENTER_CRITICAL();
Sub_Mode = TCH_K_0;
OS_EXIT_CRITICAL();
break;
default:
break;
}
OSTimeDly(1);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -