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;

      }

   }

}