|
发表于 2006-5-8 18:26:27
|
显示全部楼层
//this program reading the value of the key on the keyboard,is designed by TanXianbo,
//all rights is reserved,if you have any problem ,please send email txbhj@163.com to me.
/*列接PD0~3*/
/*行接PD4~5*/
#include <iom16v.h>
#include <macros.h>
#define K1_1 0
#define K1_2 1
#define K1_3 2
#define K1_4 3
#define K2_1 4
#define K2_2 5
#define K2_3 6
#define K2_4 7
#define K3_1 8
#define K3_2 9
#define K3_3 10
#define K3_4 11
#define K4_1 12
#define K4_2 13
#define K4_3 14
#define K4_4 15
// 1 2 3 +
// 4 5 6 -
// 7 8 9 *
// 0 ac = /
unsigned char dis_flag=0,disled[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0X77,0X7C,
0X39,0X5E,0X79,0X71};
unsigned int array[]={0,0,0,0};
int key_value;
void delay10ms()
{
unsigned int i;
for(i=0;i<19940/2;i++)
asm("nop");
}
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x64; //set count
OCR0 = 0x9C; //set compare
TCCR0 = 0x03; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0x64; //reload counter value
display();
}
unsigned char read_keyboard(void)
{
unsigned int key_value;
unsigned char key_return,key,keyl=0,keyh=0;
keyh=PIND;
PORTD=~PORTD;
DDRD=~DDRD;
asm("nop");
keyl=PIND;
key=keyl|keyh;
switch(key)
{
case 0b11101110:key_return=K1_1;
break;
case 0b11101101:key_return=K1_2;
break;
case 0b11101011:key_return=K1_3;
break;
case 0b11100111:key_return=K1_4;
break;
case 0b11011110:key_return=K2_1;
break;
case 0b11011101:key_return=K2_2;
break;
case 0b11011011:key_return=K2_3;
break;
case 0b11010111:key_return=K2_4;
break;
case 0b10111110:key_return=K3_1;
break;
case 0b10111101:key_return=K3_2;
break;
case 0b10111011:key_return=K3_3;
break;
case 0b10110111:key_return=K3_4;
break;
case 0b01111110:key_return=K4_1;
break;
case 0b01111101:key_return=K4_2;
break;
case 0b01111011:key_return=K4_3;
break;
case 0b01110111:key_return=K4_4;
break;
default:
break;
}
PORTD=0b11110000;
DDRD= 0b00001111;
asm("nop");
while(PIND!=0B11110000);
return key_return;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
timer0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x01; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void display(void)
{PORTA|=0XFF;
PORTB=disled[key_value];
PORTA&=~BIT(0);
}
void main(void)
{
PORTB=0X00;
DDRB=0XFF;
PORTA=0Xff;
DDRA=0X0f;
init_devices();
while(1)
{display();
PORTD=0b11110000;
DDRD= 0b00001111;
asm("nop");
while(PIND!=0B11110000)
{
delay10ms();
if(PIND!=0B11110000)
key_value=read_keyboard();
}
}
} |
|