📄 keyboard.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 + -