1. 程式人生 > >51微控制器1602液晶顯示移動顯示

51微控制器1602液晶顯示移動顯示

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;//暫存器選擇位
sbit RW=P2^1;//讀寫選擇位
sbit E=P2^2; //使能訊號位
sbit BF=P0^7;//忙碌標誌位
uchar table1[]={"  HELLOW WORLD"};
/**************
函式功能:延時函式1秒
*******************/
void delaylms()
{
 uchar i,j;
 for(i=0;i<10;i++)
  for(j=0;j<33;j++);
}
/*********
函式功能:延時若干秒***
*******入口引數:n
*****************/
void delay(uchar n)
{
 uchar 	i;
 for(i=0;i<n;i++)
  delaylms();
}
/******
函式功能;判斷液晶模組的忙碌狀態
返回值:result。result=1,忙碌;result=0,不忙碌**********/
uchar busytest(void)
{
 bit result;
 RS=0;	//RS為低電平RW為高電平,可以讀狀態
 RW=1;
 E=1;	//E=1允許寫
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 result=BF;
 E=0;
 return result;
}
/*********
函式功能:將模式設定指令或顯示地址寫入液晶模組
入口引數:dictate******************/
void writeinstruction(uchar dictate)
{
 while(busytest()==1);
 RS=0; //RS,RW同時為0時,可以寫入指令
 RW=0;
 E=0; //寫指令時E為高脈衝,寫指令就是讓脈衝從0到1發生跳變
 _nop_();
 _nop_();
 P0=dictate;//將資料寫入P0口,即寫入指令或地址
 _nop_();
 _nop_();
 _nop_();
 _nop_();//四個空週期,給機器足夠的反應時間
 E=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 E=0; //當E由1到0時液晶模組開始執行命令
}
/********函式功能:指定字元顯示的實際地址
入口引數:x**************/
void writeaddress(uchar x)
{
  writeinstruction(x|0x80);
}
/********函式功能:將資料(字元的ASCII碼)寫入字元模組
入口函式:y*******************/
void writedate(uchar y)
{
 while(busytest()==1);
 RS=1;//RS為高電平,RW為低電平可以寫入資料
 RW=0;
 E=0;  
 P0=y;//將資料寫入液晶模組
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 E=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 E=0;

}
/********函式的功能:對液晶的顯示功能進行初始化設定**************/
void lcdinitate()
{
 delay(15);//延時15秒
 writeinstruction(0x38);//設定顯示模式16*2顯示,5*7點陣,8位資料介面
 delay(5);
 writeinstruction(0x38);//設定顯示模式16*2顯示,5*7點陣,8位資料介面
 delay(5);
 writeinstruction(0x38);//設定顯示模式16*2顯示,5*7點陣,8位資料介面
 delay(5);
 writeinstruction(0x0f);//設定顯示模式:顯示開有游標游標閃爍
 writeinstruction(0x06);//設定顯示模式:游標右移字元不移
 delay(5);
 writeinstruction(0x01);//清屏指令
 delay(5);
}
void main(void)
{
 uchar i;
 lcdinitate();
 delay(10);
 while(1)
 {
  writeinstruction(0x01);
  writeaddress(0x00);//設定顯示位置為第一行的第五個字
  i=0;
  while(table1[i]!='\0')
  {
   writedate(table1[i]);
   
   i++;
   delay(150);
  }
  for(i=0;i<4;i++)
   delay(250);
  
 }
}