📄 key.c~
字号:
/******************************************************************************
* PC/AT keyboard driver.
* Based in part on Atmel's application note AVR313. www.atmel.com
******************************************************************************/
#include <mega16.h>
#include <key.h>
#include <scancodes.h>
#include <delay.h>
unsigned char flash huanying[]=
{
/*------------------------------------------------------------------------------
; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。
; 源文件 / 文字 : C:\Documents and Settings\a\桌面\ghjgh.bmp字模
; 宽×高(像素): 128×64
; 字模格式/大小 : 单色点阵液晶字模,横向取模,字节正序/1024字节
; 数据转换日期 : 2008-5-21 2:12:21
------------------------------------------------------------------------------*/
0x80,0x40,0x10,//宽的像素数,高的像素数,宽的字节数,参数设置可选
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x18,0x40,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0E,0x00,0x3F,0xFF,0x80,0x18,0x70,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0C,0x00,0x3F,0xFF,0x80,0x18,0x30,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x0C,0x00,0x00,0x0F,0x00,0x18,0x38,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0xFF,0xF0,0x00,0x1C,0x03,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0x0C,0x30,0x00,0x70,0x00,0x18,0x60,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x03,0x0C,0x30,0x00,0x60,0x00,0x18,0x60,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x03,0x0C,0x30,0x00,0x60,0x80,0x18,0x60,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x03,0xFF,0xF0,0xFF,0xFF,0xE0,0x18,0x60,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x03,0x0C,0x30,0xFF,0xFF,0xEF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x03,0x0C,0x30,0x00,0x60,0x07,0xDF,0xFC,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x0B,0x0C,0x30,0x00,0x60,0x00,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x1B,0xFF,0xF0,0x00,0x60,0x00,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,
0x10,0x01,0x00,0x33,0x0C,0x3C,0x00,0x60,0x00,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,
0x08,0x01,0x00,0x63,0x0C,0x0C,0x00,0x60,0x00,0x18,0xF8,0x00,0x00,0x00,0x00,0x00,
0x04,0x01,0x00,0xC0,0x0C,0x0C,0x00,0x60,0x00,0x18,0x78,0x00,0x00,0x00,0x00,0x00,
0x02,0x01,0xC1,0x80,0x0C,0x0C,0x07,0xE0,0x00,0x18,0x30,0x00,0x00,0x00,0x00,0x00,
0x01,0x1F,0xFB,0x00,0x0F,0xFE,0x03,0xE0,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xB8,0x1E,0x00,0x07,0xFC,0x00,0xC0,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xE0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xC0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0x80,0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x01,0x86,0x60,0x08,0x00,0x00,0x0C,0xC1,0xFE,0x00,0x00,0x00,0x00,0x00,
0x01,0x80,0x01,0x06,0xC0,0x08,0x40,0x00,0x7D,0xF1,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0xC0,0x03,0x04,0xFE,0x7F,0xC0,0x00,0x11,0x51,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0xE0,0x06,0x0D,0xC0,0x09,0x00,0x00,0x7D,0x51,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0xF0,0x0C,0x0D,0x40,0x0A,0x00,0x00,0x39,0xF1,0xFE,0x00,0x00,0x00,0x00,0x00,
0x01,0x1C,0x3C,0x1D,0x40,0xFF,0xF0,0x00,0x55,0x50,0x00,0x00,0x00,0x00,0x00,0x00,
0x02,0x0F,0xF2,0x14,0x78,0x18,0x02,0x00,0x11,0xF1,0xFF,0x00,0x00,0x00,0x00,0x00,
0x04,0x01,0x01,0x04,0x40,0x3F,0x86,0x00,0x78,0xC0,0x10,0x00,0x00,0x00,0x00,0x00,
0x08,0x01,0x00,0x84,0x40,0x48,0x80,0x00,0x2C,0xEB,0xFF,0x80,0x00,0x00,0x00,0x00,
0x10,0x01,0x00,0x44,0x78,0x8F,0x82,0x00,0x25,0xF8,0x28,0x00,0x00,0x00,0x00,0x00,
0x20,0x01,0x00,0x24,0x41,0x08,0x86,0x00,0x1F,0x40,0xC4,0x00,0x00,0x00,0x00,0x00,
0x40,0x01,0x00,0x14,0x40,0x08,0x80,0x00,0x76,0x79,0x83,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x04,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0xC1,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x01,0x02,0x10,0x0F,0x50,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x1D,0x73,0x90,0xE9,0x6E,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0xD5,0x52,0x1E,0xAF,0x4A,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x55,0x52,0x10,0xA8,0x4A,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0xDD,0x7A,0x1E,0xAF,0x4E,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
/******************************************************************************
* InitializeKeyboard()
* Initializes the ports and control registers needed for running the keyboard.
******************************************************************************/
unsigned char edge; /* 0 = neg. 1 = pos. */
unsigned char bitcount;
void InitializeKeyboard( void )
{
GICR =0x40; /* enable INT0 interrupt */
#asm("sei"); /* enable global intterupts */
MCUCR =0x02; /* trigger INT0 on falling edge */
DDRD&=~0x0c;
PORTD|=0x0c;
/* PD2, PD3 are inputs */
edge = 0;
bitcount = 11;
return;
}
/******************************************************************************
* interrupt [EXT_INT0] void ext_int0_isr (void)
* When the keyboard triggers the external interrupt this function is called
* to retrieve the data.
******************************************************************************/
interrupt [EXT_INT0] void ext_int0_isr (void)
{
static unsigned char scancode = 0;
if(!edge) // Routine entered at falling edge
{
if( ( bitcount < 11 ) && ( bitcount > 2 ) )
{
// Bit 3 to 10 is data. Parity bit, start and stop bits are ignored.
scancode = ( scancode >> 1 );
if( PIND&0x08 ) //如果数据是1 PD3是键盘数据输入端,PO2是中断口
{
scancode = scancode | 0x80; // Store a '1' for this bit
}
}
MCUCR=0x03; // Set interrupt on rising edge
edge = 1;
}
else // Routine entered at rising edge
{
MCUCR =0x02; // Set interrupt on falling edge
edge = 0;
if(--bitcount == 0) // All bits received
{
bitcount = 11;
key= Decode( scancode );
}
}
}
unsigned char Decode( unsigned char scancode )
{
int i = 0;
unsigned char temp = 0;
static unsigned char shift = 0;
unsigned char key_value=0;
if( ( scancode == 0x12 ) || ( scancode == 0x59 ) )
{
// left or right shift按住SHIFT键
shift = 1;
}
else
{
// a key other than shift was pressed, do a table look-up
for( i = 0; i < 50; i++ )//查表,寻找对应键值
{
temp = char_table[i*3];//PRG_RGB可能因为要用FLASH中数据要用此函数
//i*3应该是表中各键值对应初始地址,因为一块就要三个数据
if ( temp == scancode )
{
if( shift ) //如果按了SHIFT就取后面那个大些的字母
{
key_value = char_table[i*3+2];
}
else
{
key_value = char_table[i*3+1];
}
break;
}
}
shift = 0;
}
delay_ms(20);
return key_value;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -