新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC16F877單片機驅動1602液晶屏的數字時鐘程序

        PIC16F877單片機驅動1602液晶屏的數字時鐘程序

        作者: 時間:2016-11-29 來源:網絡 收藏
        /*******************************************************************************
        * 函 數 名: uchar Chk_1602_busy(void)
        * 函數功能: 讀液晶忙通道數據
        * 入口參數: 無
        * 返 回: 無
        *******************************************************************************/
        uchar Chk_1602_busy(void)
        {
        uint gR_data;
        uint gwait_time=0xff; //設置忙超時數
        LCD_RS=0; //表示狀態
        LCD_RW=1; //選擇讀
        LCD_EN=1;
        TRISC = 0xFF; //接收口設為輸入口
        Delay_US(30);
        gR_data=PORTC;
        while(TESTBIT(gR_data,7)) //表示busy
        {
        --gwait_time;
        if(!gwait_time)
        { LCD_EN=0;TRISC = 0x00; return 0; }
        }
        LCD_EN=0;
        TRISC = 0x00; //恢復為輸出口
        return 1;
        }
        /******************************************************************************
        * 函 數 名: void Write_1602_command(uchar gcmd,uchar gvalue)
        * 函數功能: 寫指令
        * 入口參數: gcmd--指令 gvalue--是否查忙
        * 返 回: 無
        *******************************************************************************/
        void Write_1602_command(uchar gcmd,uchar gvalue)
        {
        if(gvalue) //寫命令時大部分情況下是在LCD空閑模式下寫
        {
        if(Chk_1602_busy())
        {
        LCD_RS=0; //選擇指令
        LCD_RW=0; //選擇寫
        PORTC=gcmd; //賦指令
        LCD_EN=1; //使能
        Delay_US(30);
        LCD_EN=0;
        }
        }
        else
        {
        LCD_RS=0; //選擇指令
        LCD_RW=0; //選擇寫
        PORTC=gcmd; //賦指令
        LCD_EN=1; //使能
        Delay_US(30);
        LCD_EN=0;
        }
        }
        /******************************************************************************
        * 函 數 名: void Write_1602_data(uchar gdata)
        * 函數功能: 寫數據
        * 入口參數: gdata--數據
        * 返 回: 無
        *******************************************************************************/
        /*----------- 寫數據 -------------*/
        void Write_1602_data(uchar gdata)
        {
        if(Chk_1602_busy()) //寫數據必須是在LCD空閑模式下才能寫
        {
        LCD_RS=1; //選擇數據
        LCD_RW=0; //選擇寫
        PORTC=gdata;
        LCD_EN=1; //使能
        Delay_US(30);
        LCD_EN=0;
        Delay_US(10);
        }
        }
        /******************************************************************************
        * 函 數 名: void INIT_1602(void)
        * 函數功能: 初始化1602LCD
        * 入口參數: 無
        * 返 回: 無
        *******************************************************************************/
        /*-----------1602初始化函數-------------*/
        void INIT_1602(void)
        {
        Delay_Ms(15);
        Write_1602_command(0x38,0); //設置16X2顯示,5X7點陣,8位數據傳送,不檢測忙信號
        Delay_Ms(5);
        Write_1602_command(0x38,0);
        Delay_Ms(5);
        Write_1602_command(0x38,0); //設置16X2顯示,5X7點陣,8位數據傳送,不檢測忙信號
        Write_1602_command(0x38,1); //設置16X2顯示,5X7點陣,8位數據傳送,檢測忙信號
        Write_1602_command(0x08,1); //關閉顯示、無光標、檢測忙信號
        Write_1602_command(0x01,1); //清屏、光標歸位、AC=0、檢測忙信號
        Write_1602_command(0x06,1); //顯示光標右移位置、檢測忙信號
        Write_1602_command(0x0C,1); //顯示功能開、無光標
        }
        /******************************************************************************
        * 函 數 名: void Display_1602_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata)
        * 函數功能: 顯示字符串
        * 入口參數: gadd_start-列號,uchar gline-行號,glength-數據長度,pdata-數組元素
        * 返 回: 無
        *******************************************************************************/
        /*-----------顯示字符串-------------*/
        // 列號 行號 數據長度 數組元素
        void Display_1602_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata)
        {
        uchar gaddress;
        uchar *pdat;
        uchar gcount=0;
        if(!gline) //第0行
        { gaddress=0x80+gadd_start; } //地址對應
        else
        { gaddress=0xc0+gadd_start; } //第一行
        for(;gcount{
        Write_1602_command(gaddress,1); //設定數據地址
        Write_1602_data(*pdata); //取設定地址里的數據
        gaddress++;
        pdata++;
        }
        }
        /******************************************************************************
        * 函 數 名: void Display_1602(uchar x,uchar y,uchar gdata)
        * 函數功能: 指定位置顯示字符
        * 入口參數: x-起始地址橫坐標,y-起始地址縱坐標,gdata-要顯示的字符
        * 返 回: 無
        *******************************************************************************/
        /*-----------指定位置顯示字符-------------*/
        void DispChar_XY_1602(uchar x,uchar y,uchar gdata)
        {
        uchar gaddress;
        if(!y)
        { gaddress=0x80+x; }
        else
        { gaddress=0xc0+x; }
        Write_1602_command(gaddress,1); //設定數據地址
        Write_1602_data(gdata);
        }
        /*-----------指定位置顯示數字-------------*/
        void DispNum_XY_1602(uchar x,uchar y,uchar gdata)
        {
        uchar gaddress;
        if(!y)
        { gaddress=0x80+x; }
        else
        { gaddress=0xc0+x; }
        Write_1602_command(gaddress,1); //設定數據地址
        Write_1602_data(gdata+0x30);
        }
        /*-----------清屏-------------*/
        void Clear_Display(void)
        {
        Write_1602_command(0x01,1);
        Delay_Ms(5);
        }
        void Open_Disp(void)
        {
        Write_1602_command(0x0c,1);
        }
        void Close_Disp(void)
        {
        Write_1602_command(0x08,1);
        }
        /*-----------顯示光標-------------*/
        void Display_Cursor(void)
        {
        Write_1602_command(0x06,1); //顯示光標右移位置、檢測忙信號
        Write_1602_command(0x0D,1); //顯示功能開、無光標
        }
        /*-----------1602端口初始化-------------*/
        void Port_1602_Init(void)
        {
        ADCON1 = 0x87;//設置PORTA為普通IO口
        TRISA0 = 0;
        TRISA1 = 0;
        TRISA2 = 0;
        TRISC = 0x00;//設置PORTC為輸出
        }
        Display.h:
        #ifndef __Display_H__
        #define __Display_H__
        #define uchar unsigned char
        #define uint unsigned int
        #define TESTBIT(a,b) ((a)&(1<<(b)))
        #defineLCD_RSRA0
        #defineLCD_RWRA1
        #defineLCD_EN RA2
        /************************聲明函數*********************************************/
        uchar Chk_1602_busy(void);
        void Write_1602_command(uchar gcmd,uchar gvalue);
        void Write_1602_data(uchar gdata);
        void INIT_1602(void);
        void Display_1602_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata);
        void DispChar_XY_1602(uchar x,uchar y,uchar gdata);
        void DispNum_XY_1602(uchar x,uchar y,uchar gdata);
        void Clear_Display(void);
        void Open_Disp(void);
        void Close_Disp(void);
        void Display_Cursor(void);
        void Port_1602_Init(void);
        #endif
        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 彭水| 牙克石市| 达拉特旗| 盐城市| 天峻县| 昌邑市| 湛江市| 信宜市| 陕西省| 阳春市| 隆子县| 囊谦县| 宁陕县| 五指山市| 丹凤县| 启东市| 泰安市| 化德县| 蓝田县| 临颍县| 林西县| 独山县| 宜阳县| 闸北区| 昭觉县| 兴城市| 邢台县| 宁南县| 调兵山市| 连平县| 桃园县| 南汇区| 平度市| 陆川县| 大同市| 西丰县| 石狮市| 信阳市| 嘉祥县| 胶州市| 瑞金市|