LCD1602 畫(造)字




/***************************************************************************************************    
工程名稱:  1602自造字
功能描述:  實現1602液晶顯示,液晶第一行顯示"    Welcome     ",第二行顯示"     BV4WD      "。
自造字「向上箭頭」「順時鐘旋轉」圖樣,放在第一行兩側
第1个~第8个CGRAM地址分别时40H,48H,50H,58H,60H,68H,70H,78H
維護記錄:  2012-7-2
***************************************************************************************************/
#include <pic.h> //頭文件在HI-TECH安裝目錄下\HI-TECH Software\PICC\std\9.60\include

#define uchar unsigned char
#define uint  unsigned int

#define rs RD5           //命令/數據選擇
#define rw RD4           //讀寫口
#define e  RD3           //鎖存控制
#define Dataport PORTB   //數據口定義

uchar  dis1[18]={"    Welcome     "};     //顯示兩行
uchar  dis2[18]={"     BV4WD      "};
char  wod1[8];
//***********************************************************************************
//延時
//***********************************************************************************
void delay(uint time)
{
uint i,j;
for(i = 0;i < time; i++)
{
  for(j = 0;j < 30; j++);
    }
}
//***********************************************************************************
//IO初始化操作
//***********************************************************************************
void IO_init(void)
{
TRISB=0x00;       //RB設置為輸出
PORTB=0xff;       //初始化為高

TRISD=0x00;       //RD設置為輸出
PORTD=0xff;       //初始化為高
}
//**************************************************************************************************
//向LCD寫一命令
//**************************************************************************************************
wcode(uchar t)
{
  rs=0;           // 寫的是命令
  rw=0;           // 寫狀態
  e=1;            //使能
  Dataport=t;     //寫入命令 
  delay(20);      //等待寫入,如果時間太短,會導致液晶無法顯示
  e=0;            //數據的鎖定
}
//**************************************************************************************************
//向LCD寫一數據
//**************************************************************************************************
wdata(uchar t)
{
  rs=1;          // 寫的是數據
  rw=0;          // 寫狀態
  e=1;           //使能
  Dataport=t;    //寫入數據
  delay(20);     //等待寫入,如果時間太短,會導致液晶無法顯示
  e=0;           //數據的鎖定
}
//**************************************************************************************************
//寫入自造字 第一字 / 第二字
//**************************************************************************************************
w_oneword(void)
{
  uchar i;
//****** word 1 ****
wod1[0]=0b00000100;
wod1[1]=0b00001110;
wod1[2]=0b00010101;
wod1[3]=0b00010101;
wod1[4]=0b00000100;
wod1[5]=0b00000100;
wod1[6]=0b00000100;
wod1[7]=0b00000000;
  wcode(0x40);          //设定自定义字符的CGRAM地址//第1个~第8个CGRAM地址分别时40H,48H,50H,58H,60H,68H,70H,78H
  for(i=0;i<8;i++)     //循環8次,寫完1一個字
    {
      wdata(wod1[i]);   //寫入該行數據
    }
//****** word 2 ****
wod1[0]=0b00001110;
wod1[1]=0b00010001;
wod1[2]=0b00000101;
wod1[3]=0b00001001;
wod1[4]=0b00011111;
wod1[5]=0b00001000;
wod1[6]=0b00000100;
wod1[7]=0b00000000;
  wcode(0x48);          //設置第二字寫入地址
  for(i=0;i<8;i++)     //循環8次,寫完1一個字
    {
      wdata(wod1[i]);   //寫入該行數據
    }
}
//**************************************************************************************************
//LCD顯示第一行
//**************************************************************************************************
xian1(void)
{
  uchar i;
  wcode(0x80);          //設置第一行顯示地址
  for(i=0;i<16;i++)     //循環16次,寫完1行
    {
      wdata(dis1[i]);   //寫入該行數據
    }
}
//**************************************************************************************************
//LCD顯示第二行
//**************************************************************************************************
xian2(void)
{
   uchar i;
   wcode(0xc0);        //設置第二行顯示地址
   for(i=0;i<16;i++)   //循環16次,寫完1行
    {
      wdata(dis2[i]);  //寫入該行數據
    }
}
//**************************************************************************************************
//LCD 初始化
//**************************************************************************************************
InitLCD(void)
   {    
   wcode(0x01);  //清屏
   wcode(0x06);   //輸入方式控制,增量光標不移位
   wcode(0x0e);   //顯示開關控制
   wcode(0x38);   //功能設定:設置16x2顯示,5x7顯示,8位數據接口    
   }  
//**************************************************************************************************
//主函數
//**************************************************************************************************
main()
{  
   __CONFIG(XT&WDTDIS&LVPDIS);//配置,設置為晶振XT方式振蕩,禁看門狗,禁低電壓編程
   IO_init();                 //IO初始化 
   InitLCD();              //初始化1602
   w_oneword();
   while(1)                   //進入while死循環
      {
       wcode(0x01);          //清屏   
dis1[0]=0b00000000;
dis1[15]=0b00000001;
       xian1();              //顯示第一行   
       xian2();          //顯示第二行
       delay(5000);           //延時
      }   
}

ċ
main.c
(5k)
Kim Chen,
2012年7月2日 上午1:27
Comments