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

📄 keyscan.c

📁 Atmega64单片机程序(完整工程)
💻 C
字号:
#include "SYS_Config.h"
#include "KeyScan.h"

/****************************************************************************
* KeyScan - 键盘扫描函数
* 判4个按键那个有按下
* @Return :有按键 返回键值 无按键 返回FALSE 因此键值定义不能为FALSE
*****************************************************************************/
//ICC-AVR application builder : 2008-5-20 上午 09:01:00
// Target : M64
// Crystal: 16.000Mhz
// TIMER0 initialize - prescale:1024
// WGM: Normal
// desired value: 10mSec
// actual value:  9.984mSec (0.2%)
void timer0_init(void)
{
    Key0_IN();
	Key1_IN();
	Key2_IN();
	Key3_IN();
	
    TCCR0 = 0x00; //stop
    ASSR  = 0x00; //set async mode
    TCNT0 = 0x64; //set count
    OCR0  = 0x9C;
    TCCR0 = 0x07; //start timer
 
	TIMSK|= 0x01; //timer interrupt sources
}

INT8U Keyvalue=0;
INT8U Key_Deal_Flag=0;
INT8U Keyvalue_first,Keyvalue_second;
INT8U Count0=0,Key_time=0;

#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
    TCNT0 = 0x64; //reload counter value
	
	Count0++;
	if(Count0==1)
	{
	    Keyvalue_first=Key_STATUS();
		if(Keyvalue_first==0x0F)
		    Count0=0;
	}
	if(Count0>=15)//隔140ms再来检测一次
	{
	    Count0=0;
	    Keyvalue_second=Key_STATUS();
	    if(Keyvalue_first==Keyvalue_second)//如果相等,则为有效按键
		{
		    Key_Deal_Flag=1;
	        switch(Keyvalue_first)
            {
                case 0x0E:Keyvalue=Key_Up;   break;
	            case 0x0D:Keyvalue=Key_Right;break;
	            case 0x0B:Keyvalue=Key_Left; break;
	            case 0x07:Keyvalue=Key_Down; break;
	            default:  Keyvalue=FALSE ;   break;//同时有两个以上按键,视为无效
			}
		}
    }
	if( (Keyvalue==Keyvalue_first)&&(Keyvalue==Keyvalue_second) )
	{//如果长时间按,则Key_time累加,程序判断Key_time大于某个值就知道长时间按了
		if(Key_time<255)
		    Key_time++;
	}
	else
	{
	    Key_time=0;
	}
}



 
   
  

⌨️ 快捷键说明

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