Yamian

lcd.c (LCD16x2-Showtime)

Mar 16th, 2016 (edited)
403
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.42 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <ctype.h>
  3. #include "lcd.h" //Cau hinh ket noi va khai bao lenh dung cho LCD.
  4. void lcd_init()
  5. {
  6.     //Khai bao bien.
  7.     unsigned char i;
  8.     //Dinh nghia ham.  
  9.     LCD_EN_TRIS=0; //Cau hinh ngo ra cac duong dieu khien.
  10.     LCD_RS_TRIS=0;
  11.     LCD_RW_TRIS=0;
  12.     LCD_DATA4_TRIS=0; //Cau hinh ngo ra cho cac duong du lieu.
  13.     LCD_DATA5_TRIS=0;
  14.     LCD_DATA6_TRIS=0;
  15.     LCD_DATA7_TRIS=0;
  16.     LCD_EN=0; //EN=0 - Disable.
  17.     LCD_RS=0; //RS=0 - Command.
  18.     LCD_RW=0; //RW=0 - Write.
  19.     __delay_ms(100); //Tao thoi gian tre khi bat nguon cho LCD.
  20.     //Reset LCD.
  21.     lcd_put_byte(0,0x30);
  22.     __delay_ms(50);
  23.     lcd_put_byte(0,0x30);
  24.     __delay_ms(50);
  25.     lcd_put_byte(0,0x32);
  26.     __delay_ms(100); //Tao tre de reset LCD.
  27.     __delay_ms(100);
  28.     __delay_ms(100);
  29.     while(lcd_busy());
  30.     lcd_put_byte(0,FOUR_BIT&LINES_5X7); //Thiet lap loai LCD.
  31.     while(lcd_busy());
  32.     lcd_put_byte(0,DOFF&CURSOR_OFF&BLINK_OFF); //Tat hien thi.
  33.     while(lcd_busy());
  34.     lcd_put_byte(0,DON&CURSOR_OFF&BLINK_OFF); //Bat hien thi.
  35.     while(lcd_busy());
  36.     lcd_put_byte(0,0x01); //Xoa hien thi va di chuyen con tro ve dau dong.
  37.     while(lcd_busy());
  38.     lcd_put_byte(0,SHIFT_CUR_LEFT); //Che do dich chuyen con tro.
  39.     while(lcd_busy());
  40.     lcd_put_byte(0,0x01); //Xoa hien thi va di chuyen con tro ve dau dong.
  41.     while(lcd_busy());
  42. }
  43. unsigned char lcd_busy()
  44. {
  45.     //Khai bao bien.
  46.     unsigned char busy;
  47.     //Dinh nghia ham.
  48.     LCD_DATA4_TRIS=1; //Cau hinh ngo vao cho cac duong du lieu.
  49.     LCD_DATA5_TRIS=1;
  50.     LCD_DATA6_TRIS=1;
  51.     LCD_DATA7_TRIS=1;
  52.     LCD_RW=1; //RW=1 - Read.
  53.     LCD_RS=0; //RS=0 - Command.
  54.     __delay_us(20);
  55.     LCD_EN=1; //EN=1 - Enable.
  56.     __delay_us(20);
  57.     busy=LCD_DATA7; //Doc gia tri co bao ban tu LCD.
  58.     LCD_EN=0; //EN=0 - Disable.
  59.     __delay_us(20);
  60.     LCD_EN=1; //EN=1 - Enable. Tao xung truyen thong tin.
  61.     __delay_us(20);
  62.     LCD_EN=0; //EN=0 - Disable.
  63.     return busy; //Tra ve gia tri bao LCD ban hay khong (1: Busy).
  64. }
  65. unsigned char lcd_get_byte(unsigned char rs)
  66. {
  67.     //Khai bao bien.
  68.     BYTE_VAL b; //Bien chua gia tri doc ve tu LCD.
  69.     //Dinh nghia ham.
  70.     LCD_DATA4_TRIS=1; //Cau hinh ngo vao cho cac duong du lieu.
  71.     LCD_DATA5_TRIS=1;
  72.     LCD_DATA6_TRIS=1;
  73.     LCD_DATA7_TRIS=1;
  74.     LCD_RW=1; //RW=1 - Read.
  75.     LCD_RS=0; //RS=0 - Command. Mac dinh la doc Command.
  76.     if (rs) LCD_RS=1; //Kiem tra yeu cau doc Data (rs=1) hay doc Command (rs=0).
  77.     //RS=1 - Data. Neu chon lua doc Data.
  78.     __delay_us(20);
  79.     LCD_EN=1; //EN=1 - Enable. Doc 4 bit cao cua thong tin can doc tu LCD.
  80.     __delay_us(20);
  81.     b.bits.b7=LCD_DATA7; //Doc 4 bit cao.
  82.     b.bits.b6=LCD_DATA6;
  83.     b.bits.b5=LCD_DATA5;
  84.     b.bits.b4=LCD_DATA4;
  85.     LCD_EN=0; //EN=0 - Disable.
  86.     __delay_us(20);
  87.     LCD_EN=1; //EN=1 - Enable. Doc 4 bit thap cua thong tin can doc tu LCD.
  88.     __delay_us(20);
  89.     b.bits.b3=LCD_DATA7; //Doc 4 bit thap.
  90.     b.bits.b2=LCD_DATA6;
  91.     b.bits.b1=LCD_DATA5;
  92.     b.bits.b0=LCD_DATA4;
  93.     LCD_EN=0; //EN=0 - Disable.
  94.     return b.Val; //Tra ve gia tri doc duoc tu LCD (8 bit).
  95. }
  96. void lcd_put_byte(unsigned char rs,unsigned char b)
  97. {
  98.     //Khai bao bien.
  99.     BYTE_VAL temp; //Bien luu tam thong tin.
  100.     //Dinh nghia ham.
  101.     LCD_DATA4_TRIS=0; //Cau hinh ngo ra cho cac duong du lieu.
  102.     LCD_DATA5_TRIS=0;
  103.     LCD_DATA6_TRIS=0;
  104.     LCD_DATA7_TRIS=0;
  105.     LCD_RS=0; //RS=0 - Command. Mac dinh la ghi Command.
  106.     if(rs)
  107.         LCD_RS=1; //Kiem tra yeu cau ghi Data (rs=1) hay ghi Command (rs=0).
  108.     //RS=1 - Data. Neu chon lua ghi Data.
  109.     __delay_us(20);
  110.     LCD_RW=0; //RW=0 - Write.
  111.     __delay_us(20);
  112.     LCD_EN=0; //EN=0 - Disable.
  113.     temp.Val=b; //Lay gia tri thong tin can ghi vao LCD.
  114.     LCD_DATA4=temp.bits.b4; //Gui 4 bit cao len bus.
  115.     LCD_DATA5=temp.bits.b5;
  116.     LCD_DATA6=temp.bits.b6;
  117.     LCD_DATA7=temp.bits.b7;
  118.     __delay_us(20);
  119.     LCD_EN= 1; //EN=1 - Enable. Ghi 4 bit cao cua thong tin vao LCD.
  120.     __delay_us(20);
  121.     LCD_EN=0; //EN=0 - Disable.
  122.     LCD_DATA4=temp.bits.b0; //Gui 4 bit thap len bus.
  123.     LCD_DATA5=temp.bits.b1;
  124.     LCD_DATA6=temp.bits.b2;
  125.     LCD_DATA7=temp.bits.b3;
  126.     __delay_us(20);
  127.     LCD_EN=1; //EN=1 - Enable. Ghi 4 bit thap cua thong tin vao LCD.
  128.     __delay_us(20);
  129.     LCD_EN=0; //EN=0 - Disable.
  130. }
  131. void lcd_putc(char c)
  132. {
  133.     //Dinh nghia ham.
  134.     switch(c)
  135.     {
  136.         case '\f': //Chuc nang xoa hien thi.
  137.         {
  138.             lcd_put_byte(0,0x01); //Goi ham truyen thong tin (lenh) sang C.LCD.
  139.             while(lcd_busy()); //Kiem tra LCD bao ban.
  140.             break; //Lenh: Xoa hien thi tren man hinh C.LCD (0x01).
  141.         }
  142.         case '\n': //Chuc nang bat dau hang thu 2.
  143.         {
  144.             lcd_gotoxy(0,1); //Goi ham truyen thong tin (du lieu) sang C.LCD.
  145.             break;
  146.         }
  147.         case '\b': //Chuc nang lui ve 1 vi tri.
  148.         {
  149.             lcd_put_byte(0,0x10); //Goi ham truyen thong tin (lenh) sang C.LCD.
  150.             while(lcd_busy()); //Kiem tra LCD bao ban.
  151.             break; //Lenh: Doi con tro sang trai (0x10).
  152.         }
  153.         default: //Hien thi tat ca ky tu mac dinh trong LCD (c: dia chi HEX cua ky tu)
  154.         {
  155.             lcd_put_byte(1,c); //Gui thong tin sang LCD de hien thi tai toa do da xac dinh.
  156.             while(lcd_busy()); //Kiem tra LCD bao ban.
  157.             break;
  158.         }
  159.     }
  160. }
  161. void putch(char c)
  162. {
  163.     lcd_putc(c);
  164. }
  165. void lcd_gotoxy(unsigned char col,unsigned char row)
  166. {
  167.     //Khai bao bien.
  168.     unsigned char address;
  169.     //Dinh nghia ham.
  170.     if(row!=0) //Kiem tra hang hien thi de tao dia chi hien thi hang.
  171.         address=0x40; //Ma dieu khien hien thi hang 2.
  172.     else
  173.         address=0x00; //Ma dieu khien hien thi hang 1.
  174.     address+=col; //Ket hop gia tri hang va cot de tao ra dia chi hien thi.
  175.     lcd_put_byte(0,0x80|address); //Gui lenh xac dinh toa do hien thi tren LCD.
  176.     while(lcd_busy()); //Kiem tra LCD bao ban.
  177. }
  178. void lcd_puts(const char *s)
  179. {
  180.     //Dinh nghia ham.
  181.     while(*s)
  182.         lcd_putc(*s++);
  183. }
Add Comment
Please, Sign In to add comment