當前位置:編程學習大全網 - 編程語言 - c語言編壹段小程序,在液晶屏上實現顯示"ABCD1234".用單片機AT 89c51

c語言編壹段小程序,在液晶屏上實現顯示"ABCD1234".用單片機AT 89c51

#include<reg51.h> //包含單片機寄存器的頭文件

#include<intrins.h> //包含_nop_()函數定義的頭文件

sbit RS=P2^5; //寄存器選擇位,將RS位定義為P2.5引腳

sbit RW=P2^6; //讀寫選擇位,將RW位定義為P2.6引腳

sbit EN=P2^7; //使能信號位,將EN位定義為P2.7引腳

sbit BF=P0^7; //忙碌標誌位,,將BF位定義為P0.7引腳

unsigned char code string[ ]={"ABCD1234"}; //字符串數組,存儲待顯示的字符串

/*****************************************************

函數功能:延時1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒

***************************************************/

void delay1ms()

{

unsigned char i,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

/*****************************************************

函數功能:延時若幹毫秒

入口參數:n

***************************************************/

void delay(unsigned char n)

{

unsigned char i;

for(i=0;i<n;i++)

delay1ms();

}

/*****************************************************

函數功能:判斷液晶模塊的忙碌狀態

返回值:result。result=1,忙碌;result=0,不忙

***************************************************/

unsigned char BusyTest(void)

{

bit result;

RS=0; //根據規定,RS為低電平,RW為高電平時,可以讀狀態

RW=1;

EN=1; //EN=1,才允許讀寫

_nop_(); //空操作

_nop_();

_nop_();

_nop_(); //空操作四個機器周期,給硬件反應時間

result=BF; //將忙碌標誌電平賦給result

EN=0;

return result;

}

/*****************************************************

函數功能:將模式設置指令或顯示地址寫入液晶模塊

入口參數:dictate

***************************************************/

void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

RS=0; //根據規定,RS和R/W同時為低電平時,可以寫入指令

RW=0;

EN=0; //EN置低電平(根據表8-6,寫指令時,EN為高脈沖,

//就是讓EN從0到1發生正跳變,所以應先置"0"

_nop_();

_nop_(); //空操作兩個機器周期,給硬件反應時間

P0=dictate; //將數據送入P0口,即寫入指令或地址

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四個機器周期,給硬件反應時間

EN=1; //EN置高電平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四個機器周期,給硬件反應時間

EN=0; //當EN由高電平跳變成低電平時,液晶模塊開始執行命令

}

/*****************************************************

函數功能:指定字符顯示的實際地址

入口參數:x

***************************************************/

void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"

}

/*****************************************************

函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊

入口參數:y(為字符常量)

***************************************************/

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1; //RS為高電平,RW為低電平時,可以寫入數據

RW=0;

EN=0; //EN置低電平(根據表8-6,寫指令時,EN為高脈沖,

//就是讓EN從0到1發生正跳變,所以應先置"0"

P0=y; //將數據送入P0口,即將數據寫入液晶模塊

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四個機器周期,給硬件反應時間

EN=1; //EN置高電平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四個機器周期,給硬件反應時間

EN=0; //當EN由高電平跳變成低電平時,液晶模塊開始執行命令

}

/*****************************************************

函數功能:對LCD的顯示模式進行初始化設置

***************************************************/

void LcdInitiate(void)

{

delay(15); //延時15ms,首次寫指令時應給LCD壹段較長的反應時間

WriteInstruction(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數據接口

delay(5); //延時5ms 

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x0f); //顯示模式設置:顯示開,有光標,光標閃爍

delay(5);

WriteInstruction(0x06); //顯示模式設置:光標右移,字符不移

delay(5);

WriteInstruction(0x01); //清屏幕指令,將以前的顯示內容清除

delay(5);

}

void main(void) //主函數

{

unsigned char i;

LcdInitiate(); //調用LCD初始化函數

delay(10);

while(1)

{

WriteInstruction(0x01); //清顯示:清屏幕指令

WriteAddress(0x00); //設置顯示位置為第1行的第1個字。1602型LCD字符顯示器在第1個地址顯示完畢後,能自動指向下壹地址,

//因此只要制定字符串的第1個字符的顯示地址即可。

i = 0;

while(string[i] != '\0')

{ //顯示字符

WriteData(string[i]);

i++;

delay(150);

}

for(i=0;i<4;i++)

delay(250);

}

}

  • 上一篇:別克昂科拉自動換擋圖解昂科拉換擋操作技巧
  • 下一篇:如何寫出較好的css
  • copyright 2024編程學習大全網