Code LCD 16x2
code được tạo thành một file include để sử dụng LCD 16x2 dùng CCS
// Lcd 16x2 in 4 bit mode
// based on available file LCD.c in drivers folder
// As defined in the structure, pin connection is as follows:
// On LCD, pins B0-B3 are not used and RW is not used.
// Last update 2021 by Tuan Anh
//
//Connecting
// PIC LCD
// PIN_A1 RS
// PIN_A2 RW
// PIN_A3 E
//
// PIN_D4 DB4
// PIN_D5 DB5
// PIN_D6 DB6
// PIN_D7 DB7
//
//Function:
//lcd_init()
//lcd_gotoxy()
//lcd_print_Hex: in ra so hex 2 ky tu
//lcd_print_num: in ra so nguyen 4 ky tu
//lcd_putc(): in ra chuoi, neu muon in ra ky tu so can +0x30
//
#ifndef DB4
#define rs PIN_A1
#define RW PIN_A2
#define enabled PIN_A3
#define DB4 PIN_D4
#define DB5 PIN_D5
#define DB6 PIN_D6
#define DB7 PIN_D7
#endif
char const lcd_type=2;
char const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
//=======================================
void make_out_data(char buffer_data)
{
output_bit(DB4,bit_test(buffer_data,0));
output_bit(DB5,bit_test(buffer_data,1));
output_bit(DB6,bit_test(buffer_data,2));
output_bit(DB7,bit_test(buffer_data,3));
}
//===================================
void lcd_send_nibble(char buffer_nibble)
{
output_low(RW);
make_out_data(buffer_nibble);
delay_us(10);
output_high(enabled);
delay_us(10);
output_low(enabled);
}
//====================================
void lcd_send_byte( char address, char n )
{
output_low(rs); //rs= = 0;
delay_ms(1);
output_bit(rs,address);//lcd.rs = address;
delay_us(20);
delay_us(20);
output_low(enabled);//lcd.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
//===============================================
void lcd_init()
{
char i;
output_low(rs); //lcd.rs = 0;
output_low(enabled);
delay_ms(200);
for(i=1;i<=3;++i)
{
lcd_send_nibble(3);
delay_ms(10);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}
//================================================
void lcd_gotoxy( char x, char y)
{
char address;
switch(y) {
case 1 : address=0x80;break;
case 2 : address=0xc0;break;
case 3 : address=0x94;break;
case 4 : address=0xd4;break;
}
address=address+(x-1);
lcd_send_byte(0,0x80|address);
}
//=================================================
void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2); break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}
//=================================================
int LHEX(unsigned long data){
return data&0x0F;
}
int HHEX(unsigned long data){
return data>>4;
}
void lcd_print_num(unsigned long num){
int tram,chuc,donvi,ngan;
donvi=num%10;
chuc=num/10%10;
tram=num/100%10;
ngan=num/1000;
lcd_putc(ngan+0x30);
lcd_putc(tram+0x30);
lcd_putc(chuc+0x30);
lcd_putc(donvi+0x30);
}
void lcd_print_Hex(unsigned long data){
if(HHEX(data)<0x0A) lcd_putc(HHEX(data)+0x30);
else {
switch (HHEX(data)){
case 0x0A:
printf(lcd_putc,"A");
break;
case 0x0B:
printf(lcd_putc,"B");
break;
case 0x0C:
printf(lcd_putc,"C");
break;
case 0x0D:
printf(lcd_putc,"D");
break;
case 0x0E:
printf(lcd_putc,"E");
break;
case 0x0F:
printf(lcd_putc,"F");
break;
}
}
if(LHEX(data)<0x0A) lcd_putc(LHEX(data)+0x30);
else {
switch (LHEX(data)){
case 0x0A:
printf(lcd_putc,"A");
break;
case 0x0B:
printf(lcd_putc,"B");
break;
case 0x0C:
printf(lcd_putc,"C");
break;
case 0x0D:
printf(lcd_putc,"D");
break;
case 0x0E:
printf(lcd_putc,"E");
break;
case 0x0F:
printf(lcd_putc,"F");
break;
}
}
}