void init_port(void);
void outport_d(char); // 7 segment
void outport_b(char); // keypad row
char inport_c(void); // keypad col
int main(void){
char numbers[11] = {0x3F, 0x06, 0x5B, 0x4F,0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67,0x00}; // numbers[10] is off
char x;
init_port();
outport_d(~(0x00));
x = scan_keypad();
while(1){
while(x == 100){ // initial x is taken as 100 , bcz x = 0 is valid value to show on display
x = scan_keypad();
}
outport_d(~(numbers[x]));
x = 100; //reset x
}
}
/*--------------- PORTS CONFIG -------------------------*/
void init_port(void){
volatile char* dird = (volatile char *)0x2A;
volatile char* dirb = (volatile char *)0x24;
volatile char* dirc = (volatile char *)0x27;
*dirc = 0xF0; // lower 4 bit input
*dird = 0xFF;
*dirb = 0x0F;
}
void outport_d(char data){
volatile char* outd = (volatile char *)0x2B;
*outd = data;
}
void outport_b(char data){
volatile char* outb = (volatile char *)0x25;
*outb = data & 0x0F;
}
char inport_c(void){
volatile char* inc = (volatile char *)0x26;
char data;
data = *inc & 0x0F;
data = (~data) & 0x0F;
return data;
}
/*-----------------------------------------*/
void delay_ms(long i){
volatile long j;
for(j = 0; j < 10000*i; j++);
}
char scan_keypad(void){
char row, col , val;
for(row = 0; row < 4; row++){
outport_b(~(0x01 << row));
val = inport_c();
for(col = 0; col < 4; col++){
if(val == (0x01 << col)){
return (row*4 + col);
}
}
}
return 100; // default val 100
}