欧美午夜欧美,台湾成人av,久久av一区,最近看过的日韩成人

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

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

單片機(jī)c51驅(qū)動(dòng)1602A液晶屏的驅(qū)動(dòng)實(shí)驗(yàn)

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


        1602A液晶屏連接圖
C語(yǔ)言源程序
/******************************************************************
** 1602A液晶屏驅(qū)動(dòng)程序
** 晶 振  頻 率:11.0592M
** 線路->單片機(jī)實(shí)驗(yàn)開發(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(); //啟動(dòng)等待,等LCM講入工作狀態(tài)
        LCM_Init(); //LCM初始化
        Delay5Ms(); //延時(shí)片刻(可不要)

        DisplayListChar(6, 1, uctech);   
        DisplayListChar(0, 0, net);
        LCM_ReadData();//測(cè)試用句無(wú)意義
        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ù):無(wú)
/*調(diào)用模塊:
/*建立時(shí)間:2005/11/14
/*作者:站長(zhǎng)
/**********************************************************************/
    void LCM_WriteData(uchar WDLCM)
    {
        LCM_ReadStatus(); //檢測(cè)忙
        LCM_Data = WDLCM;
        LCM_RS = 1;
        LCM_RW = 0;
        LCM_E = 0; //若晶振速度太高可以在這后加小的延時(shí)
        LCM_E = 0; //延時(shí)
        LCM_E = 1;
    }

/****************************1602A寫指令函數(shù)**************************/
/*函數(shù)原型:void LCM_WriteCommand(uchar WCLCM,BuysC)
/*函數(shù)功能:1602A寫指令
/*輸入?yún)?shù):要寫入的指令
/*輸出參數(shù):無(wú)
/*調(diào)用模塊:
/*建立時(shí)間:2005/11/14
/*作者:站長(zhǎng)
/**********************************************************************/
    void LCM_WriteCommand(uchar WCLCM,BuysC) //BuysC為0時(shí)忽略忙檢測(cè)
    {
        if (BuysC) LCM_ReadStatus(); //根據(jù)需要檢測(cè)忙
        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ù):無(wú)
/*輸出參數(shù):1602A返回的數(shù)據(jù)
/*調(diào)用模塊:
/*建立時(shí)間:2005/11/14
/*作者:站長(zhǎng)
/**********************************************************************/
    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ù):無(wú)
/*輸出參數(shù):1602A返回的狀態(tài)
/*調(diào)用模塊:
/*建立時(shí)間:2005/11/14
/*作者:站長(zhǎng)
/**********************************************************************/
    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); //檢測(cè)忙信號(hào)
        return(LCM_Data);
    }

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

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

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

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

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

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

匯編語(yǔ)言源程序
/******************************************************************
** 1602A液晶屏驅(qū)動(dòng)程序
** 晶 振  頻 率:11.0592M
** 線路->單片機(jī)實(shí)驗(yàn)開發(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)用啟動(dòng)LCM子程序進(jìn)行初始化
            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 $   ;程序動(dòng)態(tài)停機(jī)

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

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

CHECK_BUSY: PUSH ACC   ;查詢忙碌信號(hào)子程序
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延時(shí)子程序
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指向下一個(gè)對(duì)象
            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:單片機(jī)驅(qū)動(dòng),1602液晶屏  
責(zé)任編輯:admin
相關(guān)文章列表
沒有相關(guān)文章
請(qǐng)文明參與討論,禁止漫罵攻擊,不要惡意評(píng)論、違禁詞語(yǔ)。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個(gè)字
[ 查看全部 ] 網(wǎng)友評(píng)論
關(guān)于我們 - 聯(lián)系我們 - 廣告服務(wù) - 友情鏈接 - 網(wǎng)站地圖 - 版權(quán)聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁(yè)面
下到頁(yè)底
晶體管查詢
主站蜘蛛池模板: 镇雄县| 韶山市| 平遥县| 色达县| 云林县| 定兴县| 肇源县| 公安县| 凌源市| 饶河县| 师宗县| 枣阳市| 郁南县| 麻栗坡县| 绵竹市| 简阳市| 双流县| 沅陵县| 荃湾区| 育儿| 洞头县| 永修县| 宝坻区| 沽源县| 卓尼县| 孝感市| 门头沟区| 抚远县| 海兴县| 桐城市| 石渠县| 钟山县| 承德县| 石首市| 徐汇区| 沐川县| 巴楚县| 合川市| 东阿县| 恩施市| 平顺县|