1628|0

6587

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

LPC11XX驱动1602程序_12MHz [复制链接]

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
   {
      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

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表