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

📄 keyboard.c

📁 针对杭州中正公司的SM-62光学指纹识别模块在Atmega128芯片板上移植后的测试程序
💻 C
字号:
#include <iom128.h>
#define u8 unsigned char
#define u16 unsigned int
__no_init u8 write_address @ 0x1102 ;
__no_init u8 read_address @ 0x1160 ;
u8 flag_k = 0 ;
u8 scan_result = 0 ;
u8 *wr ;
u8 *re ;
u8 read_data ;
u8 the_key , final_key ;
u8 k1,k2 ;
/************************************ interrupt **************************************/
#pragma vector = INT6_vect
__interrupt void begin_scan()
{
   flag_k = 1 ;
   asm ("nop") ;
}
/************************************* delay_1ms **************************************/
void delay_1ms()
{
    u16 i ;
    for(i=0;i<533;i++) ;
}
/*************************************** delay ****************************************/
void delay(u16 n)
{
   u16 i ;
   for(i=0;i<n;i++)
   {
       delay_1ms() ;
   }
}
/******************************* keyboard_initialization ******************************/
void keyboard_initialization()
{
   MCUCR |= 0x80 ;            //REGISDTER CONFIGURATION
   XMCRA = 0x00 ;
   XMCRB = 0x00 ;

   DDRD |= (1<<7) ;          //PD7 OUT
   PORTD &= ~(1<<7) ;        //PD7 DOWN  ACS15=0  ( ENABLE KEYBOARD )
   DDRD |= (1<<4) ;           //PD4 OUT
   PORTD |= (1<<4) ;         // DISABLE EXTERNAL_RAM
   DDRB |= (1<<7) ;
   PORTB |= (1<<7) ;        //CS1S UP ( DISABLE LCD_UPSIDE )
   DDRG |= (1<<3) ;
   PORTG |= (1<<3) ;        //CS1M UP  ( DISABLE LCD_DOWNSIDE )

   SREG |= (1<<7) ;          // 全局中断允许
   EICRB |= (1<<5) ;     //下降沿触发
   EICRB &= ~(1<<4) ;
   EIMSK |= (1<<6) ;      // enable INT6
   asm ("sei") ;
}
/************************************ write *******************************************/
void write(u8 data)
{
   wr = &write_address ;
   *wr = data ;
}
/************************************ read *******************************************/
u8 read_keyboard()
{
   re = &read_address ;
   return (*re) ;
}
/******************************* write_KO_initilization ******************************/
void write_KO_initialization()
{
   DDRD |= (1<<7) ;          //PD7 OUT
   PORTD &= ~(1<<7) ;        //PD7 DOWN    ACS15=0  ENABLE ACS15
}
/******************************* read_KI_initialization ******************************/
void read_KI_initialization()
{
   DDRD |= (1<<7) ;          //PD7 OUT
   PORTD &= ~(1<<7) ;        //PD7 DOWN    ACS15=0  ENABLE ACS15
}
/****************************** write_KO0-KO5_zero ***********************************/
void write_KO0_to_KO5_zero()
{
   write(0xC0) ;             // KO0~KO5 DOWN
}

/*********************************** scan KO0 ****************************************/
u8 scan_KO0()
{
   write(0xFE) ;             // KO0 DOWN     KO1~7 UP
   read_data = read_keyboard() ;
   switch(read_data & 0x0F)
   {
      case 0x0F : scan_result = 0 ; break ;
      case 0x0E : { the_key = 1 ; scan_result = 1 ;} break ;
      case 0x0D : { the_key = 2 ; scan_result = 1 ;} break ;
      case 0x0B : { the_key = 3 ; scan_result = 1 ;} break ;
   }
   return  scan_result ;
}
/*********************************** scan KO1 ****************************************/
u8 scan_KO1()
{
   write(0xFD) ;             //KO1 DOWN      KO0,KO2~KO7 UP
   read_data = read_keyboard() ;
   switch(read_data & 0x0F)
   {
      case 0x0F :  scan_result = 0 ; break ;
      case 0x0E : { the_key = 4 ; scan_result = 1 ;} break ;
      case 0x0D : { the_key = 5 ; scan_result = 1 ;} break ;
      case 0x0B : { the_key = 6 ; scan_result = 1 ;} break ;
   }
   return  scan_result ;
}
/*********************************** scan KO2 ****************************************/
u8 scan_KO2()
{
   write(0xFB) ;             //KO2 DOWN      KO0~1,KO3~7 UP
   read_data = read_keyboard() ;
   switch(read_data & 0x0F)
   {
      case 0x0F : scan_result = 0 ; break ;
      case 0x0E : { the_key = 7 ; scan_result = 1 ;} break ;
      case 0x0D : { the_key = 8 ; scan_result = 1 ;} break ;
      case 0x0B : { the_key = 9 ; scan_result = 1 ;} break ;
      case 0x07 : { the_key = 10 ; scan_result = 1 ;} break ;
   }
   return  scan_result ;
}
/********************************* scan KO3 ******************************************/
u8 scan_KO3()
{
   write(0xF7) ;             //KO3 DOWN      KO0~2,KO4~7 UP
   read_data = read_keyboard() ;
   switch(read_data & 0x0F)
   {
      case 0x0F :  scan_result = 0 ; break ;
      case 0x0E : { the_key = 11 ; scan_result = 1 ;}  break ;
      case 0x0D : { the_key = 12 ; scan_result = 1 ;}  break ;
      case 0x0B : { the_key = 13 ; scan_result = 1 ;}  break ;
      case 0x07 : { the_key = 14 ; scan_result = 1 ;}  break ;
   }
   return  scan_result ;
}
/********************************** scan KO4 *****************************************/
u8 scan_KO4()
{
   write(0xEF) ;             //PA4(KO4) DOWN      PA0~3,PA5~7 UP
   read_data = read_keyboard() ;
   switch(read_data & 0x0F)
   {
      case 0x0F :  scan_result = 0 ; break ;
      case 0x0E : { the_key = 15 ; scan_result = 1 ;}  break ;
      case 0x0D : { the_key = 16 ; scan_result = 1 ;}  break ;
      case 0x0B : { the_key = 17 ; scan_result = 1 ;}  break ;
      case 0x07 : { the_key = 18 ; scan_result = 1 ;}  break ;
   }
   return  scan_result ;
}
/*********************************** scan KO5 ****************************************/
u8 scan_KO5()
{
   write(0xDF) ;             //KO5 DOWN      KO0~4,KO6~7 UP
   read_data = read_keyboard() ;
   switch(read_data & 0x0F)
   {
      case 0x0F :  scan_result = 0 ; break ;
      case 0x0E : { the_key = 19 ; scan_result = 1 ;}  break ;
      case 0x0D : { the_key = 20 ; scan_result = 1 ;}  break ;
      case 0x0B : { the_key = 21 ; scan_result = 1 ;}  break ;
   }
   return  scan_result ;
}

/******************************* scan_keyboard ***************************************/
u8 scan_keyboard()
{
   scan_KO0() ;
   if ( scan_result == 0 )
   {
       scan_KO1() ;
       if ( scan_result == 0 )
       {
           scan_KO2() ;
           if ( scan_result == 0 )
           {
               scan_KO3() ;
               if ( scan_result == 0 )
               {
                   scan_KO4() ;
                   if ( scan_result == 0 )
                   {
                       scan_KO5() ;
                   }
               }
           }
       }
   }
   return the_key ;
}
/************************************ get_the_key ************************************/
u8 get_the_key()
{

    u8 t = 0 ;
    for(;t<10;)
    {
         keyboard_initialization() ;
         write_KO0_to_KO5_zero() ;
         while( flag_k != 1 ) ;
         k1 = scan_keyboard() ;
         delay(200) ;
         k2 = scan_keyboard() ;
         flag_k = 0 ;
         //over = 0 ;
         if (k1 = k2)
         {
            final_key = k1 ;
            t = 100 ;
         }
    }
    return final_key ;
}
/************************************** scan_final_key*****************************************/
u8 scan_final_key()
{
   u8 ff ;
   keyboard_initialization() ;
   ff = get_the_key() ;
   return ff ;
}

⌨️ 快捷键说明

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