Featured post

Objectives and content

Thursday, 11 August 2016

Keyboard

Expt-1: Interface keyboard with ATMEGA 32

Components required:

Sl. No.
Category
Item name/value
Quantity
1
IC
ATMEGA32
1
2

7805
1
3
Resistor
10K        
1
4

330R
1
5
Capacitor
0.1uf
2
6

22pf
2
7

10uf, 24Volt
1
8
Crystal Oscillator
16MHz
1
9
LCD
16X2
1
10
Matrix Keyboard
4X4
1

Model:

Procedure:
1.  Define F_CPU 16000000UL
2.  include <avr/io.h>, <compat/deprecated.h>, <util/delay.h> <avr/interrupt.h>
3.  define E 5 since pin 5 of PORTD is connected to LCD enable pin
4.  define RS 6 since 6 pin of PORTD is connected to LCD RS i.e. “register selection” pin
5.  declare functions
a.  void send_a_command(unsigned char command);
b.  void send_a_character(unsigned char character);
c.  void send_a_string(char *string_of_characters);
d.  declare uint8_t a,b,c,p,q,r,s,i,f,z; char buffer[16];
e.  int key=0; for allocating integer to reset the LCD once it reaches its display limit
f.  int keypressed=0; for integer for storing matrix value
6.  declare PORTB and PORTD as output pins
7.  initialize i=f=z=0;
8.  give delay of 50ms
9.  send_a_command(0x01); to Clear Screen 0x01 = 00000001
10. give delay of 50ms
11. send_a_command(0x38); to tell lcd we are using 8bit command /data mode
12. give delay of 50ms
13. send_a_command(0b00001111); makes LCD SCREEN ON and courser blinking
14. DDRA=0xF0; makes column pins as input and row pins as output
15. _delay_ms(1);
16. PORTA=0x0F;// to power the row ins
17. _delay_ms(1);
18. Infinite loop 1 starts
19. Infinite loop 2 starts
20. if (z>1) break;
21. else if (z>0)
a.  send_a_command(0x80 + 0x40 +0); to move courser to second line.
b.  _delay_ms(50);
c.  send_a_string("Stop "); to display a string
22. else
a.  send_a_command(0x01);//clear lcd
b.  _delay_ms(50);
c.  send_a_command(0x80 +0); to move courser to first line.
d.  _delay_ms(50);
e.  send_a_string("Start ");//display string
23. Infinite loop 3 starts
24. Check true for any of column pins goes low
a.  if PA0 is low assign a=1 else a=0;
b.  if PA1 is low assign b=2 else b=0;
c.  if PA2 is low assign c=4 else c=0;
d.  if a>0 assign keypressed=a;
e.  if b>0 assign keypressed=b;
f.  if c>0 assign keypressed=c;
g.  display keypressed to show column address
h.  break Infinite loop 3 and goto step 25
25. assign DDRA to DDRA bitwise XOR with 0b11111111 to make rows as inputs and columns as output
26. Delay for 10 ms
27. Power the columns
28. Delay for 50 ms
29. Infinite loop 4 starts
30. Check true for any of row pins goes low
a.  If PA4 is low assign p=16 else p=0;
b.  If PA5 is low assign q=32 else q=0;
c.  If PA6 is low assign r=64 else r=0;
d.  If PA7 is low assign s=16 else s=0;
e.  break Infinite loop 4 and goto step 31;
31. if (p>0) assign keypressed to keypressed bitwise OR with p;
a.  else if (q>0) assign keypressed to keypressed bitwise OR with q;
b.  else if (r>0) assign keypressed to keypressed bitwise OR with r;
c.  else if (s>0) assign keypressed to keypressed bitwise OR with s;
32. display keypressed to show row address
33. check for keypressed==0b00010001
a.  if yes display 3, increment key counter and assign initial and final position if z>0
34. check for keypressed==0b00010010
a.  if yes display 2, increment key counter and assign initial and final position if z>0
35. check for keypressed==0b00010100
a.  if yes display 1, increment key counter and assign initial and final position if z>0
36. check for keypressed==0b00011000
a.  if yes display “ ”, increment key counter and assign initial and final position if z>0
37. check for keypressed==0b00100001
a.  if yes display 6, increment key counter and assign initial and final position if z>0
38. check for keypressed==0b00100010
a.  if yes display 5, increment key counter and assign initial and final position if z>0
39. check for keypressed==0b00100100
a.  if yes display 4, increment key counter and assign initial and final position if z>0
40. check for keypressed==0b00101000
a.  if yes display “ ”, increment key counter and assign initial and final position if z>0
41. check for keypressed==0b01000001
a.  if yes display 9, increment key counter and assign initial and final position if z>0
42. check for keypressed==0b01000010
a.  if yes display 8, increment key counter and assign initial and final position if z>0
43. check for keypressed==0b01000100
a.  if yes display 7, increment key counter and assign initial and final position if z>0
44. check for keypressed==0b01001000
a.  if yes display “ ”, increment key counter and assign initial and final position if z>0
45. check for keypressed==0b10000001
a.  if yes display #, increment key counter and assign initial and final position if z>0
46. check for keypressed==0b10000010
a.  if yes display 0, increment key counter and assign initial and final position if z>0
47. check for keypressed==0b10000100
a.  if yes display *, increment key counter and assign initial and final position if z>0
48. check for keypressed==0b10001000
a.  if yes display “ ”, increment key counter and assign initial and final position if z>0
49. reset keypressed to 0;//after showing integer erasing the row column memory
50. assign DDRA to DDRA bitwise XOR with 0b11111111 to make columns as inputs and rows as output
51. Delay for 10 ms
52. Power the rows
53. Delay for 50 ms
54. Increment z++;
55. If (z>1) break Infinite loop 2 else goto step 19;
56. Reset z to 0;
57. Continue Infinite loop 1
58. return(0);
59. end


void send_a_command(unsigned char command)
{
PORTB = command;
PORTD &= ~ (1<<RS); //putting 0 in RS to tell lcd we are sending command
PORTD |= 1<<E; //telling lcd to receive command /data at the port
_delay_ms(50);
PORTD &= ~1<<E;//telling lcd we completed sending data
PORTB= 0;
}
void send_a_character(unsigned char character)
{
PORTB= character;
PORTD |= 1<<RS;//telling LCD we are sending data not commands
PORTD |= 1<<E;//telling LCD to start receiving command/data
_delay_ms(50);
PORTD &= ~1<<E;//telling lcd we completed sending data/command
PORTB = 0;
}
void send_a_string(char *string_of_characters)
{
while(*string_of_characters > 0)
{
send_a_character(*string_of_characters++);
}
}




Code:

#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <compat/deprecated.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define E 5 //giving name “enable” to 5 pin of PORTD, since it Is connected to LCD enable pin
#define RS 6 //giving name “register selection” to 6 pin of PORTD, since is connected to LCD RS pin
void send_a_command(unsigned char command);
void send_a_character(unsigned char character);
void send_a_string(char *string_of_characters);
int main()
{
uint8_t a,b,c,p,q,r,s,i,f,z;
char buffer[16];
int key=0;//allocating integer to reset the LCD once it reaches its display limit
int keypressed=0;//integer for storing matrix value
DDRB = 0xFF;
DDRD = 0xFF;
_delay_ms(50);
i=f=z=0;
_delay_ms(50);//giving delay of 50ms
// make sure to make OC0 pin (pin PB3 for atmega32) as output pin
//putting portB and portD as output pins DDRD = 0xFF;
_delay_ms(50);//giving delay of 50ms
send_a_command(0x01); //Clear Screen 0x01 = 00000001
_delay_ms(50);
send_a_command(0x38);//telling lcd we are using 8bit command /data mode
_delay_ms(50);
send_a_command(0b00001111);//LCD SCREEN ON and courser blinking
DDRA=0xF0;//taking column pins as input and row pins as output
_delay_ms(1);
PORTA=0x0F;// powering the row ins
_delay_ms(1);
while(1)// Infinite loop 1 starts
{
while(1)// Infinite loop 2 starts
       {
if (z>1)
{
       break;
}     
else if (z>0)
{
send_a_command(0x80 + 0x40 +0);//move courser to second line.
_delay_ms(50);
send_a_string("Stop ");//display string
}
else
{
send_a_command(0x01);//clear lcd
_delay_ms(50);
send_a_command(0x80 +0);//move courser to first line.
_delay_ms(50);
send_a_string("Start ");//display string
}
while (1)//   Infinite loop 3 starts
{
if (bit_is_clear(PINA,0)|bit_is_clear(PINA,1)|bit_is_clear(PINA,2))//in any of column pins goes low execute the loop
{
       if(bit_is_clear(PINA,0))
       a=1<<PA0;
       else a=0;
       if (bit_is_clear(PINA,1))
       b=1<<PA1;
       else b=0;
       if (bit_is_clear(PINA,2))
       c=1<<PA2;
       else c=0;
       if (a>0)
       keypressed=a;
       else if (b>0)
       keypressed=b;
       else if (c>0)
       keypressed=c;
itoa(keypressed,buffer,16);
send_a_string(buffer);
//_delay_ms(1);
send_a_string("-");
//_delay_ms(1);
break;
}
}//    Infinite loop 3 stops
PORTA=0xFF;
_delay_ms(50);
DDRA ^=0b11111111;//making rows as inputs and columns as output
_delay_ms(10);
PORTA = 0xF0;//powering columns
_delay_ms(50);
       while(1)//    Infinite loop 4 starts
       {
       if (bit_is_clear(PINA,4)|bit_is_clear(PINA,5)|bit_is_clear(PINA,6)|bit_is_clear(PINA,7))
       {
       if(bit_is_clear(PINA,4))
       p=1<<PA4;
       else p=0;
       if (bit_is_clear(PINA,5))
       q=1<<PA5;
       else q=0;
       if (bit_is_clear(PINA,6))
       r=1<<PA6;
       else r=0;
       if (bit_is_clear(PINA,7))
       s=1<<PA7;
       else s=0;
       break;
       }
       }             //     Infinite loop 4 stops
       if (p>0)
       keypressed|=p;
       else if (q>0)
       keypressed|=q;
       else if (r>0)
       keypressed|=r;
       else if (s>0)
       keypressed|=s;
itoa(keypressed,buffer,16);
send_a_string(buffer);
_delay_ms(1);
send_a_string("/");
_delay_ms(1);
if (keypressed==0b00010001)//
{
send_a_string("3");//if row1 and column1 is high show “1”
key++;
if(z>0)
f=3;
else i=3;
}
if (keypressed==0b00010010)
{
send_a_string("2");// if row1 and column2 is high show “4”
key++;
if(z>0)
f=2;
else i=2;
}
if (keypressed==0b00010100)
{
send_a_string("1");// if row1 and column3 is high show “7”
key++;
if(z>0)
f=1;
else i=1;
}
if (keypressed==0b00011000)
{
send_a_string(" ");//if row1 and column4 is high show “*”
key++;
}
if (keypressed==0b00100001)
{
send_a_string("6");// if row2 and column1 is high show “2”
key++;
if(z>0)
f=6;
else i=6;
}
if (keypressed==0b00100010)
{
send_a_string("5");// if row2 and column2 is high show “5”
key++;
if(z>0)
f=5;
else i=5;
}
if (keypressed==0b00100100)
{
send_a_string("4");// if row2 and column3 is high show “8”
key++;
if(z>0)
f=4;
else i=4;
}
if (keypressed==0b00101000)
{
send_a_string(" ");// if row2 and column4 is high show “0”
key++;
}
if (keypressed==0b01000001)
{
send_a_string("9");
key++;
if(z>0)
f=9;
else i=9;
}
if (keypressed==0b01000010)
{
send_a_string("8");
key++;
if(z>0)
f=8;
else i=8;
}
if (keypressed==0b01000100)
{
send_a_string("7");
key++;
if(z>0)
f=7;
else i=7;
}
if (keypressed==0b01001000)
{
send_a_string(" ");
key++;
}
if (keypressed==0b10000001)
{
send_a_string("#");
key++;
}
if (keypressed==0b10000010)
{
send_a_string("0");
key++;
}
if (keypressed==0b10000100)
{
send_a_string("*");
key++;
}
if (keypressed==0b10001000)
{
send_a_string(" ");
key++;
}
keypressed=0;//after showing integer erasing the row column memory
PORTA=0xFF;
_delay_ms(500);
DDRA ^=0b11111111;//shifting input and power port
_delay_ms(10);
PORTA = 0x0F;//powering row pins of keypad
_delay_ms(50);
z++;
if(z>1)
{
       break;
}
}//    Infinite loop 2 stops
z=0;
}      //     Infinite loop 1 stops
return(0);          
}
      
void send_a_command(unsigned char command)
{
PORTB = command;
PORTD &= ~ (1<<RS); //putting 0 in RS to tell lcd we are sending command
PORTD |= 1<<E; //telling lcd to receive command /data at the port
_delay_ms(50);
PORTD &= ~1<<E;//telling lcd we completed sending data
PORTB= 0;
}
void send_a_character(unsigned char character)
{
PORTB= character;
PORTD |= 1<<RS;//telling LCD we are sending data not commands
PORTD |= 1<<E;//telling LCD to start receiving command/data
_delay_ms(50);
PORTD &= ~1<<E;//telling lcd we completed sending data/command
PORTB = 0;
}
void send_a_string(char *string_of_characters)
{
while(*string_of_characters > 0)
{
send_a_character(*string_of_characters++);
}

}

1 comment:

  1. How to Win with Premium Picks Soccer Betting Tips 메리트 카지노 주소 메리트 카지노 주소 메리트 카지노 쿠폰 메리트 카지노 쿠폰 312Sporting Life Best Bets of the Day - FABLBASINO

    ReplyDelete