找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4669|回复: 2
打印 上一主题 下一主题
收起左侧

LPC11XX驱动1602程序_12MHz

[复制链接]
跳转到指定楼层
楼主
ID:73735 发表于 2015-2-18 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
LCD.c文件:

#include "LPC11XX.h"
#include "gpio.h"
#include "main.h"
#include "Delay.h"
#include "LCD.h"

/*-----------设置D0-D7为输出口-------------*/
void Set_GPIO_Output(void)
{
        LPC_GPIO2->DIR |= (0x1<<0);              //设置D0-D7为输出
        LPC_GPIO2->DIR |= (0x1<<1);
        LPC_GPIO2->DIR |= (0x1<<2);
        LPC_GPIO2->DIR |= (0x1<<3);
        LPC_GPIO2->DIR |= (0x1<<4);
        LPC_GPIO2->DIR |= (0x1<<5);
        LPC_GPIO2->DIR |= (0x1<<6);
        LPC_GPIO2->DIR |= (0x1<<7);
}

/*-----------设置D0-D7为输入口-------------*/
void Set_GPIO_Input(void)
{
        LPC_GPIO2->DIR        &= ~(0x1<<0);            //设置D0-D7为输入
        LPC_GPIO2->DIR        &= ~(0x1<<1);
        LPC_GPIO2->DIR        &= ~(0x1<<2);
        LPC_GPIO2->DIR        &= ~(0x1<<3);
        LPC_GPIO2->DIR        &= ~(0x1<<4);
        LPC_GPIO2->DIR        &= ~(0x1<<5);
        LPC_GPIO2->DIR        &= ~(0x1<<6);
        LPC_GPIO2->DIR        &= ~(0x1<<7);         
}

/*-----------LCD端口初始化-------------*/
void LCD_GPIO_Init(void)
{
        //P2口可以用这种方式设置为GPIO,这种方式较合理正式。
        LPC_IOCON->PIO2_0 &= (~0x07);            //设置P2.0~P2.10为GPIO
        LPC_IOCON->PIO2_1 &= (~0x07);
        LPC_IOCON->PIO2_2 &= (~0x07);
        LPC_IOCON->PIO2_3 &= (~0x07);
        LPC_IOCON->PIO2_4 &= (~0x07);
        LPC_IOCON->PIO2_5 &= (~0x07);
        LPC_IOCON->PIO2_6 &= (~0x07);
        LPC_IOCON->PIO2_7 &= (~0x07);
       
        LPC_IOCON->PIO2_8 &= (~0x07);
        LPC_IOCON->PIO2_9 &= (~0x07);
        LPC_IOCON->PIO2_10 &=(~0x07);
       
       
        LPC_GPIO2->DIR |= (0x1<<0);              //设置D0-D7为输出
        LPC_GPIO2->DIR |= (0x1<<1);
        LPC_GPIO2->DIR |= (0x1<<2);
        LPC_GPIO2->DIR |= (0x1<<3);
        LPC_GPIO2->DIR |= (0x1<<4);
        LPC_GPIO2->DIR |= (0x1<<5);
        LPC_GPIO2->DIR |= (0x1<<6);
        LPC_GPIO2->DIR |= (0x1<<7);
       
        LPC_GPIO2->DIR |= (0x1<<8);              //RS 设为输出
        LPC_GPIO2->DIR |= (0x1<<9);              //R/W 设为输出
        LPC_GPIO2->DIR |= (0x1<<10);             //EN 设为输出
        LPC_GPIO3->DIR |= (0x1<<3);              //BackLighting 液晶屏背光设为输出
       
        GPIOSetValue( 3, 3, 1 );                 //BackLighting位写1,开启液晶屏背光,写0关闭液晶屏背光
}

/*-----------写数据到D0-D7-------------*/
void Write_Data_Port(unsigned char Data)
{
        LPC_GPIO2->DATA &= ~(0xff);
  LPC_GPIO2->DATA |=Data;
}

/*-----------读D0-D7的数据-------------*/
unsigned char Read_Data_Port(void)
{
        //unsigned char In_Data=0;
        //In_Data=LPC_GPIO2->DATA;
        //return In_Data;
        return(LPC_GPIO2->DATA);
       
}

/*******************************************************************************
* 函 数 名: uchar Chk_LCD_busy(void)
* 函数功能: 读液晶忙通道数据
* 入口参数: 无
* 返    回: 无
*******************************************************************************/
unsigned char Chk_LCD_busy(void)
{
  unsigned char gR_data;
  unsigned char gwait_time=0xff;    //设置忙超时数
       
        Set_GPIO_Input();                 //接收口设为输入口
       
  LCD_RS_Low();                     //表示状态
  LCD_RW_High();                    //选择读
  LCD_EN_High();
  Delay_Us(30);
       
  gR_data=Read_Data_Port();
        Delay_Us(10);

  while(TESTBIT(gR_data,7))         //表示busy
  {
     --gwait_time;
               
     if(!gwait_time)
     {
                         LCD_EN_Low();
                         Set_GPIO_Output();           //恢复为输出口
                         return 0;
                 }
  }
   LCD_EN_Low();
   Set_GPIO_Output();               //恢复为输出口
   return 1;
}

/******************************************************************************
* 函 数 名: void Write_LCD_command(uchar gcmd,uchar gvalue)
* 函数功能: 写指令
* 入口参数: gcmd--指令  gvalue--是否查忙
* 返    回: 无
*******************************************************************************/
void Write_LCD_command(unsigned char gcmd,unsigned char gvalue)
{
   if(gvalue)                       //写命令时大部分情况下是在LCD空闲模式下写
   {
     if(Chk_LCD_busy())
     {
       LCD_RS_Low();                //选择指令
       LCD_RW_Low();                //选择写
                         LCD_EN_High();               //使能
                         Write_Data_Port(gcmd);       //赋指令
       Delay_Us(15);
       LCD_EN_Low();
     }
   }
   else
   {
     LCD_RS_Low();                  //选择指令
     LCD_RW_Low();                  //选择写
                 LCD_EN_High();                 //使能
     Write_Data_Port(gcmd);         //赋指令
     Delay_Us(10);
     LCD_EN_Low();
   }
}

/******************************************************************************
* 函 数 名: void Write_LCD_data(uchar gdata)
* 函数功能: 写数据
* 入口参数: gdata--数据
* 返    回: 无
*******************************************************************************/
/*----------- 写数据 -------------*/
void Write_LCD_data(unsigned char gdata)
{
   if(Chk_LCD_busy())            //写数据必须是在LCD空闲模式下才能写
   {
      LCD_RS_High();             //选择数据
      LCD_RW_Low();              //选择写
                  LCD_EN_High();             //使能
      Write_Data_Port(gdata);
      Delay_Us(15);
      LCD_EN_Low();
   }
}

/******************************************************************************
* 函 数 名: void INIT_LCD(void)
* 函数功能: 初始化1602LCD
* 入口参数: 无
* 返    回: 无
*******************************************************************************/
/*-----------LCD初始化函数-------------*/
void INIT_LCD(void)
{
        LCD_GPIO_Init();
       
  Delay_Ms(15);
  Write_LCD_command(0x38,0);    //设置16X2显示,5X7点阵,8位数据传送,不检测忙信号
  Delay_Ms(5);
  Write_LCD_command(0x38,0);
  Delay_Ms(5);
  Write_LCD_command(0x38,0);    //设置16X2显示,5X7点阵,8位数据传送,不检测忙信号
        Delay_Us(100);
  Write_LCD_command(0x38,1);    //设置16X2显示,5X7点阵,8位数据传送,检测忙信号
  Write_LCD_command(0x08,1);    //关闭显示、无光标、检测忙信号
  Write_LCD_command(0x01,1);    //清屏、光标归位、AC=0、检测忙信号
        Delay_Ms(2);
  Write_LCD_command(0x06,1);    //显示光标右移位置、检测忙信号
  Write_LCD_command(0x0C,1);    //显示功能开、无光标、检测忙信号
}

/******************************************************************************
* 函 数 名: void Display_LCD_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata)
* 函数功能: 显示字符串
* 入口参数: gadd_start-列号,uchar gline-行号,glength-数据长度,pdata-数组元素
* 返    回: 无
*******************************************************************************/
/*-----------显示字符串-------------*/
//                                       列号                  行号                数据长度                   数组元素
void Display_LCD_string(unsigned char gadd_start,unsigned char gline,unsigned char glength,const unsigned char *pdata)
{
   unsigned char gaddress;
   //uchar *pdat;
   unsigned char gcount=0;

   if(!gline)                               //第0行
   { gaddress=0x80+gadd_start; }            //地址对应
   else
   { gaddress=0xc0+gadd_start; }            //第一行

   for(;gcount<glength;gcount++)
   {
      Write_LCD_command(gaddress,1);        //设定数据地址
      Write_LCD_data(*pdata);               //取设定地址里的数据
      gaddress++;
      pdata++;
   }
}

/******************************************************************************
* 函 数 名: void DispChar_XY_LCD(uchar x,uchar y,uchar gdata)
* 函数功能: 指定位置显示字符
* 入口参数: x-起始地址横坐标,y-起始地址纵坐标,gdata-要显示的字符
* 返    回: 无
*******************************************************************************/
void DispChar_XY_LCD(unsigned char x,unsigned char y,unsigned char gdata)
{
   unsigned char gaddress;

   if(!y)
   { gaddress=0x80+x; }

   else
   { gaddress=0xc0+x; }

   Write_LCD_command(gaddress,1);   //设定数据地址
   Write_LCD_data(gdata);
}

/******************************************************************************
* 函 数 名: void DispNum_XY_LCD(uchar x,uchar y,uchar gdata)
* 函数功能: 指定位置显示数字
* 入口参数: x-起始地址横坐标,y-起始地址纵坐标,gdata-要显示的数字
* 返    回: 无
*******************************************************************************/
void DispNum_XY_LCD(unsigned char x,unsigned char y,unsigned char gdata)
{
   unsigned char gaddress;

   if(!y)
   { gaddress=0x80+x; }

   else
   { gaddress=0xc0+x; }

   Write_LCD_command(gaddress,1);   //设定数据地址
   Write_LCD_data(gdata+0x30);
}

/*-----------清屏-------------*/
void Clear_Display(void)
{
  Write_LCD_command(0x01,1);
  Delay_Ms(5);
}


LCD.h文件:
#ifndef     __LCD_H__
#define     __LCD_H__


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

#define                LCD_RS_Low()                 LPC_GPIO2->DATA &=~(1<<8)          //给P2.8位写0
#define                LCD_RS_High()                 LPC_GPIO2->DATA |=(1<<8)           //给P2.8位写1

#define                LCD_RW_Low()                 LPC_GPIO2->DATA &=~(1<<9)          //给P2.9位写0
#define                LCD_RW_High()                 LPC_GPIO2->DATA |=(1<<9)           //给P2.9位写1

#define                LCD_EN_Low()     LPC_GPIO2->DATA &=~(1<<10)         //给P2.10位写0
#define                LCD_EN_High()    LPC_GPIO2->DATA |=(1<<10)          //给P2.10位写1


void Set_GPIO_Output(void);
void Set_GPIO_Input(void);

void LCD_GPIO_Init(void);
void Write_Data_Port(unsigned char Data);

unsigned char Read_Data_Port(void);
unsigned char Chk_LCD_busy(void);

void Write_LCD_command(unsigned char gcmd,unsigned char gvalue);
void Write_LCD_data(unsigned char gdata);

void INIT_LCD(void);
void Display_LCD_string(unsigned char gadd_start,unsigned char gline,unsigned char glength,const unsigned char *pdata);

void DispChar_XY_LCD(unsigned char x,unsigned char y,unsigned char gdata);
void DispNum_XY_LCD(unsigned char x,unsigned char y,unsigned char gdata);

void Clear_Display(void);

#endif






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:190499 发表于 2017-4-17 16:30 | 只看该作者
能否把其他头文件也分享一下
回复

使用道具 举报

板凳
ID:190499 发表于 2017-4-17 17:24 | 只看该作者
把其他头文件也分享一下吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表