⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nedu_drive_key.c

📁 一个基于单片机的小型操作系统
💻 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 + -