Keyboard-MCU interfacing take a input from keypad and display on LCD

This experiment is easy to be realised in laboratory with exact hardware as shown in the Animation. However if students are interested in  software simulations, they can use AVR studio to generate the HEX code and then simulate their program in Proteus.


AVR Studio

AVR studio is required to write the C-code and generate its HEX code. To download the AVR Studio 5 kindly follow the download link provided inSoftware tab. The C-code for AVR studio is provided.


PROTEUS ISIS:

The "Proteus ISIS" is required to design and simulate the circuit. The circuit diagram for Proteus is provided.
To download the TRIAL VERSION OF PROTEUS LITE kindly follow the download  link provided in Software tab.



CIRCUIT DIAGRAM FOR PROTEUS




CODE FOR AVR STUDIO



#ifndef F_CPU
#define F_CPU 12000000UL
#endif

#include<avr/io.h>                                    //standard AVR header
#include<util/delay.h>                                //delay header


#define KEY_PRT PORTB                                 //keyboard PORT
#define KEY_DDR DDRB                                  //keyboard DDR
#define KEY_PIN PINB                                  //keyboard PIN


#define LCD_PRT PORTC
#define LCD_DDR DDRC
#define LCD_PIN PINC

#define LCD_RS 0
#define LCD_RW 1
#define LCD_EN 2


void lcdinit(void);
void lcd_gotoxy(unsigned char,unsigned char );
void lcdprint(char*);
void lcdcommand(unsigned char);
void delay_us(unsigned int);
void delay_ms(unsigned int );
void lcddata(unsigned char);
void keypadcall();




unsigned char keypad[4][4]={{'7','8','9','L',},
                            {'4','5','6','R',},
                            {'1','2','3',' ',},
                            {'r','0','E',' ',}};


/*------------------------ MAIN FUNCTION -------------------------*/


int main(void)
{
  
      DDRC=0x00;
      DDRA=0xFF;
  
  
  
     lcdinit();
      lcd_gotoxy(5,1);
     lcdprint("WELCOME");
     lbdcommand(0x01);
     lcd_gotoxy(4,1);
     lcdprint("IIT KGP");
     lcd_gotoxy(6,1);
      keypadcall();
      
    
     
     
       
     return 0;
}

/*-----------------LCD INITIALIZATION FUNCTION------------------------*/


void lcdinit()

     {

      LCD_DDR=0XFF;
      LCD_PRT&=~(1<<LCD_EN);
      delay_us(2000);

      lcdcommand(0x33);
      delay_us(100);

      lcdcommand(0x32);
      delay_us(100);

      lcdcommand(0x28);
      delay_us(100);

      lcdcommand(0x0E);
      delay_us(100);

      lcdcommand(0x01);
      delay_us(2000);

      lcdcommand(0x06);
      delay_us(100);

     }


/*----------------------LCD COMMAND FUNCTION-------------------------------*/

void lcdcommand(unsigned char cmnd)

     {
     
      LCD_PRT=(LCD_PRT & 0x0F)|(cmnd & 0xF0);
      LCD_PRT&=~(1<<LCD_RS);
      LCD_PRT&=~(1<<LCD_RW);
      LCD_PRT|=(1<<LCD_EN);

      delay_us(1);
      LCD_PRT&=~(1<<LCD_EN);

      delay_us(20);
      
      LCD_PRT=(LCD_PRT & 0X0F)|(cmnd<<4);
      LCD_PRT|=(1<<LCD_EN);
      
      delay_us(1);
      
      LCD_PRT&=~(1<<LCD_EN);
      
     }



/*-----------------DELAY FUNCTIONS----------------------------------*/

void delay_us(unsigned int d)
{
    _delay_us(d);
}

void delay_ms(unsigned int d)
{
    
    _delay_ms(d);
}


/*---------------LCD GOTOXY FUNTION--------------------------------*/


void lcd_gotoxy(unsigned char x,unsigned char y)
{
    
    unsigned char firstcharadr[]={0x80,0xC0,0x94,0xD4};
        lcdcommand(firstcharadr[y-1]+x-1);
        delay_us(100);
}

/*---------------LCD PRINT FUNCTION---------------------------------*/

void lcdprint(char *str)
{
    
    unsigned char i=0;
    while(str[i]!=0)
    {
        lcddata(str[i]);
        i++;
    }
    
}


/*-----------------LCD DATA FUNCTION---------------------------------*/


void lcddata(unsigned char data)

     {
     
      LCD_PRT =(LCD_PRT & 0X0F)|(data & 0XF0);
      LCD_PRT|=(1<<LCD_RS);
      LCD_PRT&=~(1<<LCD_RW);
      LCD_PRT|=(1<<LCD_EN);
      
      delay_us(1);
      
      LCD_PRT&= ~(1<<LCD_EN);
      delay_us(20);

      LCD_PRT=(LCD_PRT & 0X0F)|(data<<4);
      LCD_PRT|=(1<<LCD_EN);

      delay_us(1);

      LCD_PRT&=~(1<<LCD_EN);

     }


/*----------------KEYPADCALL FUNCTION--------------------------------*/

void keypadcall(void)
{
    unsigned char colloc,rowloc;      //keypad routine.This sends the 
                                      //ASCII code for pressed key to PORTB

    KEY_DDR=0XF0;
    KEY_PRT=0XFF;
    
    do 
    {
        KEY_PRT &=0X0F;              //ground all rows at once
        colloc=(KEY_PIN&0X0F);       //read the columns
        
    }while(colloc!=0X0F) ;           //check until all keys released
    
    
    
    
    do 
    {
        do 
        {    delay_ms(5);             //call delay
            colloc=(KEY_PIN&0X0F);   //see if any key is pressed
        } while (colloc==0X0F);      //keep checking for key press
        
        delay_ms(5);                 //call delay for debounce
        colloc=(KEY_PIN&0X0F);       //read columns
    } while (colloc==0X0F);          //wait for key press
    
    while(1)
    
    {KEY_PRT=0XEF;                   //ground row 0
    colloc=(KEY_PIN&0X0F);           //read the columns
    if(colloc!=0X0F)                 //column detected
    {
        rowloc=0;                    //save row location
        break;                       //exit while loop
    }
    
    
    KEY_PRT=0XDF;                    //ground row 1
    colloc=(KEY_PIN&0X0F);           //read the columns
    if(colloc!=0X0F)                 //column detected
    {
        rowloc=1;                    //save row location
        break;                       //exit while loop
    }
    
    KEY_PRT=0XBF;                    //ground row 2
    colloc=(KEY_PIN&0X0F);           //read the column
    if(colloc!=0X0F)                 //column detected
    {
        rowloc=2;                    //save row location
        break;                      //exit while loop
    }
    
    KEY_PRT=0X7F;                  //ground row 3
    colloc=(KEY_PIN&0X0F);         //read the column
    rowloc=3;                      //save row location 
    break;                         //exit while loop
    }
    
          
   /************************CHECK COLUMN AND SEND RESULT TO LCD *******************/                              

    if (colloc==0X0E)
    lcddata(keypad[rowloc][0]);
        
    else if (colloc==0x0D)
    lcddata(keypad[rowloc][1]);
    
    else if (colloc==0X0B)
    lcddata(keypad[rowloc][2]);
    else
    lcddata(keypad[rowloc][3]);
    


    
}    
  


/******************************** END *********************************************/


 

ANOTHER CODE FOR AVR STUDIO



#ifndef F_CPU
#define F_CPU 12000000UL
#endif

#include<avr/io.h>                                    //standard AVR header
#include<util/delay.h>                                //delay header


#define KEY_PRT PORTB                                 //keyboard PORT
#define KEY_DDR DDRB                                  //keyboard DDR
#define KEY_PIN PINB                                  //keyboard PIN


#define LCD_PRT PORTC
#define LCD_DDR DDRC
#define LCD_PIN PINC

#define LCD_RS 0
#define LCD_RW 1
#define LCD_EN 2


void lcdinit(void);
void lcd_gotoxy(unsigned char,unsigned char );
void lcdprint(char*);
void lcdcommand(unsigned char);
void delay_us(unsigned int);
void delay_ms(unsigned int );
void lcddata(unsigned char);
void keypadcall();



void stepperCW();
void stepperCCW();



unsigned char keypad[4][4]={{'7','8','9','L',},
                            {'4','5','6','R',},
                            {'1','2','3',' ',},
                            {'r','0','E',' ',}};


/*------------------------ MAIN FUNCTION -------------------------*/


int main(void)
{
  
      DDRC=0x00;
      DDRA=0xFF;
  
  
  
     lcdinit();
     
     lcd_gotoxy(1,1);
     
while(1)
{

     keypadcall();
     
 }  
       
     return 0;
}

/*-----------------LCD INITIALIZATION FUNCTION------------------------*/


void lcdinit()

     {

      LCD_DDR=0XFF;
      LCD_PRT&=~(1<<LCD_EN);
      delay_us(2000);

      lcdcommand(0x33);
      delay_us(100);

      lcdcommand(0x32);
      delay_us(100);

      lcdcommand(0x28);
      delay_us(100);

      lcdcommand(0x0E);
      delay_us(100);

      lcdcommand(0x01);
      delay_us(2000);

      lcdcommand(0x06);
      delay_us(100);

     }


/*----------------------LCD COMMAND FUNCTION-------------------------------*/

void lcdcommand(unsigned char cmnd)

     {
     
      LCD_PRT=(LCD_PRT & 0x0F)|(cmnd & 0xF0);
      LCD_PRT&=~(1<<LCD_RS);
      LCD_PRT&=~(1<<LCD_RW);
      LCD_PRT|=(1<<LCD_EN);

      delay_us(1);
      LCD_PRT&=~(1<<LCD_EN);

      delay_us(20);
      
      LCD_PRT=(LCD_PRT & 0X0F)|(cmnd<<4);
      LCD_PRT|=(1<<LCD_EN);
      
      delay_us(1);
      
      LCD_PRT&=~(1<<LCD_EN);
      
     }



/*-----------------DELAY FUNCTIONS----------------------------------*/

void delay_us(unsigned int d)
{
    _delay_us(d);
}

void delay_ms(unsigned int d)
{
    
    _delay_ms(d);
}


/*---------------LCD GOTOXY FUNTION--------------------------------*/


void lcd_gotoxy(unsigned char x,unsigned char y)
{
    
    unsigned char firstcharadr[]={0x80,0xC0,0x94,0xD4};
        lcdcommand(firstcharadr[y-1]+x-1);
        delay_us(100);
}

/*---------------LCD PRINT FUNCTION---------------------------------*/

void lcdprint(char *str)
{
    
    unsigned char i=0;
    while(str[i]!=0)
    {
        lcddata(str[i]);
        i++;
    }
    
}


/*-----------------LCD DATA FUNCTION---------------------------------*/


void lcddata(unsigned char data)

     {
     
      LCD_PRT =(LCD_PRT & 0X0F)|(data & 0XF0);
      LCD_PRT|=(1<<LCD_RS);
      LCD_PRT&=~(1<<LCD_RW);
      LCD_PRT|=(1<<LCD_EN);
      
      delay_us(1);
      
      LCD_PRT&= ~(1<<LCD_EN);
      delay_us(20);

      LCD_PRT=(LCD_PRT & 0X0F)|(data<<4);
      LCD_PRT|=(1<<LCD_EN);

      delay_us(1);

      LCD_PRT&=~(1<<LCD_EN);

     }


/*----------------KEYPADCALL FUNCTION--------------------------------*/

void keypadcall(void)
{
    unsigned char colloc,rowloc;      //keypad routine.This sends the 
                                      //ASCII code for pressed key to PORTB

    KEY_DDR=0XF0;
    KEY_PRT=0XFF;
    
    do 
    {
        KEY_PRT &=0X0F;              //ground all rows at once
        colloc=(KEY_PIN&0X0F);       //read the columns
        
    }while(colloc!=0X0F) ;           //check until all keys released
    
    
    
    
    do 
    {
        do 
        {    delay_ms(5);             //call delay
            colloc=(KEY_PIN&0X0F);   //see if any key is pressed
        } while (colloc==0X0F);      //keep checking for key press
        
        delay_ms(5);                 //call delay for debounce
        colloc=(KEY_PIN&0X0F);       //read columns
    } while (colloc==0X0F);          //wait for key press
    
    while(1)
    
    {KEY_PRT=0XEF;                   //ground row 0
    colloc=(KEY_PIN&0X0F);           //read the columns
    if(colloc!=0X0F)                 //column detected
    {
        rowloc=0;                    //save row location
        break;                       //exit while loop
    }
    
    
    KEY_PRT=0XDF;                    //ground row 1
    colloc=(KEY_PIN&0X0F);           //read the columns
    if(colloc!=0X0F)                 //column detected
    {
        rowloc=1;                    //save row location
        break;                       //exit while loop
    }
    
    KEY_PRT=0XBF;                    //ground row 2
    colloc=(KEY_PIN&0X0F);           //read the column
    if(colloc!=0X0F)                 //column detected
    {
        rowloc=2;                    //save row location
        break;                      //exit while loop
    }
    
    KEY_PRT=0X7F;                  //ground row 3
    colloc=(KEY_PIN&0X0F);         //read the column
    rowloc=3;                      //save row location 
    break;                         //exit while loop
    }
    
          
   /************************CHECK COLUMN AND SEND RESULT TO LCD *******************/                              

    if (colloc==0X0E)
    lcddata(keypad[rowloc][0]);
        
    else if (colloc==0x0D)
    lcddata(keypad[rowloc][1]);
    
    else if (colloc==0X0B)
    lcddata(keypad[rowloc][2]);
    else
    lcddata(keypad[rowloc][3]);
    


    
}    
  
 /*---------------------CLOCKWISE ROTATION OF STEPPER MOTOR---------------------*/      
      
    
    void stepperCW()
        
             {
             
               PORTD=0x0C;
               _delay_ms(5);
               PORTD=0x06;
               _delay_ms(5);
               PORTD=0x03;
               _delay_ms(5);
               PORTD=0x09;
               _delay_ms(5);
               
             }
             
/*-------------------ANTICLOCKWISE ROTATION OF STEPPER MOTOR----------------------*/              
             
       void stepperCCW()
       
             {
             
              PORTD=0x09;
              _delay_ms(5);
              PORTD=0x03;
              _delay_ms(5);
              PORTD=0x06;
              _delay_ms(5);
              PORTD=0x0C;
              _delay_ms(5);

              }

/******************************** END *********************************************/


THANK YOU FOR VISITING..!!
PLEASE COMMENT

No comments:

Post a Comment