51微控制器1602液晶顯示移動顯示
阿新 • • 發佈:2019-01-10
#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); } }