久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實(shí)例 >> 瀏覽文章

PIC16F91x系列單片機(jī)驅(qū)動1602液晶屏程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時間:2012年11月15日   【字體:
IO口需要如下這樣配置,不用段式LCD功能,也必須配置COMCON0和LCDCON,
/*-----------1602端口初始化-------------*/
void Port_1602_Init(void)
{
    PORTA=0x00;
    CMCON0=0xff;
    ANSEL = 0x00;
    TRISA=0X00;
    PORTC=0x00;
    TRISC=0x00;
    LCDCON=0x00;
}

 

完整程序如下:

main.c如下:

#include <htc.h>
#include "Display.h"
#include "main.h"

#define uchar unsigned char
#define uint  unsigned int

__CONFIG(WDTDIS & HS & PWRTDIS & BORDIS);//設(shè)置配置位
 
/************************定義顯示字符*****************************************/
uchar Wel[]  = {"Welcome To"};
uchar tab[]  = {"Bei Jing"};

/*******************************************************************************
* 函 數(shù) 名: Delay_US(uint8 delay)
* 函數(shù)功能: 微秒延時--12us 
* 入口參數(shù): delay
* 返    回: 無
*******************************************************************************/
void Delay_US(uint delay)   
{
   for(;delay;)
   {
      delay--;
   }
}

/*******************************************************************************
* 函 數(shù) 名: Delay_MS(uint16 delay)
* 函數(shù)功能: 毫秒延時--1ms 
* 入口參數(shù): delay
* 返    回: 無
*******************************************************************************/
void Delay_Ms(uint delay) 
{
   uint i;
   for(i=0;i<delay;i++)
       Delay_US(83);
}

/*******************************************************************************
* 函 數(shù) 名: Delay_Sec(uint16 delay)
* 函數(shù)功能: 毫秒延時--1ms 
* 入口參數(shù): delay
* 返    回: 無
*******************************************************************************/
void Delay_Sec(uint delay)
{
   uint i,j;
   for(i=0;i<20*delay;i++)
   {
       for(j=0;j<4536;j++);
   }   
}

/******************************************************************************
* 函 數(shù) 名: main()
* 函數(shù)功能: LCD顯示字符
* 入口參數(shù): 無
* 返    回: 無
*******************************************************************************/

void main()
{ 
 Port_1602_Init();
 INIT_1602();
 Display_1602_string(3,0,10,Wel);
 Display_1602_string(4,1,8,tab);
 
 while(1)
 {
 } 
}

 

main.h如下:


#ifndef     __MAIN_H__
#define     __MAIN_H__

#define uchar unsigned char
#define uint  unsigned int

#define  LCD_RS  RA0
#define  LCD_RW  RA1
#define  LCD_EN      RA2

void Delay_US(uint delay);           //12微秒延時
void Delay_Ms(uint delay);           //1毫秒延時
void Delay_Sec(uint delay);          //1秒延時


#endif


Display.c如下:

 

#include <htc.h>
#include "Display.h"
#include "main.h"
/*******************************************************************************
* 函 數(shù) 名: uchar Chk_1602_busy(void)
* 函數(shù)功能: 讀液晶忙通道數(shù)據(jù)
* 入口參數(shù): 無
* 返    回: 無
*******************************************************************************/
uchar Chk_1602_busy(void)
{
   uint gR_data;
   uint gwait_time=0xff;     //設(shè)置忙超時數(shù)

   LCD_RS=0;                 //表示狀態(tài)
   LCD_RW=1;                 //選擇讀
   LCD_EN=1;
   TRISC = 0xFF;             //接收口設(shè)為輸入口
   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;   //恢復(fù)為輸出口
    return 1;
}

/******************************************************************************
* 函 數(shù) 名: void Write_1602_command(uchar gcmd,uchar gvalue)
* 函數(shù)功能: 寫指令
* 入口參數(shù): 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;
   }
}

/******************************************************************************
* 函 數(shù) 名: void Write_1602_data(uchar gdata)
* 函數(shù)功能: 寫數(shù)據(jù)
* 入口參數(shù): gdata--數(shù)據(jù)
* 返    回: 無
*******************************************************************************/

/*----------- 寫數(shù)據(jù) -------------*/
void Write_1602_data(uchar gdata)
{
   if(Chk_1602_busy())     //寫數(shù)據(jù)必須是在LCD空閑模式下才能寫
   {
      LCD_RS=1;             //選擇數(shù)據(jù)
      LCD_RW=0;             //選擇寫
      PORTC=gdata;
      LCD_EN=1;             //使能
      Delay_US(30);
      LCD_EN=0;
      Delay_US(10);
   }
}

/******************************************************************************
* 函 數(shù) 名: void INIT_1602(void)
* 函數(shù)功能: 初始化1602LCD
* 入口參數(shù): 無
* 返    回: 無
*******************************************************************************/

/*-----------1602初始化函數(shù)-------------*/
void INIT_1602(void)
{
   Delay_Ms(15);
   Write_1602_command(0x38,0);  //設(shè)置16X2顯示,5X7點(diǎn)陣,8位數(shù)據(jù)傳送,不檢測忙信號
   Delay_Ms(5);
   Write_1602_command(0x38,0);
   Delay_Ms(5);
   Write_1602_command(0x38,0);  //設(shè)置16X2顯示,5X7點(diǎn)陣,8位數(shù)據(jù)傳送,不檢測忙信號
   Write_1602_command(0x38,1);  //設(shè)置16X2顯示,5X7點(diǎn)陣,8位數(shù)據(jù)傳送,檢測忙信號
   Write_1602_command(0x08,1);  //關(guān)閉顯示、無光標(biāo)、檢測忙信號
   Write_1602_command(0x01,1);  //清屏、光標(biāo)歸位、AC=0、檢測忙信號
   Write_1602_command(0x06,1);  //顯示光標(biāo)右移位置、檢測忙信號
   Write_1602_command(0x0c,1);  //顯示功能開、無光標(biāo)

}


/******************************************************************************
* 函 數(shù) 名: void Display_1602_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata)
* 函數(shù)功能: 顯示字符串
* 入口參數(shù): gadd_start-列號,uchar gline-行號,glength-數(shù)據(jù)長度,pdata-數(shù)組元素
* 返    回: 無
*******************************************************************************/
/*-----------顯示字符串-------------*/
//                                列號           行號       數(shù)據(jù)長度     數(shù)組元素
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; }      //地址對應(yīng)
   else
   { gaddress=0xc0+gadd_start; }      //第一行

   for(;gcount<glength;gcount++)
   {
      Write_1602_command(gaddress,1);        //設(shè)定數(shù)據(jù)地址
      Write_1602_data(*pdata);  //取設(shè)定地址里的數(shù)據(jù)
      gaddress++;
      pdata++;
   }
}

 

 

/******************************************************************************
* 函 數(shù) 名: void Display_1602(uchar x,uchar y,uchar gdata)
* 函數(shù)功能: 指定位置顯示字符
* 入口參數(shù): x-起始地址橫坐標(biāo),y-起始地址縱坐標(biāo),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);   //設(shè)定數(shù)據(jù)地址
   Write_1602_data(gdata);
}

/*-----------指定位置顯示數(shù)字-------------*/
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);   //設(shè)定數(shù)據(jù)地址
   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);
}

/*-----------顯示光標(biāo)-------------*/
void Display_Cursor(void)
{
  Write_1602_command(0x06,1);  //顯示光標(biāo)右移位置、檢測忙信號
  Write_1602_command(0x0D,1);  //顯示功能開、無光標(biāo)

}

/*-----------1602端口初始化-------------*/
void Port_1602_Init(void)
{
    PORTA=0x00;
 CMCON0=0xff;
    ANSEL = 0x00;
    TRISA=0X00;
   
    PORTC=0x00;
    TRISC=0x00;
    LCDCON=0x00;
}

Display.h如下:

#ifndef     __Display_H__
#define     __Display_H__

#define     uchar unsigned char
#define     uint unsigned int

#define TESTBIT(a,b) ((a)&(1<<(b)))

#define  LCD_RS  RA0
#define  LCD_RW  RA1
#define  LCD_EN      RA2


/************************聲明函數(shù)*********************************************/
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
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 精区3d动漫一品二品精区 | 久久国产一区二区 | 久久久久国产精品午夜一区 | 欧美视频一区 | 国产一区二区在线免费观看 | 国产最新视频在线 | 亚洲国产成人精品女人 | 欧美日韩中文在线 | 神马福利| 超碰人人在线 | 欧美日韩不卡在线 | 欧洲免费毛片 | 亚洲a视| 久久国产精品久久国产精品 | 免费成人av | 国产91丝袜 | 不卡视频一区二区三区 | 亚洲一本| 国产欧美性成人精品午夜 | 国产欧美日韩精品一区 | 麻豆久久| 久久一久久 | 麻豆视频在线免费观看 | 日韩在线中文 | 精品一区二区免费视频 | 三级黄色片在线 | 亚洲国产69 | 日韩手机视频 | 国产清纯白嫩初高生在线播放视频 | 天堂综合网| 成人不卡 | 理论片午午伦夜理片影院 | 国产日韩欧美电影 | 精品在线视频播放 | 国产精品久久久久免费 | 欧美日韩在线视频一区二区 | 国产精品一区二区三区久久久 | 在线欧美视频 | 成人午夜电影在线观看 | 在线亚洲免费视频 | 精品久久久久久亚洲精品 |