key.c

来自「我自己编写的atmega16的4*4键盘程序」· C语言 代码 · 共 70 行

C
70
字号
#include <iom16v.h> 
#include <macros.h> 

//键盘接口
#define KEYDDR  DDRB  
#define KEYPORT PORTB 
#define KEYPIN PINB
//键盘接口

unsigned char num[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};

/**************INT0处理函数 start*******************/
/**************
         捕捉键盘输入中断进行处理
                                *******************/
#pragma interrupt_handler	INT0_TURNLOW_handler:2
void INT0_TURNLOW_handler(void)
 {  
   unsigned char i,j,ScanCode;
   ScanCode=0x01;
   CLI();
   for(i=0;i<4;i++)
    {
        KEYPORT=ScanCode;for(j=0;j<10;j++);
        if ((KEYPIN&0XF0)!=0x00) USART_Transmit(keycode(ScanCode,KEYPIN&0XF0));//串口发送
	    ScanCode<<=1;
     }
   for(j=0;j<200;j++);//消抖
   SEI();
   KEYPORT=0X0F; 
  }
/**************INT0处理函数 end*******************/
/**************解码函数 start*******************/
unsigned keycode(unsigned char row,unsigned char line)
{
  unsigned char temp;
  switch(row) //行值处理
   {
     case 0x01:temp=0x00;break;
  	 case 0x02:temp=0x04;break;
 	 case 0x04:temp=0x08;break;
     case 0x08:temp=0x0c;break;
   }
   switch(line) //列值处理
   {
     case 0x10:temp+=0x00;break;
  	 case 0x20:temp+=0x01;break;
 	 case 0x40:temp+=0x02;break;
     case 0x80:temp+=0x03;break;
   }
   return num[temp];
}
/**************解码函数 end*******************/
/**************键盘初始化 stat*******************/
void KEY_INI(void)//高四位输出并拉高
{
  KEYDDR = 0x0F;
  KEYPORT = 0x0F;
  
  /*************INT0初始化 start******************/
  PORTD &= 0xFB;
  DDRD  &= 0xFB;
  MCUCR=(1<<ISC01)|(1<<ISC00);//上升沿触发
  GICR=(1<<INT0);
/**************INT0初始化 end*******************/

} 
/**************键盘初始化 end*******************/

⌨️ 快捷键说明

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