當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]   要實(shí)現(xiàn)對(duì)16x2點(diǎn)陣字符液晶模塊的高效控制,必須按照模塊設(shè)計(jì)方式,建立起相關(guān)的子程序,下面先詳細(xì)介紹驅(qū)動(dòng)16x2點(diǎn)陣字符液晶模塊的各功能子程序?! ?.寫(xiě)命令到LCM子函數(shù)  vOidLCDWriteCommand

 

  要實(shí)現(xiàn)對(duì)16x2點(diǎn)陣字符液晶模塊的高效控制,必須按照模塊設(shè)計(jì)方式,建立起相關(guān)的子程序,下面先詳細(xì)介紹驅(qū)動(dòng)16x2點(diǎn)陣字符液晶模塊的各功能子程序。

  1.寫(xiě)命令到LCM子函數(shù)

  vOidLCDWriteCommand(uchar CMD,uchar Attribc)

  /*函數(shù)名為WriteCommandLCM的寫(xiě)指令到LCM子函數(shù)。

  定義CMD、Attribc 為無(wú)符號(hào)字符型變量。*/

  {

  if(Attribc)WaitForEnable();

  /*若Arrribc為“真”,則調(diào)用WaitForEnable子函數(shù)進(jìn)行忙檢測(cè)*/

  LCM_RS_0;LCM_RW_0;_NOP0;

  /*選中指令寄存器,寫(xiě)模式*/

  DataPort=CMD;_NOP();

  /*將變量WCLCM中的指令傳送至數(shù)據(jù)口

  LCM_EN_1;_NOP0;_NOP();LCM_EN_O:

  /*LCM_EN端產(chǎn)生脈沖下降沿。*/

  }

  /*WriteCommandLCM 子函數(shù)結(jié)束。*/

  2,寫(xiě)數(shù)據(jù)到LCM子函數(shù)

  void LcdWritEDAta(dchar dataW)

  /*函數(shù)名為WriteDataLCM的寫(xiě)數(shù)據(jù)到LCM子函數(shù)。定義

  dataW 為無(wú)符號(hào)字符型變量。*/

  {

 ?。?WriteDataLCM子函數(shù)開(kāi)始。*/

  WaitForEnable(); */

  LCM_RS_1;LCM_RW_0;_NOP0;

  /*選中數(shù)據(jù)寄存器,寫(xiě)模式。*/

  DataPort=dataW;_NOP();

  /*將變量dataQW中數(shù)據(jù)傳送至數(shù)據(jù)口。*/

  LCM_EN_1;_NOP();_NOP0;LCM_EN_O:

  /*LCM_EN端產(chǎn)生脈沖下降沿。WriteDataLCM子函數(shù)

  結(jié)束*/

  3.檢測(cè)LCD忙信號(hào)子函數(shù)

  void WaitForEnable(void)

 ?。?函數(shù)名為WaitForEnable的檢測(cè)忙信號(hào)子程序子函數(shù)。

  /*WaitForEnable子函數(shù)開(kāi)始。*/

  uchar val;

  /*定義局部變量val。*/

  DataPOrt=Oxff;

  /*置數(shù)據(jù)口為全1。*/

  LCM_RS_0;LCM_RW_1;_NOP();

  /*選中指令寄存器,讀模式。*/

  LCM_EN_1;_NOP();_NOP();

  /*置LCM_EN端為高電平,讀使能。*/

  DDRA=0x00;

  /*數(shù)據(jù)口置為輸入*/

  val=PINA:

  /*讀取數(shù)據(jù)*/

  while(val&Busy)val=PINA:

  /*檢測(cè)忙信號(hào)。當(dāng)數(shù)據(jù)口內(nèi)容與0x80相與后不為零時(shí),

  程序原地踏步繼續(xù)讀取數(shù)據(jù)并檢測(cè)忙信號(hào)。*/

  LCM_EN_O:

  /*置LCM_EN端為低電平。*/

  DDRA=0xff;

  /*數(shù)據(jù)口置為輸出*/

  }

  /*WaitForEnable子函數(shù)結(jié)束。*/

  4.顯示光標(biāo)定位子函數(shù)

  voidLOCateXY(char posx.char posy)

  /*顯示光標(biāo)定位子函數(shù),函數(shù)名為L(zhǎng)ocareXY,定義posx,

  posxxy為字符型變量。*/

  {

  /*LocateXY子函數(shù)開(kāi)始。*/

  uchar temp;

  /*定義temp為無(wú)符號(hào)字符型變量。*/

  temp&=0x7f;

  /*temp的變化范圍0-15。*/

  temp=posx&0xof;

  /*屏蔽高4位。*/

  posy&=0x01;

  /*posy的變化范圍0-1。*/

  if(posy)tempㄧ=0x40;

  /*若posy為1(顯示第二行),地址碼+0x40*/

  tempㄧ=0x80;

  /*指令碼為地址碼+0x80。*/

  WriteCommandLCM(temp,0);

 ?。?將指令temp寫(xiě)入LCM,忽略忙信號(hào)檢測(cè)。*/

  }

  /*LocateXY子函數(shù)結(jié)束。*/

  5.顯示指定座標(biāo)的一個(gè)字符(x=0~15,y=0~1)子函數(shù)

  void DisplayOneChar(uchar x,uchar y,uchar Wdata)

  /*顯示指定座標(biāo)的一個(gè)字符(x=0-15.y=0-1)子函數(shù),函

  數(shù)名為DispOneChar,定義x、y、Wdata為無(wú)符號(hào)字符型變量。

  */

  {

  /*DispOneChar函數(shù)開(kāi)始*/

  LocateXY(x,y):

 ?。?調(diào)用LocateXY函數(shù)定位顯示地址。*/

  WriteDataLCM(Wdata);

  /*將數(shù)據(jù)Wdata寫(xiě)入LCM。*/

  }

  /*DispONeChar函數(shù)結(jié)束。*/

  6.演示第二行移動(dòng)字符串子函數(shù)

  void Display(uchar dd)

  /*演示第二行移動(dòng)字符串子函數(shù),函數(shù)名為Dispiay,定義

  dd為無(wú)符號(hào)字符型變量。*/

  {

  /*Display子函數(shù)開(kāi)始。*/

  uchari:

  /*定義;為無(wú)符號(hào)字符型變量。*/

  for(i=O;i<16:i++){

  /*進(jìn)入for語(yǔ)句循環(huán)。*/

  DisplayOneChar(i,1,dd++);

  /*顯示單個(gè)字符。*/

  dd&=Ox7f;

  /*dd的變化范圍0-127。*/

  if(dd<32)dd=32:

  /*dd的最小值為32,這樣dd的變化范圍為32-127。*/

  }

  /*for語(yǔ)句結(jié)束。*/

  }

 ?。?Display函數(shù)結(jié)束。*/

  7.顯示指定座標(biāo)的一串字符子函數(shù)

  void ePutstr(uchar x.uchar v,uchar code *ptr)

 ?。?顯示指定座標(biāo)的一串字符(x=0-15,y=0-1)子函數(shù),函

  數(shù)名為ePutstr,定義x、y為無(wú)符號(hào)字符型變量,ptr為指向

  code區(qū)的無(wú)符號(hào)字符型指針變量。*/

  {

  /*ePutetr子函數(shù)開(kāi)始。*/

  uchar i,I=O;

  /*定義i,i為無(wú)符號(hào)字符型變量。*/

  while(ptr[I]>31)(I++;}

  /*ptr[I]大于31時(shí),為ASCII碼,進(jìn)入While語(yǔ)句循環(huán),I累

  加,計(jì)算出字符串長(zhǎng)度。*/

  for(i=0;i

  /*進(jìn)入for語(yǔ)句循環(huán)。*/

  DisplayOneChar(x++,y,ptr[i]);

  /*顯示單個(gè)字符,同時(shí)x軸座標(biāo)遞增。*/

  if(x==1 6){

  /*若x等于16,進(jìn)入if語(yǔ)句。*/

  x=O;y^=1;

  /*x賦0,y與1按位異或(取反)。*/

  }

  /*if語(yǔ)句結(jié)束。*/

  }

  /*for語(yǔ)句結(jié)束。*/

  }

  /*ePutstr子函數(shù)結(jié)束。*/

  8.在AVR單片機(jī)綜合試驗(yàn)板上實(shí)現(xiàn)16x2LCM演示程序1

  第一行顯示“-This is a LCD-!”,第二行的第1個(gè)字符位置

  顯示“A”。過(guò)2秒后變?yōu)榈谝恍械牡?個(gè)字符位置顯示“B”,第

  二行顯示“-Design by ZXH-!”。然后無(wú)限循環(huán)。

  在我的文檔中新建一個(gè)ac18的文件夾。建立一個(gè)ac18.prj

  的工程項(xiàng)目,最后建立源程序文件ac18 C。輸入下面的程序:

  #include

  /*包含頭文件*/

  #include

  /*------------------------------------------*/

  #define uchar unsigned char

  /*變量類(lèi)型的宏定義*/

  #define uint unsigned int

  /*----------------引腳電平的宏定義----------------*/

  #define LCM_RS_1 PORTBㄧ=BIT(PB0)

  /*RS腳輸出高電平的宏定義*/

  #define LCM_RS_0 PORTB&=~BIT(PBO)

  /*RS腳輸出低電平的宏定義*/

  #define LCM_RW_1 PORTBㄧ=BIT(PB1)

  /*RW腳輸出高電平的宏定義*/

  #define LCM_RW_O PORTB&=~BIT(PB1)

  /*RW腳輸出低電平的宏定義*/

  #define LCM_EN_1 PORTBㄧ=BlT(PB2)

  /*EN腳輸出高電平的宏定義*/

  #define LCM_EN_0 PORTB&=~BIT(PB2)

  /*EN腳輸出低電平的宏定義*/

  /*===============================*/

  #define DataPort PORTA

  /*數(shù)據(jù)端口宏定義*/

  #define Busy 0x80

  /*忙信號(hào)的宏定義*/

  #define xtaI 8

  /*晶振頻率宏定義*/

  /*===============================*/

  const uchar str0[]={“-This is a LCD-!”}

  /*待顯字符*/

  const uchar str1 []={"-Design by ZXH-!"};

  /*待顯示字符串*/

 ?。?==============函數(shù)說(shuō)明===================*/

  void Delay_1 ms(void);

  void Delay_nms(uint n):

  void WaitFOrEnable(void):

  void LcdWriteData(uchar W):

  void LcdWriteCommand(uchar CMD,uchar Attribc);

  void InitLcd(void);

  void Display(uchar dd):

  void DispIayoneChar(uchar×.uchar y,uchar Wdata);

  void ePutstr(uchar x,uchar y,uchar const*ptr);

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

  void main(void)

  /*定義主函數(shù)*/

  {

  Delay_nms(400);

  /*延時(shí)400mS等待電源穩(wěn)定*/

  DDRA=0xff;PORTA=0x00;

 ?。?初始化I*O口*/

  DDRB=0xff;PORTB=0x00;

  InitLcd();

  /*LCD初始化*/

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

  while(1)

  /*無(wú)限循環(huán)*/

  {

  LcdWriteCommand(0x01.1):

  /*清屏*/

  LcdWriteCommand(0xoc,1):

 ?。?開(kāi)顯示*/

  DisplayOneChar(O,1,0x41):

 ?。?第二行的第1個(gè)字符位置顯示A*/

  ePutstr(0.0.str0);

  /*第一行顯示-This is a LCD-!*/

  Delay_nms(2000);

 ?。?延時(shí)2S*/

  LcdWriteCommand(0x01.1):

 ?。?清屏*/

  LcdWriteCommand(0xoc,1):

  /*開(kāi)顯示*/

  DisplayOneChar(8,0,0x42);

  /*第一行的第8個(gè)字符位置顯示B*/

  ePutstr(0.1,str1):

  /*第二行顯示-Design by AXH-!*/

  Delay_nms(2000);

  /*延時(shí)2S*/

  }

  }

  /*************顯示指定座標(biāo)的一串字符子函數(shù)***************/

  void ePutstr(uchar x,uchar y,uchar const*ptr)

  {

  uchar i.I=0:

  while(ptr[I]>31){I++;)

  for(i=0;i

  DisplayoneChar(x++,Y,pt r[i]);

  if(X==16){

  x=0;y^=1:

  }

  }

  }

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

  void LocateXY(char posx,char posy)

  {

  uchar temp;

  temp&=0x7f;

  temp=posx&0xof;

  posy&=0x01;

  if(posy)templ=0x40;

  templ=0x80;

  LcdWriteCommand(temp,0):

  }

  /**************顯示指定座標(biāo)的一個(gè)字符子函數(shù)************/

  void DisplayOneChar(uchar X.uchar y,uchar Wdata)

  {

  LocateXY(x,y):

  LcdWriteData(Wdata);

  }

 ?。?*************LCD初始化子函數(shù)******************/

  void lnitLcd(void)

  {

  LcdWriteCommand(0x38,O):

  /*8位數(shù)據(jù)傳送,2行顯示,5*7字形,不檢測(cè)忙信號(hào)*/

  Delay_nms(5);

  LcdWriteCommand(Ox38,O):

  /*8位數(shù)據(jù)傳送;2行顯示,5*7字形,不檢測(cè)忙信號(hào)*/

  Delay_nms(5);

  LcdWriteCommand(0x38.0):

  /*8位數(shù)據(jù)傳送,2行顯示,5*7字形,不檢測(cè)忙信號(hào)*/

  Delay_nms(5);

  LcdWriteCommand(0x38,1):

  /*8位數(shù)據(jù)傳送,2行顯示,5/7字形、檢測(cè)忙信號(hào)*/

  LcdWriteCommand(0x08,1):

 ?。?關(guān)閉顯示,檢測(cè)忙信號(hào)*/

  LcdWriteCommand(0x01,1);

 ?。?清屏,檢測(cè)忙信號(hào)*/

  LcdWriteCommand(0x06,1):

  /*顯示光標(biāo)右移設(shè)置,檢測(cè)忙信號(hào)*/

  LcdWriteCommand(0xoc,1):

 ?。?顯示屏打開(kāi),光標(biāo)不顯示、不閃爍,檢測(cè)忙信號(hào)*/

  }

 ?。?***************寫(xiě)命令到LCM子函數(shù)*******************/

  void LcdWfiteCommand(uchar CMD,uchar Attribc)

  {

  if(Attribc)WaitForEnable():

  LCM_RS_0;LCM_RW_0;_NOP();

  DataPort=CMD;_NOP();

  LCM_EN_1;_NOP0;_NOP();LCM_EN_O;

  }

  /***************寫(xiě)數(shù)據(jù)到LCM子函數(shù)***************/

  voidLEDWriteData(uchar dataW)

  {

  WaitF0rEnable();

  LCM_RS_1;LCM_RW_O;_NOP();

  DataPort=dataW;_NOP();

  LCM_EN_1:_NOP();_NOP();LCM_EN_0;

  }

 ?。?***********檢測(cè)LCD忙忙信號(hào)子函數(shù)**************/

  void WaitFOrEnable(vOid)

  {

  uchar val;

  DataPort=0xff;

  LCM_RS_0;LCM_RW_1;_NOP();

  LCM_EN_1:_NOP0;_NOP();

  DDRA=0x00;

  vaI=PINA;

  while(val&Busy)val=PINA;

  LCM_EN_O;

  DDRA=0xff;

  }

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

  void Delay_1 ms(void)

 ?。?1mS延時(shí)子函數(shù)*/

  { uint i;

  for(i=1;i<(uint)(xtal*143-2):i++)

  }

  /*==========================*/

  void Delay_nms(uint n)

 ?。?n*1mS延時(shí)子函數(shù)*/

  {

  uint i=0:

  while(i

  {Delay_1 ms();

  i++:

  }

  }

  編譯通過(guò)后,將ac18.hex文件下載到AVR單片機(jī)綜合試驗(yàn)板上進(jìn)行實(shí)際演示。標(biāo)示“LCD16*2”的單排座上正確插上16x2液晶模塊(腳號(hào)對(duì)應(yīng),不能插反),在標(biāo)示“DC5V”電源端輸入5V穩(wěn)壓電壓。我們看到液晶屏上的顯示與我們?cè)O(shè)計(jì)的目標(biāo)完全一致。

  9.在AVR單片機(jī)綜合試驗(yàn)板上實(shí)現(xiàn)16x2LCM演示程序--2一開(kāi)始第一行及第二行顯示預(yù)定的字符串(第一行顯示“--ELECTRONICS--”,第二行顯示“WORLDMAgazine”),隨后第二行顯示移動(dòng)的ASCII字符。

在我的文檔中新建一個(gè)acl9的文件夾。建立一個(gè)acl9.pri的工程項(xiàng)目,最后建立源程序

 

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉