機電之家資源網(wǎng)
單片機首頁|單片機基礎(chǔ)|單片機應(yīng)用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
C語言綜合練習(2)
C語言綜合練習(2)
 更新時間:2008-7-27 16:15:11  點擊數(shù):2
【字體: 字體顏色
二、液晶顯示
  字符型液晶顯示器用于顯示數(shù)字、字母、圖形符號。這類顯示器均把LCD控制器、點陣驅(qū)動器、字符存貯器等做在一塊板上,再與液晶屏一起組成一個顯示模塊,因此,這類顯示器安裝與使用都較簡單。
  圖2是前面課程中介紹的仿真實驗板上字符型液晶的接口電路。要求編寫程序從該板的第二行第1列開始顯示“Hello World!”。
  
  由于市面上常見的字符型液晶驅(qū)動器均由HD44780或其兼容芯片構(gòu)成,因此,這類液晶屏的驅(qū)動程序具有一定的通用性,這里給出用C語言寫的驅(qū)動程序。在設(shè)置字符的起始行、列后,直接調(diào)用驅(qū)動程序提供的WriteString函數(shù)即可將字符串顯示在指定的位置,使用非常簡單。在熟悉了程序后,略作改動,可用于2002、2004等型號的液晶屏。 
/**************************************************
*    平凡單片機工作室
*  http://www.mcustudio.com
*    Copyright 2003 pingfan's McuStudio
*    All rights Reserved
*作者:周堅   
*yj.c
*連線圖:
*  DB0---DPROT.0  DB4---DPROT.4    RS-------------P2.5
*  DB1---DPROT.1  DB5---DPROT.5    RW-------------P2.6
*  DB2---DPROT.2  DB6---DPROT.6    E--------------P2.7
*  DB3---DPROT.3  DB7---DPROT.7    VLCD接10K可調(diào)電阻到GND*
*80C51的晶振頻率為12MHz
*液晶顯示程序
***************************************************/
#include "reg51.h"
#include<absacc.h>
#include <intrins.h>
#define DPORT  P0
#define uchar unsigned char
sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;

uchar Xpos; //列方向地址指針
uchar Ypos; //行方向地址指針


#define NoDisp 0
#define NoCur 1
#define CurNoFlash 2
#define CurFlash 3
/*延時程序
  由Delay參數(shù)確定延遲時間
*/

void LcdWcn(uchar);
void LcdWc(uchar);
void WriteChar(uchar);
void LcdPos();
void LcdWd(uchar);
void LcdWdn(uchar);


void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}

/*光標設(shè)置命令
Cur 為設(shè)定光標參數(shù)
*/
void SetCur(uchar Cur)
{ switch(Cur)
{ case 0x0:
{ LcdWc(0x08); //關(guān)顯示
break;
}
case 0x1:
{ LcdWc(0x0c); //開顯示但無光標
break;
}
case 0x2:
{ LcdWc(0x0e); //開顯示有光標但不閃爍
break;
}
case 0x3:
{ LcdWc(0x0f); //開顯示有光標且閃爍
break;
}
default: break;
}
}
/*清屏命令
*/
void ClrLcd()
{ LcdWc(0x01);
}
/*在指定的行與列顯示
*/
void WriteChar(uchar c)
{ LcdPos();
LcdWd(c);
}
/*正常讀寫操作之前檢測LCD控制器
*/
void WaitIdle()
{ uchar tmp;
DPORT=0xff;
RS=0;
RW=1;
E=1;
_nop_();
for(;;)
{ tmp=DPORT;
tmp&=0x80;
if(tmp==0)
break;
}
E=0;
}

/*不檢測忙的寫字符子程序
*/
void LcdWdn(uchar c)
{
RS=1;
RW=0;
DPORT=c; //寫入待寫字符
E=1;
_nop_();
E=0;
}
/*帶忙檢測的寫字符子程序
*/
void LcdWd(uchar c)
{ WaitIdle();
LcdWdn(c);
}

/*檢測忙信號的送控制字子程序*/
void LcdWcn(uchar c)
{ RS=0;
RW=0;
DPORT=c;
E=1;
_nop_();
E=0;
}
/*檢測忙信號的送控制字子程序*/
void LcdWc(uchar c)
{ WaitIdle();
LcdWcn(c);
}
void LcdPos()
{ uchar tmp;
Xpos&=0x0f; //16xx型液晶的范圍是0~15
Ypos&=0x01; //Y的范圍是0~1
tmp=Xpos;
if(Ypos==1)
{ tmp+=0x40;
}
tmp|=0x80;
LcdWc(tmp);
}

/*LCD的復位程序
*/
void RstLcd()
{ mDelay(15); //延時15ms
LcdWcn(0x38);
mDelay(5);
LcdWcn(0x38);
mDelay(5);
LcdWcn(0x38);

LcdWc(0x38);
LcdWc(0x08);
LcdWc(0x01);
LcdWc(0x06);
LcdWc(0x0c);
}

void WriteString(char s[])
{ uchar pS=0;
for(;;)
{ WriteChar(s[pS]);
pS++;
if(s[pS]==0)
break;
if(++Xpos>=15) //每行最多顯示16個字符
break;
}
}

void main()
{ uchar s1[]="Hellow World!";
RstLcd(); //復位LCD
ClrLcd();
SetCur(CurFlash); //光標顯示且閃爍
Xpos=2;
Ypos=1;
WriteString(s1);
for(;;)
{;}
}
 
   程序分析:本程序中大量使用了函數(shù),在此對函數(shù)的功能作一個簡介。 
C語言程序是由一個個函數(shù)構(gòu)成的,從函數(shù)定義的形式上劃分,函數(shù)有三種形式:無參數(shù)函數(shù)、有參數(shù)函和空函數(shù)。
    無參數(shù)函數(shù)的定義形式為:
返回值類型識別符 函數(shù)名(){函數(shù)體語句}
如本例中的void WaitIdle(){ …… }就是一個無參數(shù)函數(shù)
    有參數(shù)函數(shù)的定義形式為:
    返回值類型識別符 函數(shù)名(形式參數(shù)列表){函數(shù)體語句}
    如本例中的void LcdWdn(uchar c){ …… }就是一個有參數(shù)的函數(shù)
    函數(shù)可以返回一個值,也可以什么值也返回,如果函數(shù)要返回一個值,在定義這個函數(shù)時要定義好這個值的數(shù)據(jù)類型,這里所說的數(shù)據(jù)類型就是指前面課程中介紹到的int、char、float等類型,如果在定義函數(shù)時沒有定義返回值的類型,系統(tǒng)默認為返回一個int型的值。如果明確地知道一個函數(shù)將沒有返回值,可以將其定義為void型,這樣,如果在調(diào)用函數(shù)時錯誤地使用了“變量名=函數(shù)名”的方式來調(diào)用函數(shù),編譯器就能發(fā)現(xiàn)這一錯誤并指出。本例中就大量地應(yīng)用到了void型函數(shù)。
    C語言采用函數(shù)之間的參數(shù)傳遞方式,這使得一個函數(shù)能對不同的變量進行功能相同的處理,使函數(shù)具有了通用性。定義函數(shù)時,寫在函數(shù)名括號中的稱之為形式參數(shù),而在實際調(diào)用函數(shù)時寫在函數(shù)括號中的稱之為實際參數(shù)。本例中:
void SetCur(uchar Cur)
{ …}
    函數(shù)中Cur就是一個形式參數(shù),而在主函數(shù)中調(diào)用時寫的:
SetCur(CurFlash);
    其中CurFlash就是一個用符號常量表示的實際參數(shù),在執(zhí)行該函數(shù)時該值被傳遞到函數(shù)內(nèi)部并執(zhí)行。
    每一個函數(shù)所調(diào)用的函數(shù)必須已被定義,否則就會出現(xiàn)語法錯誤,因此程序中一般要求在程序的開頭對程序中用到的函數(shù)進行統(tǒng)一的說明,然后再分別定義有關(guān)函數(shù),本例中有:
void WriteChar(uchar);

void LcdWdn(uchar);
    就是首先在程序的前方寫一個有關(guān)函數(shù)的說明,而真正的函數(shù)定義則在程序放在后部。但細心的讀者可能發(fā)現(xiàn)有一些函數(shù)并未寫其說明,而是直接在程序中定義了,如mDelay函數(shù),這是為何呢?這是因為這些函數(shù)出現(xiàn)在程序的前面,在還沒有任何函數(shù)調(diào)用它們之前它們就被定義了,因此就不需要再單獨寫一個函數(shù)說明。讀者可將mDelay函數(shù)的定義移到程序的后面位置,再次編譯就會出錯。當然,好的編程習慣是不論函數(shù)在何處被定義,總是在寫前面寫一個函數(shù)說明。
有關(guān)單片機的C語言編程到此就告一個段落,雖然C語言很多特性尚未介紹,但通過上面有關(guān)內(nèi)容的學習,我們已經(jīng)可以使用C語言進行一些實際的工程開發(fā)工作,大家可以在工作中繼續(xù)學習有關(guān)C語言的知識。
  • 上一篇: C語言綜合練習(1)
  • 下一篇: 單片機內(nèi)部資源編程
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術(shù)支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設(shè)備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務(wù)100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1