📄 keyboard.c
字号:
#include"main.h"
extern volatile ulong key_sum;
extern volatile uchar key_flag,key_bit,next_sf;
extern volatile char *screen[4] PROGMEM;
extern volatile uchar line;
void keyboard_init(void)
{
ddrb|=0x0f;
portb&=0xf0;
ddrc&=0x3c;
portc|=0xc3;
sbi(portd,2);
sbi(GICR,INT0); // low level triggers the interrupt
}
ISR(SIG_INTERRUPT0)
{
static uchar key_data[10],shift=0;
const unsigned char key_table[17]={'1','2','3','4',
'5','6','7','8',
'9','0','a','b',
'c','d','e','f',
0xff};
unsigned char temp,key=17,j,key_bit_max,temp0;
unsigned long i;
temp=PINC;
temp0=temp&0x03;
temp=((temp>>4)&0x0c);
temp=~((temp|temp0)|0xf0);
switch(temp)
{
case 1:key=12;break;
case 2:key=8;break;
case 4:key=4;break;
case 8:key=0;break;
default :key=17;
}
ddrc|=0xc3;
portc&=0x3c;
ddrb&=0xf0;
portb|=0x0f;
/*
DDRB&=0XF0;
PORTB|=0X0F;
DDRD|=0XF0;
PORTD&=0X0F;
*/
delay_ms(1);
temp=PINB;
temp=~(temp|0xf0);
switch(temp)
{
case 1:key+=0;break;
case 2:key+=1;break;
case 4:key+=2;break;
case 8:key+=3;break;
default :key=17;
}
if(shift==0)
{
if(key<9)
{
write_data(key_table[key]);
key_data[key_bit]=key+1;
key_bit++;
}
else
switch(key)
{
case 9:write_data(key_table[key]);
key_data[key_bit]=0;
key_bit++;
break;
case 10:page_up();break; //a:pageup
case 11:page_down();break; //b:pagedown
case 12:shift=1;break; //c:shift
case 13:write_data('.');break; //d:'.'
case 14:write_command(0x10); //e:backspace
write_data(0x20);
write_command(0x10);
key_bit--;
break;
case 15: //f:enter
key_bit_max=--key_bit;
for(key_bit=0;key_bit<10;key_bit++)
{
i=key_data[key_bit];
for(j=key_bit_max-key_bit;j>0;j--)
i*=10;
key_sum+=i;
}
key_flag=1;
}
}
else
{
switch(key)
{
case 10:write_position(1,1);break;
case 11:write_position(2,1);break;
case 13:clear_screen();break;
case 15:next_sf=1;break;
}
}
if(key!=12)
shift=0;
keyboard_init();
loop_until_bit_is_set(pind,2);
}
ulong key_input(void)
{
key_sum=0;
key_bit=0;
key_flag=0;
while(key_flag==0);
return key_sum;
}
void page_down(void)
{
if((line<(screen_max-1)))
line++;
clear_screen();
write_string_flash((char*)pgm_read_word(&screen[line]));
line++;
write_position(2,1);
write_string_flash((char*)pgm_read_word(&screen[line]));
}
void page_up(void)
{
if(line>1)
{
line-=3;
clear_screen();
write_string_flash((char*)pgm_read_word(&screen[line]));
line++;
write_position(2,1);
write_string_flash((char*)pgm_read_word(&screen[line]));
}
}
void next(void)
{
while(next_sf==0);
next_sf=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -