LCD.c如下(单片机时钟频率为12MHz):

#include "LPC11XX.h"
#include "gpio.h"
#include "main.h"
#include "Delay.h"
#include "LCD.h"void Set_GPIO_Output ( void ) { /* 设置D0至D7为输出口 */LPC_GPIO2->DIR |= ( 0x1 << 0 );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 );
}void Set_GPIO_Input ( void ) { /* 设置D0至D7为输入口 */LPC_GPIO2->DIR &= ~ ( 0x1 << 0 );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 );
}void LCD_GPIO_Init ( void ) {/* 设置P2.0至P2.10为GPIO */LPC_IOCON->PIO2_0 &= ( ~0x07 );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 );/* 设置D0至D7为输出 */LPC_GPIO2->DIR |= ( 0x1 << 0 );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关闭液晶屏背光 */
}void Write_Data_Port ( unsigned char Data ) { /* 写数据到D0至D7 */LPC_GPIO2->DATA &= ~ ( 0xff );LPC_GPIO2->DATA |= Data;
}unsigned char Read_Data_Port ( void ) { /* 读D0至D7的数据 */return ( LPC_GPIO2->DATA );
}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;
}/* 参数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 ( 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 ) {LCD_GPIO_Init();Delay_Ms ( 15 );/* 设置“16*2”显示,“5*7”点阵,8位数据传送,不检测忙信号 */Write_LCD_command ( 0x38, 0 );Delay_Ms ( 5 );Write_LCD_command ( 0x38, 0 );Delay_Ms ( 5 );Write_LCD_command ( 0x38, 0 );Delay_Us ( 100 );/* 设置“16*2”显示、“5*7”点阵、8位数据传送、检测忙信号 */Write_LCD_command ( 0x38, 1 );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 ); /* 显示功能开、无光标、检测忙信号 */
}/* 参数gadd_start是列号,gline是行号,glength是数据长度,pdata是数组元素 */
void Display_LCD_string (unsigned char gadd_start, unsigned char gline,unsigned char glength, const unsigned char *pdata ) {unsigned char gaddress;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++;}
}/* 参数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 );
}/* 参数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

LPC11XX驱动LCD1602程序相关推荐

  1. 通过 I2C 驱动 LCD1602 液晶屏(51单片机)

    通过 I2C 驱动 LCD1602 液晶屏(51单片机) 硬件实物 原理图 3.程序 #include <reg51.h> #include <intrins.h>#defin ...

  2. PCF8574AT驱动LCD1602

    STM32用IIC驱动LCD1602 介绍 PCF8574AT 选址 芯片接线图 LCD1602 显示问题 乱码问题 实现代码 介绍 网上寻遍了资料发现驱动LCD1602液晶屏的程序几乎都是4线或8线 ...

  3. stm32cubeide驱动LCD1602显示屏

    STM32驱动LCD1602 硬件连接关系 STM32CUBEIDE设置 代码 项目设置 最后运行 硬件连接关系 LCD1602 STM32 VCC VCC GND GND VO VCC-滑动变阻 R ...

  4. 树莓派通过I2C驱动LCD1602显示屏

    问题来源 在此之前学习了Arduino驱动LCD1602(Arduino通过I2C控制1602LCD显示屏),其过程比较简单,现在想通过树莓派实现控制功能,提升树莓派编程控制能力,在此过程中虽然能正常 ...

  5. C语言应用到SSD,SSD1963的样例程序 c语言驱动读写程序.doc

    SSD1963的样例程序 c语言驱动读写程序 /* STC89C54RD+的flash空间从0x4000~0xf3ff 共90个扇区,每扇区512字节*/ //#define BaseAddr0x10 ...

  6. 51单片机驱动——LCD1602

    51单片机驱动--LCD1602 1.描述 51单片机控制LCD1602屏幕显示测量数据.固定字符串等,大家复制过去可以直接使用,相关注释我已标明. 2.子文件 LCD1602.c #include ...

  7. 51单片机使用 8线/4线/PCF8574(I2C) 驱动 LCD1602

    51单片机使用 8线/4线/PCF8574_I2C驱动 LCD1602 一.8线驱动 二.4线驱动 三.PCF8574(I2C) 驱动 1.PCF8574 介绍 2.接线图 3.示例代码 一.8线驱动 ...

  8. 【STM32】驱动LCD1602液晶8线并、4线并

    目录 LCD1602液晶 引脚定义说明 字库概述 LCD1602原理图 LCD1602时序图 LCD1602代码 接线图 用结构体的方式显示字符 LCD1602动态显示数字 4线驱动LCD1602 L ...

  9. c语言m62429音量控制程序,音量控制M62446的驱动C程序

    音量控制M62446的驱动C程序音量控制M62446m62446 pdf //------------------------------------------------------------- ...

  10. 无法驱动此程序因为计算机,无法驱动此程序,因为计算机中丢失vcomp100.dll解决办法...

    西安兵马俑在线3月18日讯升级QQ等操作的时候会提示无法驱动此程序,因为计算机中丢失vcomp100.dll,这时候怎么办呢?其实简单,系统中少了微软的组建,可安装这个 Microsoft Visua ...

最新文章

  1. stm32难不难学,没学51单片机可以直接学STM32吗?
  2. Excel VBA两两个体距离矩阵转化为数据库格式
  3. LeetCode算法题-Nth Digit(Java实现)
  4. android 代码打开权限,android开发权限询问的示例代码
  5. Debian下配置SSH服务器的方法
  6. sap开发-采购订单更改历史table
  7. oracle restart 静默安装,CentOS下静默安装Oracle 10.2.0.1.0
  8. ubuntu64位 oracle 11g,64位Ubuntu安装Oracle11G
  9. Fragment创建添加切换和对应底部导航(二)
  10. HEVC-CABAC
  11. HTML 中CSS 图像详解
  12. 用VS编译出可独立运行的程序
  13. 用unity制作能量护盾(3)
  14. 什么是python装饰器_深入理解 Python 装饰器
  15. 使用vcpkg安装指定版本的开源软件
  16. SpringBoot项目实现网络测速功能
  17. 爬取豆瓣250本书籍
  18. 生命细胞游戏的C++实现
  19. 微信小程序分享页面,分享到朋友圈
  20. 画一个带统计检验的PCoA分析结果

热门文章

  1. java swing浏览器_浏览器控件JxBrowser Swing开发者快速入门指南
  2. Java常见异常类【整理】
  3. WiFi抓包图形化版本
  4. oracle 7天密码过期,oracle密码过期ORA-28002: 7天之后口令将过期的解决方法
  5. [深大深鸿会]利用DevEco Studio从零开发OpenHarmony小游戏——2048(上)
  6. python版多变量灰色预测
  7. 图形化UDP发包小工具
  8. 异步社区两周年 - 技术图书免费送(活动已结束)
  9. linux war 权限,Linux中mv重命名作用及打包war压缩文件及分配权限
  10. 源码智造编辑器客户端v1.0.0 官方版