日本欧美一区-日本欧美一区二区三区片-日本强好片久久久久久AAA-日本-区一区二区三区A片-日本人伦一区二区三区-日本人妻A片成人免费看

電子開發(fā)網(wǎng)

電子開發(fā)網(wǎng)電子設(shè)計 | 電子開發(fā)網(wǎng)Rss 2.0 會員中心 會員注冊
搜索: 您現(xiàn)在的位置: 電子開發(fā)網(wǎng) >> 電子開發(fā) >> 單片機 >> 正文

單片機c51驅(qū)動1602A液晶屏的驅(qū)動實驗

作者:佚名    文章來源:本站原創(chuàng)    點擊數(shù):    更新時間:2011-5-14
所需硬件:   1.單片機實驗開發(fā)板A
            2.杜邦頭插線
            3.16x2液晶顯示字符模塊
            4.STC89C51RC單片機
所需軟件:   1. Keil C51 V8.08或Keil_uv3 綠色版本
            2.STC單片機ISP下載編程軟件


        1602A液晶屏連接圖
C語言源程序
/******************************************************************
** 1602A液晶屏驅(qū)動程序
** 晶 振  頻 率:11.0592M
** 線路->單片機實驗開發(fā)板A
******************************************************************/
    #include  
    #define uchar unsigned char
    #define uint unsigned int

    sbit LCM_E=P3^5;  //定義接口
    sbit LCM_RW=P3^6;
    sbit LCM_RS=P3^7;

    #define LCM_Data P1//數(shù)據(jù)接口

    void LCM_WriteData(uchar WDLCM);
    void LCM_WriteCommand(uchar WCLCM,BuysC);
    uchar LCM_ReadData(void);
    uchar LCM_ReadStatus(void);
    void LCM_Init(void);
    void DisplayOneChar(uchar X, uchar Y, uchar DData);
    void DisplayListChar(uchar X, uchar Y, uchar code *DData);
    void Delay5Ms(void);
    void Delay400Ms(void);

    uchar code uctech[] = {"1602A"};
    uchar code net[] = {"www.52c51.com"};

    void main(void)
    {
        Delay400Ms(); //啟動等待,等LCM講入工作狀態(tài)
        LCM_Init(); //LCM初始化
        Delay5Ms(); //延時片刻(可不要)

        DisplayListChar(6, 1, uctech);   
        DisplayListChar(0, 0, net);
        LCM_ReadData();//測試用句無意義
        LCM_Data=255;
        while(1);
    }

/****************************1602A寫數(shù)據(jù)函數(shù)**************************/
/*函數(shù)原型:void LCM_WriteData(uchar WDLCM)
/*函數(shù)功能:1602A寫數(shù)據(jù)
/*輸入?yún)?shù):要寫入的數(shù)據(jù)
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
    void LCM_WriteData(uchar WDLCM)
    {
        LCM_ReadStatus(); //檢測忙
        LCM_Data = WDLCM;
        LCM_RS = 1;
        LCM_RW = 0;
        LCM_E = 0; //若晶振速度太高可以在這后加小的延時
        LCM_E = 0; //延時
        LCM_E = 1;
    }

/****************************1602A寫指令函數(shù)**************************/
/*函數(shù)原型:void LCM_WriteCommand(uchar WCLCM,BuysC)
/*函數(shù)功能:1602A寫指令
/*輸入?yún)?shù):要寫入的指令
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
    void LCM_WriteCommand(uchar WCLCM,BuysC) //BuysC為0時忽略忙檢測
    {
        if (BuysC) LCM_ReadStatus(); //根據(jù)需要檢測忙
        LCM_Data = WCLCM;
        LCM_RS = 0;
        LCM_RW = 0;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
    }

/****************************1602A讀數(shù)據(jù)函數(shù)**************************/
/*函數(shù)原型:uchar LCM_ReadData(void)
/*函數(shù)功能:1602A讀數(shù)據(jù)
/*輸入?yún)?shù):無
/*輸出參數(shù):1602A返回的數(shù)據(jù)
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
    uchar LCM_ReadData(void)
    {
        LCM_RS = 1;
        LCM_RW = 1;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
        return(LCM_Data);
    }

/****************************1602A讀狀態(tài)函數(shù)**************************/
/*函數(shù)原型:uchar LCM_ReadData(void)
/*函數(shù)功能:1602A讀狀態(tài)
/*輸入?yún)?shù):無
/*輸出參數(shù):1602A返回的狀態(tài)
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
    uchar LCM_ReadStatus(void)
    {
        LCM_Data = 0xFF;
        LCM_RS = 0;
        LCM_RW = 1;
        LCM_E = 0;
        LCM_E = 0;
        LCM_E = 1;
        while (LCM_Data & 0x80); //檢測忙信號
        return(LCM_Data);
    }

/****************************1602A初始化函數(shù)**************************/
/*函數(shù)原型:void LCM_Init(void)
/*函數(shù)功能:1602A初始化
/*輸入?yún)?shù):無
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
    void LCM_Init(void)
    {
        LCM_Data = 0;
        LCM_WriteCommand(0x38,0); //三次顯示模式設(shè)置,不檢測忙信號
        Delay5Ms();
        LCM_WriteCommand(0x38,0);
        Delay5Ms();
        LCM_WriteCommand(0x38,0);
        Delay5Ms();

        LCM_WriteCommand(0x38,1); //顯示模式設(shè)置,開始要求每次檢測忙信號
        LCM_WriteCommand(0x08,1); //關(guān)閉顯示
        LCM_WriteCommand(0x01,1); //顯示清屏
        LCM_WriteCommand(0x06,1); // 顯示光標(biāo)移動設(shè)置
        LCM_WriteCommand(0x0C,1); // 顯示開及光標(biāo)設(shè)置
    }

/******************1602A按指定位置顯示一個字符函數(shù)**********************/
/*函數(shù)原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)
/*函數(shù)功能:1602A按指定位置顯示一個字符
/*輸入?yún)?shù):X坐標(biāo) Y坐標(biāo) 要顯示的字符
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
    void DisplayOneChar(uchar X, uchar Y, uchar DData)
    {
        Y &= 0x1;
        X &= 0xF; //限制X不能大于15,Y不能大于1
        if (Y) X |= 0x40; //當(dāng)要顯示第二行時地址碼+0x40;
        X |= 0x80; // 算出指令碼
        LCM_WriteCommand(X, 0); //這里不檢測忙信號,發(fā)送地址碼
        LCM_WriteData(DData);
    }

/*******************1602A按指定位置顯示一串字符函數(shù)*********************/
/*函數(shù)原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
/*函數(shù)功能:1602A按指定位置顯示一個字符
/*輸入?yún)?shù):X坐標(biāo) Y坐標(biāo) 要顯示字符串的首地址
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
    void DisplayListChar(uchar X, uchar Y, uchar code *DData)
    {
        uchar ListLength;
        ListLength = 0;
        Y &= 0x1;
        X &= 0xF; //限制X不能大于15,Y不能大于1
        while (DData[ListLength]>0x20) //若到達字串尾則退出
        {
            if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
            {
                DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
                ListLength++;
                X++;
            }
        }
    }

/********************5ms延時函數(shù)************************/
/*函數(shù)原型:void Delay5Ms(void)
/*函數(shù)功能:5ms延時
/*輸入?yún)?shù):無
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
    void Delay5Ms(void)
    {
        unsigned int TempCyc = 5552;
        while(TempCyc--);
    }

/********************400ms延時延時函數(shù)************************/
/*函數(shù)原型:void Delay400Ms(void)
/*函數(shù)功能:400ms延時延時
/*輸入?yún)?shù):無
/*輸出參數(shù):無
/*調(diào)用模塊:
/*建立時間:2005/11/14
/*作者:站長
/**********************************************************************/
void Delay400Ms(void)
{
uchar TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
   TempCycB=7269;
   while(TempCycB--);
};
}
keil工程文件打包下載yejing_c.rar

匯編語言源程序
/******************************************************************
** 1602A液晶屏驅(qū)動程序
** 晶 振  頻 率:11.0592M
** 線路->單片機實驗開發(fā)板A
******************************************************************/

            LCM_RS EQU P3.7  ;//定義接口
            LCM_RW EQU P3.6
            LCM_E EQU P3.5

            LCM_Data EQU P1  ;數(shù)據(jù)接口

            ORG 0000H   ;從0000H處開始
            SJMP MAIN   ;跳轉(zhuǎn)到MAIN處

            ORG 0030H   ;主程序從0030H處開始
MAIN:       MOV SP,#70H   ;堆棧指針指向70H
            LCALL INITIAL   ;調(diào)用啟動LCM子程序進行初始化
            LCALL CLS   ;調(diào)用清除LCM子程序
            MOV A,#80H   ;向A送立即數(shù)80H設(shè)定顯示地址為第一行第一列
            LCALL WRITE_COM  ;調(diào)用寫指令到LCM子程序
            MOV DPTR,#LINE1  ;將第一行字符串的啟始地址送如DPTR中
            LCALL DISP   ;調(diào)用顯示字符串到LCM子程序
            MOV A,#0C0H   ;向A送立即數(shù)0C0H設(shè)定顯示地址為第二行第一列
            LCALL WRITE_COM  ;調(diào)用寫指令到LCM子程序
            MOV DPTR,#LINE2  ;將第二行字符串的啟始地址送如DPTR中
            LCALL DISP   ;調(diào)用顯示字符串到LCM子程序
            SJMP $   ;程序動態(tài)停機

LINE1:      DB " www.52c51.com ",00H ;第一行字符串
LINE2:      DB "   1602A   ",00H ;第二行字符串

INITIAL:    MOV A,#38H   ;啟動LCM子程序
            LCALL WRITE_COM
            MOV A,#0EH
            LCALL WRITE_COM
            MOV A,#06H
            LCALL WRITE_COM
            RET

CHECK_BUSY: PUSH ACC   ;查詢忙碌信號子程序
BUSY_LOOP:  CLR LCM_E
            SETB LCM_RW
            CLR LCM_RS
            SETB LCM_E
            MOV A,LCM_Data
            CLR LCM_E
            JB ACC.7,BUSY_LOOP
            POP ACC
            LCALL DEL
            RET

WRITE_COM:  LCALL CHECK_BUSY;寫指令到LCM子程序
            CLR LCM_E
            CLR LCM_RS
            CLR LCM_RW
            SETB LCM_E
            MOV LCM_Data,A
            CLR LCM_E
            RET

WRITE_DATA: LCALL CHECK_BUSY ;寫數(shù)據(jù)到LCM子程序
            CLR LCM_E
            SETB LCM_RS
            CLR LCM_RW
            SETB LCM_E
            MOV LCM_Data,A
            CLR LCM_E
            RET

CLS:        MOV A,#01H  ;清除LCM子程序
            LCALL WRITE_COM
            RET

DEL:        MOV R6,#5   ;2.7ms延時子程序
D1:         MOV R7,#248
            DJNZ R7,$
            DJNZ R6,D1
            RET

DISP:       PUSH ACC   ;將A的內(nèi)容壓棧
DISP_LOOP:  CLR A   ;A清零
            MOVC A,@A+DPTR  ;查表將字符串內(nèi)容送入A
            JZ END_DISP  ;若查到的內(nèi)容為0則終止查表
            LCALL WRITE_DATA  ;調(diào)用寫數(shù)據(jù)到LCM子程序
            INC DPTR   ;DPTR加1指向下一個對象
            SJMP DISP_LOOP  ;跳轉(zhuǎn)到DISP_LOOP循環(huán)執(zhí)行
END_DISP:   POP ACC   ;彈出壓棧內(nèi)容至A
            RET

            END    ;程序結(jié)束
keil工程文件打包下載 yejing_asm.rar
Tags:單片機驅(qū)動,1602液晶屏  
責(zé)任編輯:admin
相關(guān)文章列表
沒有相關(guān)文章
請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個字
[ 查看全部 ] 網(wǎng)友評論
關(guān)于我們 - 聯(lián)系我們 - 廣告服務(wù) - 友情鏈接 - 網(wǎng)站地圖 - 版權(quán)聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁面
下到頁底
晶體管查詢