پاسخ تمرين در زير آورده شده است. مسلما پاسخ هاي ديگري نيز مي توان براي آن نوشت.
در ضمن بدست آوردن مقادير مربوط به متغير keytable به عهده دانشجويان مي باشد.
#include
#include
#include
#include
#asm
.equ __lcd_port=0x18
#endasm
void main (void)
{
char buffer[6];
char key,i;
unsigned char keytable[17]={0xee,.....};
lcd_init(16);
lcd_clear();
while(1){
lcd_putsf("welcome");
delay_ms(500);
lcd_clear();
DDRD=0x0f;
PORTD=0xf0;
delay_us(10);
key=PIND;
DDRD=0xf0;
PORTD=0x0f;
delay_us(10);
key=PIND|key;
delay_ms(20);
i=0xff;
if (key!=0xff){
for(i=0;i<16;i++){
if(keytable[i]==key){
i++;
switch (i){
case 9: i=0;
sprintf(buffer,"key=%d",i);
lcd_puts(buffer);
break;
case 10: lcd_putsf("key=*");
break;
case 11: lcd_putsf("key=#");
break;
case 12: lcd_putsf("key=f1");
break;
case 13: lcd_putsf("key=f2");
break;
case 14: lcd_putsf("key=f3");
break;
case 15: lcd_putchar("key=f4");
break;
default:
sprintf(buffer,"key=%d",i);
lcd_puts(buffer);
}
}
}
}
}
}
در اينجا مي توان در تمام حالات مقدار i را به عنوان يك كاراكتر تعريف كرده(كاراكتر متناظر) و سپس بعد از اتمام switch با دو خط دستور زير آنرا روي lcd نمايش داد.
(sprintf(buffer,"key=%c",i
(lcd_puts(buffer