volatile char *dira,*dirc,*dirf,*dirk;
volatile char *outa,*inc,*outf,*outk;
void init_port()
{
dira = 0x21 ; *dira = 0x0F ; outa = 0x22 ;
dirc = 0x27 ; *dirc = 0x00 ; inc = 0x26 ;
dirf = 0x30 ; *dirf = 0xFF ; outf = 0x31 ;
dirk = 0x107 ; *dirk = 0x03 ; outk = 0x108;
}
char keypad_scanning()
{
volatile char row, col, key;
for(row = 0; row < 4; row++){
*outa = 1 << row;
if(*inc){ col = *inc; break;}
}
if(row == 0){
if(col == 1) key = '1';
else if(col == 2) key = '2';
else if(col == 4) key = '3';
else if(col == 8) key = '+';
}
else if(row == 1){
if(col == 1) key = '4';
else if(col == 2) key = '5';
else if(col == 4) key = '6';
else if(col == 8) key = '-';
}
else if(row==2){
if(col == 1) key = '7';
else if(col == 2) key = '8';
else if(col == 4) key = '9';
else if(col == 8) key = '*';
}
else if(row == 3){
if(col == 1) key = 'c';
else if(col == 2) key = '0';
else if(col == 4) key = '=';
else if(col == 8) key = '/';
}
return key;
}
char calculation(char s1,char s2,char func){
switch(func){
case '+' :return(s1+s2);
case '-' :return(s1-s2);
case '*' :return(s1*s2);
case '/' :return(s1/s2);
}
}
void outdata(char out_data){
volatile char *portf_data = (volatile char*)0x31;
*portf_data = out_data;
}
void outcontrol(char out_data){
volatile char *portk_data = (volatile char*)0x108;
*portk_data = out_data;
}
void write_string(char*ptr){
while(*ptr != 0){
write_data(*ptr);
ptr++;
}
}
void init_lcd(void){
outdata (0x38); // 8-bit mode
lcd_control_write(); // ENABLE
outdata (0x0F); // display blinking cursor
lcd_control_write(); //ENABLE
outdata(0x01);// CLEAR DISPLAY
lcd_control_write();//ENABLE
outdata(0x06);// auto increment
lcd_control_write();//ENABLE
}
void write_data(char wr_data){
outdata(wr_data);
outcontrol(0x02);
delay1(1);
outcontrol(0x03);
delay1(1);
outcontrol(0x02);
delay1(1);
}
void lcd_control_write(void){
outcontrol(0x01);
delay1(1);
outcontrol(0x00);
delay1(1);
}
void delay1 (int count){
volatile long i;
while (count){
for(i=0;i<10000;i++);
count--;
}
}
void setup(){
init_port();
init_lcd();
volatile char key ;
while(1)
{
key = keypad_scanning();
write_data( key);
}
}
void loop(){
}