LCD Interfacing:
In this tutorial i will show you how to interface 16x2 LCD with micro-controller. 16x2 means there are two rows and each row contain maximum 16 characters.
For more detail refer to the LCD datasheet, which you are using.
Basic Connection:
Applies 5v to pin 2 and gnd to pins 1 & 5. Use variable resistor at pin 3 to set contrast. Pins 7 to 14 are the data pins,, used to send/rec data. Pin 6 is of enable; every time when you write to lcd you should have to give high to low, to this pin. pin 4 is register select pin use to give commands like clear, home etc.
In this tutorial i will interface lcd in 4-bit instead of 8-bit, so we only required four data pins.
Code:
Lets write a code that will display the motor status and its direction; it will be fun!!!!
Requirements:
Design a motor controller circuit using l298 and display its status on lcd. LCD is connected to portb and motor controller circuit is at portd. Required two switches to change motor direction; if both are open/close the motor should remain off. Also the switches are connected to portd.
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
char txt3[] = "Motor Direction";
char txt2[] = "Clock Wise ";
char txt1[] = "Counter C.W";
char txt[] = "Motor Off ";
void main() {
/////// comment for 877//////////////////
ansel=0;
anselh=0;
c1on_bit=0;
c2on_bit=0;
///////////////////////////////////////
trisd0_bit=0;
trisd1_bit=0;
trisd2_bit=0;
trisd3_bit=1; // CW dir
trisd4_bit=1; //CCW dir
Lcd_Init(); // lcd ini
Lcd_Cmd(_LCD_CLEAR); //lcd clear
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1){
Lcd_Out(1,1,txt3); //1row 1col
delay_ms(500);
if(rd3_bit){
Lcd_Out(2,1,txt2);
rd1_bit=0;
rd0_bit=1;
}
if(rd4_bit){
Lcd_Out(2,1,txt1);
rd0_bit=0;
rd1_bit=1;
}
if(rd3_bit & rd4_bit){ //invalid selction
lcd_out(2,1,txt);
rd0_bit=0; //to stop motor
rd1_bit=0;
}
if(!rd3_bit & !rd4_bit){ //inv sec
lcd_out(2,1,txt);
rd0_bit=0;
rd1_bit=0;
}
}
}
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
char txt3[] = "Motor Direction";
char txt2[] = "Clock Wise ";
char txt1[] = "Counter C.W";
char txt[] = "Motor Off ";
void main() {
/////// comment for 877//////////////////
ansel=0;
anselh=0;
c1on_bit=0;
c2on_bit=0;
///////////////////////////////////////
trisd0_bit=0;
trisd1_bit=0;
trisd2_bit=0;
trisd3_bit=1; // CW dir
trisd4_bit=1; //CCW dir
Lcd_Init(); // lcd ini
Lcd_Cmd(_LCD_CLEAR); //lcd clear
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1){
Lcd_Out(1,1,txt3); //1row 1col
delay_ms(500);
if(rd3_bit){
Lcd_Out(2,1,txt2);
rd1_bit=0;
rd0_bit=1;
}
if(rd4_bit){
Lcd_Out(2,1,txt1);
rd0_bit=0;
rd1_bit=1;
}
if(rd3_bit & rd4_bit){ //invalid selction
lcd_out(2,1,txt);
rd0_bit=0; //to stop motor
rd1_bit=0;
}
if(!rd3_bit & !rd4_bit){ //inv sec
lcd_out(2,1,txt);
rd0_bit=0;
rd1_bit=0;
}
}
}
This is the simple code according to out requirement. To interface the LCD you must have to specify the port (port i/o), as well as the sfr of that port, you are using 'sbit LCD_RS at RB4_bit' and 'sbit LCD_RS_Direction at TRISB4_bit' doing this job. As we are using LCD in four bit so, just specify the four data pins (pins 11 to 14 of LCD), E and RS pins.
txt1 to txt3 are the character array containing the message you want to display. Pins 0, 1, and 2 of portD is configure as o/p whereas pins 3, and 4 as i/p. L298 is connected to the pins0-2 and switches are at pins 3 and 4.
After setting the pins for LCD we used Lcd_Init(); a mikroc lcd library function, to initialize the LCD. Lcd_Cmd(char) is used to send commands to LCD like clear screen, curs0r off etc.
Lcd_Out(char row, char column, char *text); Prints text on Lcd starting from specified position; 1, 1 means first row and first column. Then a simple logic off switches and their functions.
L298 Connections:
Important thing is the connection of l298, as we are using out1 & out2 so we have to use in1 & in2, also have to enable ena pin for these selections. Use a 10 ohm resistor to connect between sensa pin and ground. Apply 9/12v to VCC, pin 9, depending on your motor voltage and 5v at pin 4, VC. To change to direction just change the bit value of in1 and in2; or in other words swap these values. If the both have same value, 0 or 1, motor will not rotate; as potential is same, current can't flow!!.
Schematic:
motor controller |
Comments
Post a Comment