新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 自制51單片機常用頭文件(st7920串行方式)

        自制51單片機常用頭文件(st7920串行方式)

        作者: 時間:2016-11-10 來源:網絡 收藏
        /*--------------------------------------------------------------------------

        ST7920.H

        本文引用地址:http://www.104case.com/article/201611/317351.htm

        The user function is C51.
        Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
        All rights reserved.
        --------------------------------------------------------------------------*/
        // 串行方式
        #ifndef __ST7920_H__
        #define __ST7920_H__

        #define uint unsigned int
        #define uchar unsigned char

        //引腳定義
        #define LCD_CS P3_2// 片選 高電平有效 單片LCD使用時可固定高電平
        #define LCD_SID P3_3// 數據
        #define LCD_CLK P3_4// 時鐘
        #define LCD_PSB P3_5// 低電平時表示用串口驅動,可固定低電平
        #define LCD_RST P3_6// LCD復位,LCD模塊自帶復位電路。可不接
        //#define LCD_BACK P2_6 // LCD背光控制

        /*****************************************************
        函 數 名:void Delay_LCD(uint Number)
        功 能:LCD延時
        說 明:在送出一個指令前不檢查BF標志,則在前一個指令和這個指令中間必須延遲一段較長的時間
        入口參數:Number
        返 回 值:無
        *****************************************************/
        void Delay_LCD(uint Number)
        {
        uint i,j;

        for (i=0; i {
        for(j=0; j<10; j++)
        {
        ;
        }
        }
        }

        /*****************************************************
        函 數 名:void Send_byte(uchar Byte)
        功 能:發送一個字節
        入口參數:Byte
        返 回 值:無
        *****************************************************/
        void Send_byte(uchar Byte)
        {
        uchar i;

        for (i=0; i<8; i++)
        {
        LCD_SID = Byte&0x80; // 取出最高位 寫入串行數據
        LCD_CLK = 1; // 串行同步時鐘信號
        LCD_CLK = 0;
        Byte <<= 1; // 左移
        }
        }
        /*****************************************************
        函 數 名:void WriteCommandLCM()
        功 能:向LCM中寫入指令
        入口參數:WCLCM
        返 回 值:無
        ****************************************************/
        void WriteCommandLCM(uchar WCLCM)
        {
        uchar Start_data,Hdata,Ldata;

        Start_data = 0xf8; // 寫指令 11111000

        Hdata = WCLCM&0xf0; // 取高四位 DDDD0000
        Ldata = (WCLCM << 4) & 0xf0; // 取低四位 0000DDDD

        Send_byte(Start_data); // 發送起始信號 第1字節-格式:1111ABC
        Delay_LCD(5); // 延時是必須的

        Send_byte(Hdata); // 發送高四位 第2字節-格式:DDDD0000
        Delay_LCD(1); // 延時是必須的

        Send_byte(Ldata); // 發送低四位 第3字節-格式:0000DDDD
        Delay_LCD(1); // 延時是必須的
        }
        /*****************************************************
        函 數 名:void WriteDataLCM()
        功 能:向LCM1602中寫入數據
        說 明:將形參WDLCM中的數據寫入LCM中
        入口參數:WDLCM
        返 回 值:無
        *****************************************************/
        void WriteDataLCM(uchar WDLCM)
        {
        uchar Start_data,Hdata,Ldata;

        Start_data = 0xfa; // 寫數據 11111010

        Hdata = WDLCM & 0xf0; // 取高四位 DDDD0000
        Ldata = (WDLCM << 4) & 0xf0; // 取低四位 0000DDDD

        Send_byte(Start_data); // 發送起始信號 第1字節-格式:1111ABC
        Delay_LCD(5); // 延時是必須的

        Send_byte(Hdata); // 發送高四位 第2字節-格式:DDDD0000
        Delay_LCD(1); // 延時是必須的

        Send_byte(Ldata); // 發送低四位 第3字節-格式:0000DDDD
        Delay_LCD(1); // 延時是必須的
        }

        /*****************************************************
        函 數 名:void Lcdinit(void)
        功 能:LCD初始化
        入口參數:無
        返 回 值:無
        *****************************************************/
        void Lcdinit(void)
        {
        Delay_LCD(10); // 啟動等待,等LCM講入工作狀態
        LCD_PSB = 0; // 串口驅動模式
        LCD_RST = 0;

        Delay_LCD(1);
        LCD_RST = 1; // 復位LCD
        LCD_CS = 1; // 片選

        WriteCommandLCM(0x30); // 8 位介面,基本指令集
        WriteCommandLCM(0x0c); // 顯示打開,光標關,反白關
        WriteCommandLCM(0x01); // 清屏,將DDRAM的地址計數器歸零
        }

        /*****************************************************
        函 數 名:void DisplayListChar()
        功 能:向指點的地址寫入字符串
        入口參數:x-橫坐標,y-縱坐標,s-字符串
        返 回 值:無
        *****************************************************/
        void DisplayListChar(uchar x, uchar y, uchar code *s)
        {
        uchar add; // 顯示地址

        switch (y) // 顯示地址計數
        {
        case 0: add = x + 0x80; break; // 第一行的地址
        case 1: add = x + 0x90; break; // 第二行的地址
        case 2: add = x + 0x88; break; // 第三行的地址
        case 3: add = x + 0x98; break; // 第四行的地址
        default: break;
        }

        WriteCommandLCM(0x30); // 8位介面,基本指令集
        WriteCommandLCM(add); // 寫入地址

        while (*s > 0) // 寫入字符串
        {
        WriteDataLCM(*s);
        s++;
        Delay_LCD(50);
        }
        }

        /*****************************************************
        函 數 名:void DisplayPicture(uint code *img)
        功 能:在LCD上顯示圖形
        說 明:在LCD上顯示圖形時,由于ST7920的特殊性應分兩屏控制
        入口參數:*img
        返 回 值:無
        *****************************************************/
        //圖形方式
        void DisplayPicture(uint code *img)
        {
        uchar Line,Row; // Line為行地址;Row為列地址
        uint regist = 0; // 圖形地址寄存器

        WriteCommandLCM(0x36); // 圖形方式,擴展指令
        // -------------- 上半屏 ----------------
        for (Line=0; Line<32; Line++)
        {
        WriteCommandLCM(0x80 + Line); // 寫入行地址
        WriteCommandLCM(0x80); // 寫入列

        for (Row=0; Row<16; Row++)
        {
        WriteDataLCM(img[regist++]); // 寫入圖片數據
        }
        }
        // --------------- 下半屏 ---------------
        regist=512; // 下半屏起始數據

        for (Line=0; Line<32; Line++)
        {
        WriteCommandLCM(0x80 + Line);// 寫入行地址
        WriteCommandLCM(0x88);// 寫入列

        for (Row=0; Row<16; Row++)
        {
        WriteDataLCM(img[regist++]); // 寫入圖片數據
        }
        }

        WriteCommandLCM(0x30); // 基本指令
        }

        /*****************************************************
        函 數 名:void main(void)
        功 能:主函數
        入口參數:無
        返 回 值:無
        *****************************************************/
        void main(void)
        {

        Lcdinit(); // 初始化LCD

        while(1)
        {

        DisplayListChar(0,0,"zhaojun");
        }

        }

        #endif



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 浙江省| 红安县| 泰来县| 兴海县| 黄梅县| 阳东县| 长沙县| 临朐县| 佳木斯市| 浪卡子县| 河南省| 左权县| 长沙市| 剑河县| 靖边县| 襄汾县| 滨州市| 夏河县| 巫溪县| 晴隆县| 澳门| 牟定县| 临澧县| 邛崃市| 益阳市| 庐江县| 凉城县| 小金县| 永州市| 丹东市| 仲巴县| 开原市| 南溪县| 吐鲁番市| 崇仁县| 赫章县| 藁城市| 阿拉善左旗| 长宁区| 镇赉县| 云和县|