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

📄 keyboard.c

📁 采用Atmega16的变频式超声波发生器的源代码
💻 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 + -