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

📄 main.c

📁 串行16个键盘驱动只占有3个IO口,方便快捷
💻 C
字号:
#include "SPCE061V004.H"
#define  LOAD  0X2000//A13
#define  CLK   0X4000 //A14
#define  DATA  0X8000 //A15 

unsigned int key_value=0; //key_value的Low~Hight=key1~key16

int initial_sys();
int get_key_value();
int delay(unsigned int);
int qudou(unsigned int ,unsigned int,unsigned int );

int main()
{ 
     
    
    initial_sys();
    while(1)
   {
     *P_Watchdog_Clear=1;
      get_key_value();
   
      switch(key_value)
        {
           case 0x7fff://键16按下
                if(qudou(get_key_value(),0x7fff,3))
                  { key16_pressed();break;}
                 else break;
           case 0xbfff://键15按下
                if(qudou(get_key_value(),0xbfff,30000))
                  { key15_pressed();break;}
                 else break;
           case 0xdfff://键14按下
                if(qudou(get_key_value(),0xdfff,30000))
                  { key14_pressed();break;}
                 else break;
           case 0xefff://键13按下
               if(qudou(get_key_value(),0xefff,30000))
                  { key13_pressed();break;}
                 else break;
           case 0xf7ff://键12按下
                if(qudou(get_key_value(),0xf7ff,30000))
                  { key12_pressed();break;}
                 else break;
           case 0xfbff://键11按下
               if(qudou(get_key_value(),0xfbff,30000))
                  { key11_pressed();break;}
                 else break;
           case 0xfdff://键10按下
                if(qudou(get_key_value(),0xfdff,30000))
                  { key10_pressed();break;}
                 else break;
           case 0xfeff://键9按下 
                if(qudou(get_key_value(),0xfeff,30000))
                  { key9_pressed();break;}
                 else break;  
           case 0xff7f://键8按下 
               if(qudou(get_key_value(),0xff7f,30000))
                  { key8_pressed();break;}
                 else break;    
           case 0xffbf://键7按下  
                if(qudou(get_key_value(),0xffbf,30000))
                  { key7_pressed();break;}
                 else break;  
           case 0xffdf://键6按下   
                if(qudou(get_key_value(),0xffdf,30000))
                  { key6_pressed();break;}
                 else break;
           case 0xffef://键5按下
              if(qudou(get_key_value(),0x7ffef,30000))
                  { key5_pressed();break;}
                 else break;
           case 0xfff7: //键4按下
                if(qudou(get_key_value(),0xfff7,30000))
                  { key4_pressed();break;}
                 else break;    
           case 0xfffb: //键3按下    
                if(qudou(get_key_value(),0xfffb,30000))
                  { key3_pressed();break;}
                 else break;
           case 0xfffd: //键2按下
                if(qudou(get_key_value(),0xfffd,30000))
                  { key2_pressed();break;}
                 else break;   
           case 0xfffe: //键1按下
                if(qudou(get_key_value(),0xfffe,3))
                  { key1_pressed();break;}
                 else break;
           default:break;//无键按下,或有多键按下
        }
   }
}           
   
   
int get_key_value()
{   
	unsigned int i;

	key_value=0;
	*P_IOA_Data=*P_IOA_Data&(~LOAD);//LOAD置低 
	*P_IOA_Data=*P_IOA_Data|LOAD;//LOAD置高  
   	for(i=0;i<16;i++){            //注意  datasheet上时序图错误  
		key_value=key_value>>1;   //load=H 第一位就在data线上,此时若给clk跳沿,则会使key2覆盖key1,导致key1的丢失  
       	if(*P_IOA_Data&0x8000)
			key_value|=0x8000;
		else
			key_value=key_value&0x7fff;
    	*P_IOA_Data=*P_IOA_Data&(~CLK); //CLK置低     
       *P_IOA_Data=*P_IOA_Data|CLK; //CLK置高,产生上跳沿,把数据写到data线上
	
	}
	return (key_value);
}        
        
       
           
       


int initial_sys() 
{	                                                                                   //    A13  A14 A15
     *P_IOA_Dir=0x6000;//设置A13,A14为带数据缓存器的低电平输出A15为带下拉电阻的输入引脚  dir   1   1   0
     *P_IOA_Attrib=0x6000; //                                                          attrib  1   1   0 
     *P_IOA_Data=0x0000; //                                                            data    0   0   0 
    
}


int delay(unsigned int delay_time)
{  int j;
  for(j=0;j<delay_time;j++){}
}   


int qudou(unsigned int key_value,unsigned int keycode,unsigned int delay_time)
{    
     delay(delay_time);
      if(get_key_value()!=keycode)return(0);
      else 
         while(1)//判断键是否弹起
     	 {*P_Watchdog_Clear=1;
     	  if(get_key_value()!=keycode)
     	    { delay(delay_time);
     	     if(get_key_value()!=keycode)
     	     return (1);
     	    } 
     	 }
}

⌨️ 快捷键说明

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