1. 程式人生 > >51微控制器——LCD1602

51微控制器——LCD1602

微控制器——1602液晶

宗旨:技術的學習是有限的,分享的精神是無限的。

 

11602液晶讀寫時序

(1)、讀狀態

       RS=L,R/W=H,E=H。(判斷忙完畢後釋放匯流排)

(2)、讀資料

       RS=H,R/W=H,E=H。

(3)、寫指令

  RS=L,R/W=L,D0~D7=指令碼,E=高脈衝

(4)、寫資料

        RS=H,R/W=L,D0~D7=資料,E=高脈衝

2、液晶顯示驅動檔案

#include <reg52.h>

#define LCD1602_DB  P0
sbit LCD1602_RS = P1 ^ 0;
sbit LCD1602_RW = P1 ^ 1;
sbit LCD1602_E  = P1 ^ 5;

/* 等待液晶準備好 */
void LcdWaitReady()
{
  unsigned char sta;

  LCD1602_DB = 0xFF;
  LCD1602_RS = 0;
  LCD1602_RW = 1;
  do
  {
    LCD1602_E = 1;
    sta = LCD1602_DB; //讀取狀態字
    LCD1602_E = 0;
  }
  while (sta & 0x80);   //bit7等於1表示液晶正忙,重複檢測直到其等於0為止
}
/* 向LCD1602液晶寫入一位元組命令,cmd-待寫入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
  LcdWaitReady();
  LCD1602_RS = 0;
  LCD1602_RW = 0;
  LCD1602_DB = cmd;
  LCD1602_E  = 1;
  LCD1602_E  = 0;
}
/* 向LCD1602液晶寫入一位元組資料,dat-待寫入資料值 */
void LcdWriteDat(unsigned char dat)
{
  LcdWaitReady();
  LCD1602_RS = 1;
  LCD1602_RW = 0;
  LCD1602_DB = dat;
  LCD1602_E  = 1;
  LCD1602_E  = 0;
}
/* 設定顯示RAM起始地址,亦即游標位置,(x,y)-對應螢幕上的字元座標 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
  unsigned char addr;

  if (y == 0)  //由輸入的螢幕座標計算顯示RAM的地址
  {
    addr = 0x00 + x;  //第一行字元地址從0x00起始
  }
  else
  {
    addr = 0x40 + x;  //第二行字元地址從0x40起始
  }
  LcdWriteCmd(addr | 0x80);  //設定RAM地址
}
/* 在液晶上顯示字串,(x,y)-對應螢幕上的起始座標,str-字串指標 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
  LcdSetCursor(x, y);   //設定起始地址
  while (*str != '\0')  //連續寫入字串資料,直到檢測到結束符
  {
    LcdWriteDat(*str++);
  }
}
/* 初始化1602液晶 */
void InitLcd1602()
{
  LcdWriteCmd(0x38);  //16*2顯示,5*7點陣,8位資料介面
  LcdWriteCmd(0x0C);  //顯示器開,游標關閉
  LcdWriteCmd(0x06);  //文字不動,地址自動+1
  LcdWriteCmd(0x01);  //清屏
}