key.c

来自「这里有很多我自己做的凌阳单片机源程序」· C语言 代码 · 共 85 行

C
85
字号
//正确的键盘程序,接口如图所示
#include"spce061a_chf.h"
unsigned int keyval=0x0000;
unsigned int temp=0;
unsigned int ksp[4]={0x007f,0x00bf,0x00df,0x00ef};
unsigned int keycode[16]={0x0077,0x007b,0x007d,0x007e,0x00b7,0x00bb,0x00bd,0x00be,0x00d7,
0x00db,0x00dd,0x00de,0x00e7,0x00eb,0x00ed,0x00ee};
unsigned int scan_key();
unsigned int get_key(unsigned int);

void main()
{
	

	Set_IOA_Dir(0xf0);
	Set_IOA_Attrib(0xf0);
	Set_IOA_Data(0xf0);//初始化IOA低四位为带下拉电阻的输入,高四位为同相高电平输出	
	
	Set_IOB_Dir(0xffff);
	Set_IOB_Attrib(0xffff);
	Set_IOB_Data(0x0000);
	
	asm("int off");
	Set_TimeBase(0x0003);
	Set_INT_Ctrl(0x0002);
	asm("int irq");
	
	while(1)
	{
		Watchdog_Clear();
		if(temp)
		{
			keyval=get_key(temp);//若有键按下就调用取键值函数
			*P_IOB_Data=keyval;		
		}//若没有键按下就不停地扫描
		*P_IOB_Data=keyval;
	}
}

unsigned int scan_key(void)
{
	unsigned int scanval;//按键扫描值
	unsigned int k=0;
	unsigned int i;
	scanval=0x000f;//
	*P_IOA_Data=scanval;	
	if(scanval!=(*P_IOA_Data))//若不相等就有按键按下
	{	
	    *P_IOA_Data=scanval;	    
	    if(scanval!=(*P_IOA_Data))//若不相当说明有按键按下
	    {
	    	
	    	for(i=0;i<4;i++)
	    	{
	    		*P_IOA_Data=ksp[i];	  
	    		k=Get_IOA_Data();  	
	    		if(k!=ksp[i])//说明这一行有键按下
	    		{
	    			//k=*P_IOA_Data;
	    			while(k==Get_IOA_Data())
					{
						Watchdog_Clear();
					}
	    			return(k);
	    		}
	    	}
	    }
	    return(0);
	}
	return(0);
}
	    			    

unsigned int get_key(unsigned int i)
{
	unsigned int j;
	Watchdog_Clear();
    for(j=0;j<16;j++)
    	if(i==keycode[j])
    		return(j);
    	
    return(16);
}

	

⌨️ 快捷键说明

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