基于STM32的1602 LCD驱动程序

合集下载

stm32_lcd1602

stm32_lcd1602

if(temp&0x20) GPIO_SetBits(PORT,PORT_5);
else GPIO_ResetBits(PORT,PORT_5);
if(temp&0x40) GPIO_SetBits(PORT,PORT_6);
else GPIO_ResetBits(PORT,PORT_6);
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
// D0-----D7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_6
while(ms--)
{
for(j=0;j<220;j++)
{;}
}
}
/*LCD1602 忙等待*/
void lcd_busy_wait(void)
{
lcd_rs_port_clear
lcd_rw_port_set
}
/*LCD1602 命令字写入*/
void lcd_command_write(unsigned char command)
{
lcd_busy_wait();
lcd_rs_port_clear
lcd_rw_port_clear
lcd_en_port_clear
#define lcd_en_port_clear GPIO_ResetBits(PORT_CMD,E_CMD);
//1602 数据口

STM32的1602程序(精校版本)

STM32的1602程序(精校版本)

#ifndef LCD1602_STM32_H#define LCD1602_STM32_H#define LCD_RS_1 GPIOE->BSRR=GPIO_Pin_0 //PE.0--(LCD)RS#define LCD_RS_0 GPIOE->BRR =GPIO_Pin_0#define LCD_RW_1 GPIOE->BSRR=GPIO_Pin_1 //PE.1--(LCD)RW#define LCD_RW_0 GPIOE->BRR =GPIO_Pin_1#define LCD_EN_1 GPIOE->BSRR=GPIO_Pin_2 //PE.2--(LCD)E#define LCD_EN_0 GPIOE->BRR =GPIO_Pin_2#define DATAOUT GPIOD->ODR //PD[0..7]--(LCD)D0~D7#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endifextern void delay_nms(unsigned long n);extern void delay_nus(unsigned long n);uint8_t LCD_busy(void); //读LCD忙碌状态,直到LCD1602不忙为止void Wait_Leisure(void);//一直等待到LCD1602空闲void LCD_WriteInitcmd(uchar cmd);//写入LCD初始化时的命令,不可以检测忙状态void LCD_Writecmd(uchar cmd);//写指令到LCD1602,指令数据占一个字节void LCD_Writedata(uchar dat);//写一字节数据到LCD1602 void LCD_pos(uchar pos);//设定显示位置00h~27h,40h~47h void LCD_Setpos(uchar row,uchar col);//根据习惯设定显示位置void LCD_DispChar(char ch);//显示一个字符void LCD_Setpos_DispChar(uchar row,uchar col,char ch);//在指定位置显示一个字符void LCD_DispString(char str[]);//使LCD1602显示一个字符串,显示位置需提前设定void LCD_Setpos_DispString(uchar row,uchar col,char str[]);//使LCD1602从指定位置开始显示一个字符串void LCD_Dispnum(uint32_t num);//显示一个不超过8位的整数,显示位置需提前设置void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num);//在指定位置显示一个不超过8位的整数void LCD_DispDecimal(uint32_t num,uchar dot);//显示一个有效位不超过8位的浮点数,显示位置需要提前设定//在指定位置显示一个有效位不超过8位的浮点数void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot);//显示日历,显示日期与时间void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec);//显示秒表,显示时,分,秒,10毫秒,精确到10msvoid LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms);//显示频率计,动态自动调整频率显示void LCD_DispFreq(uint32_t freq);void LCD_ShiftLeft(void);//屏幕整体左移一格,用于滚动显示void LCD_ShiftRight(void);//屏幕整体右移一格,用于滚动显示void LCD_Clear(void);//清屏,清除显示void LCD_Return(void);//使光标还回原点位置void LCD_Close(void);//关显示。

STM32的1602程序

STM32的1602程序

STM32的1602程序#ifndef LCD1602_STM32_H#define LCD1602_STM32_H#define LCD_RS_1 GPIOE->BSRR=GPIO_Pin_0 //PE.0--(LCD)RS#define LCD_RS_0 GPIOE->BRR =GPIO_Pin_0#define LCD_RW_1 GPIOE->BSRR=GPIO_Pin_1 //PE.1--(LCD)RW#define LCD_RW_0 GPIOE->BRR =GPIO_Pin_1#define LCD_EN_1 GPIOE->BSRR=GPIO_Pin_2 //PE.2--(LCD)E#define LCD_EN_0 GPIOE->BRR =GPIO_Pin_2#define DATAOUT GPIOD->ODR //PD[0..7]--(LCD)D0~D7#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endifextern void delay_nms(unsigned long n);extern void delay_nus(unsigned long n);uint8_t LCD_busy(void); //读LCD忙碌状态,直到LCD1602不忙为止void Wait_Leisure(void);//一直等待到LCD1602空闲void LCD_WriteInitcmd(uchar cmd);//写入LCD初始化时的命令,不可以检测忙状态void LCD_Writecmd(uchar cmd);//写指令到LCD1602,指令数据占一个字节void LCD_Writedata(uchar dat);//写一字节数据到LCD1602void LCD_pos(uchar pos);//设定显示位置00h~27h,40h~47h void LCD_Setpos(uchar row,uchar col);//根据习惯设定显示位置void LCD_DispChar(char ch);//显示一个字符void LCD_Setpos_DispChar(uchar row,uchar col,char ch);//在指定位置显示一个字符void LCD_DispString(char str[]);//使LCD1602显示一个字符串,显示位置需提前设定void LCD_Setpos_DispString(uchar row,uchar col,char str[]);//使LCD1602从指定位置开始显示一个字符串void LCD_Dispnum(uint32_t num);//显示一个不超过8位的整数,显示位置需提前设置void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_tnum);//在指定位置显示一个不超过8位的整数void LCD_DispDecimal(uint32_t num,uchar dot);//显示一个有效位不超过8位的浮点数,显示位置需要提前设定//在指定位置显示一个有效位不超过8位的浮点数void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot);//显示日历,显示日期与时间void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec);//显示秒表,显示时,分,秒,10毫秒,精确到10msvoid LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms);//显示频率计,动态自动调整频率显示void LCD_DispFreq(uint32_t freq);void LCD_ShiftLeft(void);//屏幕整体左移一格,用于滚动显示void LCD_ShiftRight(void);//屏幕整体右移一格,用于滚动显示void LCD_Clear(void);//清屏,清除显示void LCD_Return(void);//使光标还回原点位置void LCD_Close(void);//关显示void LCD_Open(void);//开显示void LCD_FlickerChar(uchar row,uchar col);//使指定位置字符闪烁,不显示光标void LCD_CloseFlicker(void);//关闭字符闪烁void LCD_FlickerScreen(void);//屏幕秒闪烁一次/************************************************************** ******* *名称:LCD_Init()*功能:初始化LCD1602*入口参数:无*出口参数:无*常用命令:0x38:16*2显示,5*&点阵显示字符,8位数据;指令执行时间40us* 0x0C:开显示,关光标40us* 0x08:关显示,关光标40us* 0x0D:字符闪烁,关光标,接着设定位置,闪烁周期0.4ms左右* 0x0F:字符闪烁,开光标* 0x06:写完数据自动右移光标,普通情形,从左向右显示40us * 0x04:写完数据自动左移光标,可以从右向左显示40us* 0x01:清除显示内容,即清屏 1.64ms* 0x02:使光标还回起始位置 1.64ms* 0x18:屏幕上所有字符同时左移一格,适合滚动显示40us* 0x1C:屏幕上所有字符同时右移一格,适合滚动显示40us*************************************************************** ******/ void LCD_Init(void);#endif/************************************************************** ******* * 文件名称:LCD1602.C* 功能:为51单片机提供LCD1602驱动程序,解决LCD1602与上层软件的隔离问题* by:追梦2011-4-5*************************************************************** ******/ #include "stm32f10x.h"#include "LCD1602.h"#ifndef LCD1602_STM32_C#define LCD1602_STM32_C/************************************************************** ******* *名称:LCD_busy()*功能:读LCD忙碌状态,直到LCD1602不忙为止*入口参数:无*出口参数:无符号字节类型,返回0表示LCD已经操作完毕,空闲。

LCD1602驱动程序

LCD1602驱动程序

1602是课程设计和毕业设计经常用到的显示器,还在愁怎么对1602操作吗?那么看完1602驱动程序,一切变得那么简单。

LCD1602驱动程序://===========LCD1602.H===============#ifndef _LCD1602_H__#define _LCD1602_H__#include<intrins.h>#include"delay.h"//lcd1602管脚定义#define LCD_Data P0 //第7~14脚:D0~D7为8位双向数据线#define Busy 0x80 //用于检测LCM状态字中的Busy标识sbit LCD_RS=P2^0; //寄存器选择位,将LCD_RS位定义为P2.0引脚sbit LCD_RW=P2^1; //读写选择位,将LCD_RW位定义为P2.1引脚sbit LCD_E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚//函数定义声明bit BusyTest(void);//判断液晶模块的忙碌状态void WriteInstruction (unsigned char );//将模式设置指令或显示地址写入液晶模块//void WriteAddress(unsigned char ); //指定字符显示的实际地址void WriteData(unsigned char );//将数据(字符的标准ASCII码)写入液晶模块void CursorFlash(unsigned char,unsigned char); //光标在指定坐标闪烁void InitLcd(void);//初始化LCD1602/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。

基于STM32单片机LCD多级菜单的设计

基于STM32单片机LCD多级菜单的设计

基于STM32单片机LCD多级菜单的设计摘要本设计介绍了以ARM内核嵌入式处理器STM32为控制核心,辅以低功耗的液晶模块MFG240160-3-A,以及相应的按键控制电路,实现了LCD多级菜单的设计。

在本系统中,侧重点在于LCD的显示上,因此此系统的硬件结构很简单,侧重点在于软件架构及程序的编写上,该系统程序量大,函数封装多,关于实时时钟信息、波形存储信息都留有相应的软件接口,以便与其它模块正确的相连接。

本系统硬件电路简单,但显示信息丰富,可以移植到各种便携式的电子产品上去,为电子产品的显示界面的设计提供了一个新的思路。

关键词 STM32单片机;LCD多级菜单;低功耗;Base on STM32 Microprocessor LCD modules in the multi-level menu display systemAbstractThis design describes to STM32 embedded processor based on ARM core for control, coupled with low power consumption of LCD module MFG240160-3-A as well as the corresponding keys control circuitry, enabling multi-level menu design of LCD. In this system, the focus is on the LCD display, so this system hardware structure is very simple, the emphasis lies in software architectures and applications, the system capacity, function encapsulates the information about the real-time clock, waveform stored information will have the appropriate software interface so that correct with other modules that you are connecting to. This system is simple, but the display information-rich, portable to avariety of portable electronic products, for electronic product display interface design provides a new train of thought.Keywords: STM32; LCD multi-level menu; low-power;目录摘要(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((I Abstract(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( ((II 前言 ............................................................... 4 1方案设计 (5)1.1 设计方案概述 (5)1.2 电路介绍 (5)2 器件介绍 (9)2.1 STM32简介 (9)2.2 MFG240160-3-A LCD介绍 (13)3 软件设计 (16)3.1 STM32单片机的初始化 (16)3.2 液晶屏的初始化 (20)3.3 数据的传输 (20)3.4 字模的提取 (21)3.5 菜单框架的设计 (23)3.6 字模库的建立 (25)3.7 函数库的封装 (25)3.8 菜单标记 (26)3.9 时钟信息的显示 (27)3.10 波形的显示 (28)4 结论 (30)参考文献 (31)致谢 ............................................ 错误~未定义书签。

液晶1602 C语言驱动程序

液晶1602 C语言驱动程序
HC1602WriteCmd(systemtab[i]);
delaytime(10);
}
}
//清屏
void HC1602fullclear()
{
HC1602WriteCmd(0x01);
delaytime(10);
}
/*--------------------------------------------------------------------
{
uint i;
while(n--)
for(i=0;i<200;i++);
}
uint HC1602busy()
{
uchar i;
SysCtlPeripheralEnable(GPIO_PORTA_BASE );
GPIOPinTypeGPIOInput(GPIO_PORTA_BASE , 0xff);
LCD_ESysCtlPeripheralEnable(GPIO_PORTA_BASE );
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE , 0xff);
return busyflag;
}
void HC1602WriteCmd(uchar uldata) //写命令
函数功能: 在1602液晶显示屏上显示一连串的字符串
输入说明: startline:显示起始行 startrow :显示的起始列
uldata:要显示的字符
返回 值 :
说 明:
--------------------------------------------------------------------*/

基于STM32的LCD驱动程序设计与实现

基于STM32的LCD驱动程序设计与实现

基于STM32的LCD驱动程序设计摘要:本文主要是对TFT-LCD(薄膜晶体管液晶显示器)进行相关的驱动程序设计,不同于以往常规的点阵屏和最原始的黑白显示屏,它的优点在于显示出的图像更亮、色彩更加艳丽、成像速度更快。

相当符合当前我们的主流产品,例如现在的各种电子产品,特别是汽车行业更是使用广泛。

近些年在不断更新电子技术的同时我们本身的基础技术也是一天一天的变化。

因为我们对现在的电子产品要求变高,使得对LCD显示成像的要求就变高,再加上我们对嵌入式工程的进一步推进。

因此,对于将嵌入式系统移植到所需要的驱动模块上去也就成为主流,正因为于此,对LCD 的驱动设计是很有意义和价值的。

关键词:TFT-LCD;显示;彩色界面Abstract:This paper is mainly about the design of TFT-LCD (thin film transistor liquid crystal display),which is different from the conventional dot matrix screen and the most original black and white display screen. Its advantages are that the image is brighter,the color is brighter,and the speed of the imaging is faster. It is quite consistent with our current mainstream products,for example,various electronic products,especially the automotive industry,are widely used.In recent years, while constantly updating the electronic technology, our basic technology is also changing day by day. Because our requirements for current electronic products are higher, the requirement for LCD display imaging becomes higher, and our embedded engineering is further pushed forward. Therefore, it is also the mainstream for the embedded system to be transplanted to the required driver modules. Because of this, the driver design of LCD is of great significance and value.Key words:TFT-LCD;Display;Color shape interface目录摘要 (I)Abstract (I)目录 (II)1 绪论 (1)1.1 研究背景 (1)1.2 选题目的 (1)1.3 研究内容 (1)2 开发环境与技术 (2)2.1 开发环境 (2)2.1.1 MDK软件安装 (2)2.1.2 USB串口驱动安装 (2)2.2 开发技术 (2)2.2.1 C语言 (3)2.2.2 ILI9341 液晶控制器 (3)2.2.3 ILI9341指令 (4)3 TFT-LCD简介 (8)3.1 TFT-LCD特点 (8)3.2 外观图如下 (9)3.3 原理图如下 (9)3.4 接口定义图如下 (9)3.5 TFT-LCD 模块的使用流程如图如下 (10)4 系统设计 (11)4.1 硬件设计 (11)4.2 软件设计 (12)4.2.1 关键结构体 (12)4.2.2 ILI9341.c 里面的一些重要函数 (13)4.2.3 lcd.h 文件相关配置 (24)4.2.4 main()主函数代码 (25)5 系统功能实现及测试 (27)5.1 测试目的 (27)5.2 测试过程 (27)5.3 测试结果 (28)总结 (30)参考文献 ................................................................................................... 错误!未定义书签。

STM32的LCD1602显示程序

STM32的LCD1602显示程序

STM32的LCD1602显⽰程序STM32的LCD1602显⽰程序以下为课设期间为1602显⽰屏驱动写的stm32的程序,其中参考了许多⼤佬的例⼦程序设计:硬件原理:D0-D7⽤的是PD0-PD7,RS为PB10,E为PB11,RW为PB12,使⽤的板⼦是STM32F103VET6下⾯是我的程序,只完成了基础功能,并没有⾃定义字模部分的代码lcd.h#ifndef __LCD_H#define __LCD_H#include "stm32f10x.h"/////////////////////////////////////////////////////////#define D0_1 GPIO_SetBits(GPIOD,GPIO_Pin_0)#define D0_0 GPIO_ResetBits(GPIOD,GPIO_Pin_0)#define D1_1 GPIO_SetBits(GPIOD,GPIO_Pin_1)#define D1_0 GPIO_ResetBits(GPIOD,GPIO_Pin_1)#define D2_1 GPIO_SetBits(GPIOD,GPIO_Pin_2)#define D2_0 GPIO_ResetBits(GPIOD,GPIO_Pin_2)#define D3_1 GPIO_SetBits(GPIOD,GPIO_Pin_3)#define D3_0 GPIO_ResetBits(GPIOD,GPIO_Pin_3)#define D4_1 GPIO_SetBits(GPIOD,GPIO_Pin_4)#define D4_0 GPIO_ResetBits(GPIOD,GPIO_Pin_4)#define D5_1 GPIO_SetBits(GPIOD,GPIO_Pin_5)#define D5_0 GPIO_ResetBits(GPIOD,GPIO_Pin_5)#define D6_1 GPIO_SetBits(GPIOD,GPIO_Pin_6)#define D6_0 GPIO_ResetBits(GPIOD,GPIO_Pin_6)#define D7_1 GPIO_SetBits(GPIOD,GPIO_Pin_7)#define D7_0 GPIO_ResetBits(GPIOD,GPIO_Pin_7)#define RS_1 GPIO_SetBits(GPIOB,GPIO_Pin_10)#define RS_0 GPIO_ResetBits(GPIOB,GPIO_Pin_10)#define RW_1 GPIO_SetBits(GPIOB,GPIO_Pin_12)#define RW_0 GPIO_ResetBits(GPIOB,GPIO_Pin_12)#define E_1 GPIO_SetBits(GPIOB,GPIO_Pin_11)#define E_0 GPIO_ResetBits(GPIOB,GPIO_Pin_11)/////////////////////////////////////////////////////////void LCD_Init(void);//初始化void LCD_Clear(void);//清除显⽰void LCD_CursorReset(void);//光标返回void LCD_SetInput(u16,u16);//置输⼊模式void LCD_Display(u16,u16,u16);//显⽰开关控制void LCD_COD(u16,u16);//光标或显⽰移动指令void LCD_Mode(u16,u16,u16);//⼯作⽅式设置void LCD_CGRAM_Addr(u8);//设置CGRAN地址,除置位位以外共六位void LCD_DDRAM_Addr(u8);//设置DDRAM地址,除置位位以外共七位void LCD_RB(void);//当1602处于忙状态时,不接受指令,当不忙时,接受指令void LCD_Write(u8);//写⼊数据void LCD_Read(void);//读取数据void LCD_WriteStr(u8*,int);//写⼊字符串#endiflcd.c#include "lcd.h"#include "stm32f10x_gpio.h"void LCD_Init(void){GPIO_InitTypeDef GPIO_LCDStr;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_LCDStr.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_LCDStr.GPIO_Speed=GPIO_Speed_50MHz;GPIO_LCDStr.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_Init(GPIOD,&GPIO_LCDStr);GPIO_LCDStr.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_10;GPIO_Init(GPIOB,&GPIO_LCDStr);}//////////////////////////////////////////////////////////////////////////////void LCD_Clear(void){E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x01);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////void LCD_CursorReset(void){E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x02);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////////void LCD_SetInput(u16 ID,u16 S){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_0;D3_0;D2_1;if(ID==1)/*⾼电平光标右移,低电平左移*/D1_1;else if(ID==0)D1_0;if(S==1)/*屏幕上所有的⽂字是否左移或右移,⾼电平有效,低电平⽆效*/ D0_1;else if(S==0)D0_0;E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////////////void LCD_Display(u16 D,u16 C,u16 B){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_0;D3_1;if(D==1)//⾼电平开,低电平关D2_1;else if(D==0)D2_0;if(C==1)//⾼电平有光标,低电平⽆光标D1_1;else if(C==0)D1_0;if(B==1)//光标是否闪烁,⾼电平闪烁,低电平⽆D0_1;else if(B==0)D0_0;E_1;E_0;}////////////////////////////////////////////////////////////////////////////////////////////void LCD_COD(u16 SC,u16 RL){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_1;D1_1;D0_1;if(SC==1)//⾼电平显⽰移动的⽂字,低电平移动坐标D3_1;else if(SC==0)D3_0;if(RL==1)//⾼电平右移,低电平左移D2_1;else if(RL==0)D2_0;E_1;E_0;}////////////////////////////////////////////////////////////////////////////////////////////void LCD_Mode(u16 DL,u16 N,u16 F){E_0;LCD_RB();E_1;RS_0;RW_0;D7_0;D6_0;D5_1;D1_1;D0_1;if(DL==1)//⾼电平⼋位数据接⼝,低电平四位数据接⼝D4_1;else if(DL==0)D4_0;if(N==1)//⾼电平两⾏显⽰,低电平⼀⾏显⽰D3_1;else if(N==0)D3_0;if(F==1)//⾼电平5x10点阵,低电平5x8点阵D2_1;else if(F==0)D2_0;E_0;}////////////////////////////////////////////////////////////////////////////////////////void LCD_CGRAM_Addr(u8 addr)//{E_0;LCD_RB();RS_0;RW_0;D6_1;E_1;E_0;}//////////////////////////////////////////////////////////////////////////////void LCD_DDRAM_Addr(u8 addr)//{E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x0000);//清空地址GPIO_Write(GPIOD,addr);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////void LCD_RB(void)//{GPIO_InitTypeDef pp;RS_0;RW_1;pp.GPIO_Mode=GPIO_Mode_IN_FLOATING;pp.GPIO_Speed=GPIO_Speed_50MHz;pp.GPIO_Pin=GPIO_Pin_7;GPIO_Init(GPIOD,&pp);//将端⼝设为输⼊E_1;while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7));//若忙信号存在,则⼀直循环,直⾄忙信号结束E_0;pp.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; pp.GPIO_Mode=GPIO_Mode_Out_PP;pp.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&pp);//将端⼝重新设为输出}//////////////////////////////////////////////////////////////////////////////////////////void LCD_Write(u8 data)//{LCD_RB();RS_1;RW_0;E_1;GPIO_Write(GPIOD,data);E_0;}////////////////////////////////////////////////////////////////////////////void LCD_Read(void)//{LCD_RB();RS_1;RW_1;E_1;E_0;}////////////////////////////////////////////////////////////////////////////void LCD_WriteStr(u8 *str,int length)//{int i=0;for(i=0;i<length;i++){if(i<=15){LCD_DDRAM_Addr(0x80+i);LCD_Write(str[i]);}else{LCD_DDRAM_Addr(0xc0+i-16);LCD_Write(str[i]);}}}main.c#include "lcd.h"#include "string.h"int main(){u8 strMCU[]=" **** YOU 1602! TEST TEST "; LCD_Init();LCD_Clear();LCD_SetInput(1,0);LCD_Display(1,0,0);LCD_Mode(1,1,0);LCD_WriteStr(strMCU,strlen(strMCU));。

LCD1602驱动及显示计数值程序

LCD1602驱动及显示计数值程序
1.6.2 显示开/关及光标设置
1.6.3 数据指针设置 1.6.4 其它设置
5
1.7 外形
嵌入式应用软件园,版权所有,请勿转载/销售。
6
嵌入式应用软件园,版权所有,请勿转载/销售。
第 2 章 程序功能
程序中包含 LCM 用到的所有函数:初始化、写指令、写数据、判忙碌、清屏 幕。
单片机外接 2x2 (P3.7,P3.6 与 P3.0,P3.1)矩阵键盘,利用定时器 T0 的定时中断, 查询矩阵键盘。矩阵键盘被命名为 A、B、C、D。对键盘被按下的次数进行计数, 计数值会在 LCM 上显示。
LCM 与单片机的连接
7
嵌入式应用软件园,版权所有,请勿转载/销售。
第 3 章 程序代码
我们的辛勤付出,需要您的肯定,请访问: 嵌入式应用软件园。
;******************************************************************************
9
嵌入式应用软件园,版权所有,请勿转载/销售。
LCALL WRITE_DATA MOV A,#10001010B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;显示 C: MOV A,#11000000B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#43H LCALL WRITE_DATA MOV A,#11000001B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;显示 D: MOV A,#11001001B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#44H LCALL WRITE_DATA MOV A,#11001010B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;计数的循环,一直执行,永不跳出 START: MOV LCM_P,#10000010B ;数据指针(显示地址设置) MOV R0,#A4 LCALL DISP MOV LCM_P,#10001011B ;数据指针(显示地址设置) MOV R0,#B4 LCALL DISP MOV LCM_P,#11000010B ;数据指针(显示地址设置) MOV R0,#C4 LCALL DISP MOV LCM_P,#11001011B ;数据指针(显示地址设置) MOV R0,#D4 LCALL DISP LJMP START

1602程序

1602程序

1602程序
简介
1602程序是一种用于控制1602液晶屏幕的程序。

1602
液晶屏幕是一种常见的单色液晶显示屏,广泛应用于各种电子设备中。

这个程序能够实现在1602液晶屏幕上显示文本、数字和特殊字符等功能。

功能
1602程序具有以下功能:
1.文本显示:程序可以在1602液晶屏幕上显示自定
义的文本信息,可以显示多行文本,并且支持中英文字符。

2.数字显示:程序可以在1602液晶屏幕上显示数字,
并支持数字的滚动显示功能。

3.特殊字符显示:程序支持在1602液晶屏幕上显示
特殊字符,比如箭头、心形等。

使用方法
用户可以按照以下步骤来使用1602程序:
1.连接1602液晶屏幕:首先,将1602液晶屏幕与
单片机或其他控制器正确连接。

确保数据线和控制线的接口连接正确。

2.导入1602程序:将1602程序的代码导入到单片
机或其他控制器中,例如Arduino等。

3.设置程序参数:根据实际需求,在程序中设置相应
参数,例如要显示的文本内容、数字等。

4.运行程序:将控制器与电源连接,运行程序,即可
在1602液晶屏幕上看到相应的显示效果。

示例代码
下面是一个示例代码,演示了如何使用1602程序显示文本和数字:
```markdown #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() { lcd.begin(16, 2); lcd.print(。

LCD1602显示屏的驱动设置及例程

LCD1602显示屏的驱动设置及例程

LCD160湿示屏的驱动设置及例程一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。

我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。

如图1所示:再来一张它的反面的,如图2所示:L 1 J J引脚号符号引脚说明引脚号符号引脚说明1VSS电源地9D2数据端口2VDD电源正极10D3数据端口3VO偏压信号11D4数据端口4RS命令/数据12D5数据端口5RW读/写13D6数据端口6E使能14D7数据端口7D0数据端口15A背光正极8D1数据端口16K背光负极图2它的16条引脚定义如下:对这个表的说明:1. VSS®电源地。

2. VD或+5V。

3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。

或同样阻值的RM065/RM 063蓝白可调电阻。

见图3。

图34. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。

5. RW是读/写选择引脚,接单片机的一个I/O,当RW伪低电平时,向LCD1602写入命令或数据;当RW 的高电平时,从LCD160狠取状态或数据。

如果不需要进行读取操作,可以直接将其接VSS6. E,执行命令的使能引脚,接单片机的一个I/O。

7. D卜D7,并行数据输入/输出引脚,可接单片机的P0—— 10K的上拉电阻。

如果是4 线并行驱动,只须接4个I/O 口。

8. A背光正极,可接一个10-47欧的限流电阻到VDD9. K背光负极,接VSS见图4所示。

二.根本操作LCD1602的根本操作分为四种:1. 读状态:输入RS=0 RW=1 E=高脉冲输出: D卜D7为状态字。

2. 读数据:输入RS=1, RW=1 E=高脉冲输出: D卜D7为数据。

3. 写命令:输入RS=0 RW=0 E=高脉冲输出: 无。

4. 写数据:输入RS=1, RW=0 E=高脉冲输出: 无。

LCD1602驱动-STM32程序

LCD1602驱动-STM32程序
Delay(0xFFFFFF);
//Delay(0xFFFFFF);
//Delay(0xFFFFFF);
}
}
/*******************************************************************************
* Function Name : RCC_Configuration
* Return : None
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
debug();
#endif
/* Configure the system clocks */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
/*******************************************************************************
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/*******************************************************************************

STM32F103C8T6控制1602液晶显示

STM32F103C8T6控制1602液晶显示
Delay(20000);
Send_Com(0x80+0x40);
for(num=0;num<10;num++)
{
Send_Dat(table1[num]);
Delay(2000000);
}
while(1);
}
}
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
#define Set_EN (GPIO_SetBits(GPIOB,GPIO_Pin_2))
//定义RS,RW,EN=1时分别是CLR_RS,CLR_RW,CLR_EN
#define CLR_RS (GPIO_ResetBits(GPIOB,GPIO_Pin_0))
#define CLR_RW (GPIO_ResetBits(GPIOB,GPIO_Pin_1))
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
#define CLR_EN (GPIO_ResetBits(GPIOB,GPIO_Pin_2))
GPIO_InitTypeDef GPIO_InitStructure;

基于STM32的1602驱动程序

基于STM32的1602驱动程序
#include "stm32f10x_lib.h" GPIO_InitTypeDef GPIO_InitStructure; //定义数据命令选择端 #define RS_SET GPIO_SetBits(GPIOD,GPIO_Pin_0) #define RS_CLR GPIO_ResetBits(GPIOD,GPIO_Pin_0) //读写控制端 #define RW_CLR GPIO_ResetBits(GPIOD,GPIO_Pin_1) #define RW_SET GPIO_SetBits(GPIOD,GPIO_Pin_1) //使能端 #define EN_CLR GPIO_ResetBits(GPIOD,GPIO_Pin_2) #define EN_SET GPIO_SetBits(GPIOD,GPIO_Pin_2) //延时 nus void delay_nus(unsigned long n) { unsigned long j; while(n--) { j=8; while(j--); } } //延时 nms void DelayMs(unsigned char t) { while(t--) delay_nus(1100); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3| GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*I/O 方向 */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; /*I/O 输出速度*/ GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*I/O 方向 */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; /*I/O 输出速度*/ GPIO_Init(GPIOD, &GPIO_InitStructure); } //判断是否忙

单片机驱动LCD1602A程序

单片机驱动LCD1602A程序

LCALL WRITE_DATA
RET
;******************************************************************************
;函数名:DISP_CGRAM
;输 入:
;
R5---->自选图形数据个数
;
R4---->自选图形序号
;
R3---->自选图形显示位置
9
嵌入式应用软件园,版权所有,请勿转载/销售。
;调 用:无
;描 述:查询忙碌标志信号
;******************************************************************************
CHECK_BUSY:
PUSH ACC
BUSY_LOOP:
CLR E
SETB R_W
CLR RS
SETB E
MOV A, DB0_7
CLR E
JB
ACC.7,BUSY_L
;****************************************************************************** ;函数名:WRITE_COM ;输 入:A ;输 出:无 ;调 用:无 ;描 述:写指令到 LCM ;****************************************************************************** WRITE_COM:
;****************************LCM 与 89C51 接口定义******************************

《STM32单片机开发—基于Proteus虚拟仿真与HAL-LL》课件5.1--LCD1602的应用

《STM32单片机开发—基于Proteus虚拟仿真与HAL-LL》课件5.1--LCD1602的应用

5.1LCD1602显示器的使用能力能力目标:目标:掌握掌握LCD1602LCD1602显示器的驱动方法,能编写简单的显示器的驱动方法,能编写简单的LCD1602LCD1602驱动程序。

驱动程序。

任务要求:仿真电路如图所示,要求在屏幕第一行显示仿真电路如图所示,要求在屏幕第一行显示“Hello “Hello world!”world!”。

5.1.1液晶显示屏与液晶显示屏与LCD1602LCD1602为了能够显示更加丰富的信息,单片机电路设计中往往会使用到液晶显示屏。

这里我们为大家介绍一种极具性价比的单色液晶显示屏的单色液晶显示屏——LCD1602——LCD1602,如图,如图所示。

这种液晶显示屏能够显示所示。

这种液晶显示屏能够显示22行、1616字符字符//行,共计行,共计3232个个5×7或者或者55×1111的的点阵字符,目前市面上大多数点阵字符,目前市面上大多数LCD1602LCD1602显示屏都是采用了显示屏都是采用了HD44780HD44780液晶显示芯液晶显示芯片,当然无论采用了哪种液晶显示芯片,操作方式大同小异。

(1)LCD1602LCD1602的引脚定义的引脚定义LCD1602LCD1602采用标准的采用标准的1616脚接口,详见表。

脚接口,详见表。

引脚编号功能说明1VSS 接电源负极2VDD 电源正极(+5V/+3.3V)3VEE 液晶显示器对比度调节引脚,电压越接近于VDD则对比度越低,相反电压越接近于VSS(0)则对比度越高。

4RS (Register Select)寄存器选择引脚,高电平时选择数据寄存器,低电平时选择指令寄存器。

5RW (Read /Write)读/写信号引脚,高电平时进行读操作,低电平时进行写操作。

6E (Enable)使能引脚,高电平时读取信息,下降沿时执行指令。

7~14D0~D78位数据总线,D0为最低位,D7为最高位。

15A LCD背光源正极16KLCD背光源负极(2)LCD1602LCD1602的存储器的存储器LCD1602LCD1602内置内置DDRAM (Display Data RAM RAM,显示数据随机存储器),显示数据随机存储器)、CGRAM (Character Generator RAM RAM,字符发生随机存储器),字符发生随机存储器)和CGROM (Character Generator ROM ROM,字符发生只读存储器),字符发生只读存储器)。

单片机对1602液晶的驱动

单片机对1602液晶的驱动

单片机对1602液晶的驱动
液晶的操作:
1602液晶只能显示ASCI,今天把1602液晶驱动起来,液晶操作要比数码管简单
液晶的基本操作时序:
1.1读状态:输入:RS = L,RW =H,E = H输出D0~D7
1.2写指令:输入:RS = L,RW = L,D0~D7指令码,E = 高脉冲,输出:无;
RS是数据命令选择端(H/L);
1.3读数据:输入RS= H,RW=H,E=H
1.4写指令:输出,RS = L,RW = L,D0~D7=数据,E=高脉冲
注意:对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0,可以用简单的延时来代替
初始化设置
显示模式设置
指令码:00111000 功能16*2显示,5*7点阵,8为数据接口0x38的指令
显示开/关光标的设置
因此左移和右由N和S设置
数据指针的指令码
80H+地址码(0-27H,40H到67H)
其他设置
指令码01H 功能是显示清屏:1数据指针清零,2所有显示清零
02H显示回车:1数据指针清零
电路图如图所示:
示例代码:动态显示
#include
#include。

STM32液晶屏驱动程序

STM32液晶屏驱动程序

附录2整个设计全部源程序:/*以下是32x64点阵LED电子显示屏的源程序,采用C语言编写,在Keil μVisionV2.38a(C51.Exe V7.06)以及MedWin3.0版环境下均测试通过。

*/ #include <AT89x51.H>unsigned int zimo,xx=0; //zimo是字模计数器,xx为分屏显示的时候的字数。

unsigned char yid,h; //yid为移动计数器,h为行段计数器unsigned char code hanzi[]; //汉字字模unsigned char BUFF[18],BUFF2[18]; //左移显示的缓存void qing(void); void xianshi(void);void fen(void); void zuo(void);void in_data(void); //调整数据void rxd_data(void); //左移发送数据void out_rxd(unsigned char *d); //分屏、上移发送数据char code sw[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x00}; /*8行段码*//***********主程序******************/void main(void){ unsigned char ee;SCON=0;P1=0;yid=0;zimo=0;while(1){ fen(); //分屏显示for(ee=30;ee>0;ee--)//清屏幕3秒{qing();}zuo(); //左移显示for(ee=30;ee>0;ee--){qing();}}}/**********清屏幕*******************/void qing (void){ unsigned char zz,xx=0x0ff;for (zz=33;zz>0;zz--){out_rxd(&xx);}P1=0xff; P1=0; //锁存为高,74HC595锁存信号P2=0; //清74LS138的使能端}/**********分屏显示***********/void fen(void){ do{ xianshi(); }while(xx++<=5); //调用单屏显示xx=0;}/************单屏显示*************/void xianshi(void){ unsigned char ii,jj; unsigned int kk,aa;for (kk=500;kk>0;kk--) //每屏显示500次{for(ii=1;ii<16;ii+=2) //每个汉字分8行扫描{for (jj=0;jj<8;jj++) //每次要发送8个汉字的2个字节,发送8次{ aa=(xx*8+jj)*32+ii;out_rxd(&hanzi[aa]); //从串口输出第1个字的第1字节。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*------------------------- LED像素定义 ------------------------*/
#define LineLen 16 /* 宽 */
#define NumLines 2 /* 高 */
* 参数 : cnt: 延时周期 *
* 无返回 *
/* 设置RS脚为零或者一 */
#define LCD_RS(x) GPIOD->ODR = (GPIOD->ODR & ~PIN_RS) | (x ? PIN_RS : 0);
*/
#define PIN_E ( 1 << 8) //能使端,由高到低,则执行命令
#define PIN_RW ( 1 << 15) //读写信号线
第15~16脚:空脚。
下面是LCD 1602的中文资料:[attach]21234[/attach]
chuen 发表于 2009-1-30 10:17
驱动程序如下:
#include <stm32f10x_lib.h>
#define DELAY_2N 0
#define LCD_DATA_DIR_OUT GPIOE->CRL = (GPIOE->CRL & 0x00000000) | 0x33333333;
/******************************************************************************/
/* 写数据 */
#define LCD_DATA_OUT(x) GPIOE->ODR = (GPIOE->ODR & ~PINS_DATA) | (((SWAP_DATA[x]) << 4));
/* IO口初始化 */
#define LCD_ALL_DIR_OUT GPIOA->CRL = (GPIOA->CRL & 0xFFF00000) | 0x00033333; \
GPIOA->CRH = (GPIOA->CRH & 0xFFFF0000) | 0x00003333; \
*******************************************************************************/
GPIOE->CRH = (GPIOE->CRH & 0x00000000) | 0x33333333;
#define LCD_DATA_DIR_IN GPIOE->CRL = (GPIOE->CRL & 0x00000000) | 0x44444444;
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
* 参数 : 无 *
* 返回 : 忙信号和地址指针 *
*******************************************************************************/
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54 }
};
/*******************************************************************************
* 延时函数 *
*******************************************************************************/
static void delay (int cnt)
{
cnt <<= DELAY_2N;
while (cnt--);
/* 设置能使脚为零或者一 */
#define LCD_E(x) GPIOA->ODR = (GPIOA->ODR & ~PIN_E) | (x ? PIN_E : 0);
}
static unsigned char wait_while_busy (void)
{
unsigned char status;
do {
status = lcd_read_status();
} while (status & 0x80); /* Wait for busy flag */
* 参数: c: 写命令 *
* 返回: 无 *
/* 设置RW脚为零或者一 */
#define LCD_RW(x) GPIOD->ODR = (GPIOD->ODR & ~PIN_RW) | (x ? PIN_RW : 0);
0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF};
/* 外围LED时钟能使 */
#define LCD_CLOCK_EN RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE);
GPIOD->CRL = (GPIOD->CRL & 0x00000000) | 0x33333333; \
GPIOD->CRH = (GPIOD->CRH & 0x00000000) | 0x33333333; \
GPIOE->CRL = (GPIOE->CRL & 0x00000000) | 0x33333333; \
static unsigned char lcd_read_status (void)
{
unsigned char status;
LCD_DATA_DIR_IN
LCD_RS(0)
LCD_RW(1)
delay(10);
LCD_E(1)
delay(10);
#define PIN_RS ( 1 << 7) //寄存器选择
#define PINS_DATA (0xF0 << 0) //数据接口
const unsigned int SWAP_DATA[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
return (status);
}
/*******************************************************************************
* 写LCD控制 *
基于STM32的1602 LCD驱动程序
1602采用标准的16脚接口,其中:
第1脚:VSS为地电源
第2脚:VDD接5V正电源
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
}
/*******************************************************************************
* 读LCD控制 *
const char UserFont[8][8] = {
{ 0x77,0x00,0x00,0x00,0x00,0x00,0x02,0x00 },
{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
{ 0x18,0x18,0x18,0x18,0x23,0x18,0x18,0x18 },
/* 读数据 */
#define LCD_DATA_IN SWAP_DATA[(((GPIOE->IDR & PINS_DATA) >> 8) & 0x0F)]
status = LCD_DATA_IN << 4;
LCD_E(0)
delay(10);
LCD_E(1)
delay(10);
status |= LCD_DATA_IN;
LCD_E(0)
LCD_DATA_DIR_OUT
return (status);
{ 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E },
{ 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F },
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
相关文档
最新文档