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

📄 key.c

📁 自己做的一个简单的设备.使用Freescale HC908SR12单片机,使用KEYS,AD,PWM,FLASH,LCD等模块.经使用运行稳定.
💻 C
字号:
//文件名   Key.C
//目    的 键盘处理
//Copyright (c) 2006-2007 东方久乐公司电子研究所
//编    写 文洪奎 2007-01-15
//修    改 
//修改原因

#include "global.h"
#include "key.h"

#ifndef KEYCLK
#define KEYCLK 30
#endif

#ifndef KEYBUF
	unsigned char KeyBuf[4];
	unsigned char pKey;
#define KEYBUF
#endif
unsigned char KeyStatic;	//键盘状态
//0 放开状态
//1 防抖
//2 重复等待
//3 一级加速

void Initkey()
{
	DDRD = 0x0C3;	//F0;
	PTD =  0x000;

	T2SC = 0x030;	// 125K  = 8MHz / 64
	T2MOD = SYSCLK / 64 / KEYCLK;  
	T2SC = 0x076;	//允许中断,停止工作,复位TCNT
	
	pKey = 0;
	
	KBSCR_IMASKK = 1;
	KBSCR_MODEK = 0;
	KBIER = 0x03C;	//0F;
	KBSCR_ACKK = 1;		//清除中断
	KBSCR_IMASKK = 0;	//开始键盘中断
	KeyStatic = 0;
}

unsigned char GetKey()
{
	if(pKey == 0)
		return 0;
	else
	{
		pKey--;
		switch(KeyBuf[pKey])
		{
			case 221:
				return '0';
			case 237:
				return '1';
			case 238:
				return '2';
			case 111:
				return '3';
			case 245:
				return '4';
			case 246:
				return '5';
			case 119:
				return '6';
			case 249:
				return '7';
			case 250:
				return '8';
			case 123:
				return '9';
			case 187:
				return 'E';
			case 183:
				return '\n';
			case 222:
				return '<';
			case 95:
				return '>';
			case 175:
				return 'U';
			case 159:
				return 'D';
			default:
				return 0;	
		};
	}
}


unsigned char ScanKey()
{
	unsigned char KeyTemp1;
	unsigned char KeyTemp2;
	
	KeyTemp1 = PTD & 0x03C;	//0F;
	
	if(KeyTemp1 == 0x03C)	//0F
	{
		DDRD = 0x0C3;	//F0;
		KBIER = 0x03C;	//0F;	
		return 0x0FF;
	}
	
	DDRD = 0x03C;	//0F;
	KBIER = 0x0C3;	//F0;	
	_asm nop;
	_asm nop;
	
	KeyTemp2 = PTD & 0x0C3;	//F0;
	
	DDRD = 0x0C3;	//F0;
	KBIER = 0x03C;	//0F;
	
	if(KeyTemp2 == 0x0C3)	//F0
	{
		return 0x0FF;
	}
	
	return KeyTemp1 | KeyTemp2;
}



unsigned char KeyTemp;

							
__interrupt void Key_Interrupt(void)
{
	
	KBSCR_IMASKK = 1;	//关键盘中断
	T2SC_TSTOP = 0;	//开始记时中断
	KBSCR_ACKK = 1;
	KeyStatic = 1;
}

__interrupt void Timer2_Interrupt(void)
{
	static unsigned char nWait;
	
	T2SC_TOF = T2SC_TRST;	//新中断
	
	KeyTemp = ScanKey();
	
	if(KeyStatic == 3)
	{
		if(KeyTemp == 0x0FF)
		{
			KeyStatic = 0;
			T2SC_TSTOP = 1;		//停止记时器
			
			KBSCR_ACKK = 1;		//清除原中断标记
			KBSCR_IMASKK = 0;	//开键盘中断
		}
		else
		{
			if(pKey < 4)
			{
				KeyBuf[pKey] = KeyTemp;
				pKey++;
			}
		}
			
	}
	
	if(KeyStatic == 2)
	{
		if(KeyTemp == 0x0FF)
		{
			KeyStatic = 0;
			T2SC_TSTOP = 1;		//停止记时器
			
			KBSCR_ACKK = 1;		//清除原中断标记
			KBSCR_IMASKK = 0;	//开键盘中断
		}
		else
		{
			if(nWait > 0)
				nWait--;
			else
				KeyStatic = 3;	
		}	
	}
	
	if(KeyStatic == 1)
	{

		if(KeyTemp == 0x0FF)
		{
			KeyStatic = 0;
			T2SC_TSTOP = 1;		//停止记时器
			
			KBSCR_ACKK = 1;		//清除原中断标记
			KBSCR_IMASKK = 0;	//开键盘中断
		}
		else
		{
			if(pKey < 4)
			{
				KeyBuf[pKey] = KeyTemp;
				pKey++;
			}
			KeyStatic = 2;
			nWait = 50;
			PTA_PTA7 = ~PTA_PTA7;
		}
	}
} 							
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -