LPC11XX驱动LCD1602程序
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程序相关推荐
- 通过 I2C 驱动 LCD1602 液晶屏(51单片机)
通过 I2C 驱动 LCD1602 液晶屏(51单片机) 硬件实物 原理图 3.程序 #include <reg51.h> #include <intrins.h>#defin ...
- PCF8574AT驱动LCD1602
STM32用IIC驱动LCD1602 介绍 PCF8574AT 选址 芯片接线图 LCD1602 显示问题 乱码问题 实现代码 介绍 网上寻遍了资料发现驱动LCD1602液晶屏的程序几乎都是4线或8线 ...
- stm32cubeide驱动LCD1602显示屏
STM32驱动LCD1602 硬件连接关系 STM32CUBEIDE设置 代码 项目设置 最后运行 硬件连接关系 LCD1602 STM32 VCC VCC GND GND VO VCC-滑动变阻 R ...
- 树莓派通过I2C驱动LCD1602显示屏
问题来源 在此之前学习了Arduino驱动LCD1602(Arduino通过I2C控制1602LCD显示屏),其过程比较简单,现在想通过树莓派实现控制功能,提升树莓派编程控制能力,在此过程中虽然能正常 ...
- C语言应用到SSD,SSD1963的样例程序 c语言驱动读写程序.doc
SSD1963的样例程序 c语言驱动读写程序 /* STC89C54RD+的flash空间从0x4000~0xf3ff 共90个扇区,每扇区512字节*/ //#define BaseAddr0x10 ...
- 51单片机驱动——LCD1602
51单片机驱动--LCD1602 1.描述 51单片机控制LCD1602屏幕显示测量数据.固定字符串等,大家复制过去可以直接使用,相关注释我已标明. 2.子文件 LCD1602.c #include ...
- 51单片机使用 8线/4线/PCF8574(I2C) 驱动 LCD1602
51单片机使用 8线/4线/PCF8574_I2C驱动 LCD1602 一.8线驱动 二.4线驱动 三.PCF8574(I2C) 驱动 1.PCF8574 介绍 2.接线图 3.示例代码 一.8线驱动 ...
- 【STM32】驱动LCD1602液晶8线并、4线并
目录 LCD1602液晶 引脚定义说明 字库概述 LCD1602原理图 LCD1602时序图 LCD1602代码 接线图 用结构体的方式显示字符 LCD1602动态显示数字 4线驱动LCD1602 L ...
- c语言m62429音量控制程序,音量控制M62446的驱动C程序
音量控制M62446的驱动C程序音量控制M62446m62446 pdf //------------------------------------------------------------- ...
- 无法驱动此程序因为计算机,无法驱动此程序,因为计算机中丢失vcomp100.dll解决办法...
西安兵马俑在线3月18日讯升级QQ等操作的时候会提示无法驱动此程序,因为计算机中丢失vcomp100.dll,这时候怎么办呢?其实简单,系统中少了微软的组建,可安装这个 Microsoft Visua ...
最新文章
- stm32难不难学,没学51单片机可以直接学STM32吗?
- Excel VBA两两个体距离矩阵转化为数据库格式
- LeetCode算法题-Nth Digit(Java实现)
- android 代码打开权限,android开发权限询问的示例代码
- Debian下配置SSH服务器的方法
- sap开发-采购订单更改历史table
- oracle restart 静默安装,CentOS下静默安装Oracle 10.2.0.1.0
- ubuntu64位 oracle 11g,64位Ubuntu安装Oracle11G
- Fragment创建添加切换和对应底部导航(二)
- HEVC-CABAC
- HTML 中CSS 图像详解
- 用VS编译出可独立运行的程序
- 用unity制作能量护盾(3)
- 什么是python装饰器_深入理解 Python 装饰器
- 使用vcpkg安装指定版本的开源软件
- SpringBoot项目实现网络测速功能
- 爬取豆瓣250本书籍
- 生命细胞游戏的C++实现
- 微信小程序分享页面,分享到朋友圈
- 画一个带统计检验的PCoA分析结果
热门文章
- java swing浏览器_浏览器控件JxBrowser Swing开发者快速入门指南
- Java常见异常类【整理】
- WiFi抓包图形化版本
- oracle 7天密码过期,oracle密码过期ORA-28002: 7天之后口令将过期的解决方法
- [深大深鸿会]利用DevEco Studio从零开发OpenHarmony小游戏——2048(上)
- python版多变量灰色预测
- 图形化UDP发包小工具
- 异步社区两周年 - 技术图书免费送(活动已结束)
- linux war 权限,Linux中mv重命名作用及打包war压缩文件及分配权限
- 源码智造编辑器客户端v1.0.0 官方版