stm32 1602驱动
STM32串行驱动12864液晶
STM32串⾏驱动12864液晶⾃⼰参考⼤神们的程序改写的液晶驱动,希望对有需要的⼈能有帮助#include "stm32f10x.h"static __IO uint32_t TimingDelay;void RCC_Configuration(void);void Delay(__IO uint32_t nTime);#define Line1 0x80//液晶第⼀⾏#define Line2 0x90//液晶第⼆⾏#define Line3 0x88//液晶第三⾏#define Line4 0x98//液晶第四⾏#define LCD_IO GPIOE //我⽤的是E.2 E.3 E.4 E.5 E.6#define CS GPIO_Pin_2#define RW GPIO_Pin_3#define CLK GPIO_Pin_4#define PSB GPIO_Pin_5#define RST GPIO_Pin_6#define SET(n) GPIO_SetBits(GPIOE,n) //将对应管脚输出⾼电平#define RESET(n) GPIO_ResetBits(GPIOE,n)//输出低电平#define CMD (uint32_t)0xf8000000 //串⾏写⼊的是命令要先写⼊0xf8 #define DATE (uint32_t)0xfa000000 // 串⾏写⼊数据要先写⼊0xfavoid LCD_IOinit_OUT() //推挽输出模式,管脚配置,不多解释,库函数有{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin =CS|RW|CLK|PSB|RST;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD_IO, &GPIO_InitStructure);}void LCD_Write(uint32_t cmd,uint8_t ddata)//LCD 写函数{uint32_t temp=cmd;uint32_t i;RESET(CS); //⽚选拉低temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);SET(CS); //⽚选拉⾼,开始传输数据for(i=0;i<24;i++){if(temp&0x80000000)SET(RW); //取出最⾼位,如果是1,那么RW就写1 else RESET(RW); //如果是0 RW就写0SET(CLK);//向液晶写数据是在下降沿写⼊的Delay(2);//稍作延时RESET(CLK);//拉低产⽣下降沿,写⼊数据temp=temp<<1;//左移⼀位,写⼊下⼀位}RESET(CS); //拉低⽚选,写⼊数据完毕}void Display(uint8_t addr,uint8_t *hz){LCD_Write(CMD,addr);Delay(3);while(*hz!='\0'){LCD_Write(DA TE,*hz);hz++;Delay(3);}}void LCD_init()//液晶初始化{RESET(CS); //拉低⽚选RESET(PSB);//PSB拉低,表⽰是串⾏,拉⾼则是并⾏RESET(RST);//拉低RSTDelay(100);SET(RST);Delay(40);LCD_Write(CMD,0x30);//8位数据传输Delay(40);LCD_Write(CMD,0x0c);//显⽰开,游标开Delay(40);LCD_Write(CMD,0x01);//清屏Delay(40);LCD_Write(CMD,0x06);//进⼊点设定AC+1Delay(40);}int main(){RCC_Configuration();SysTick_Config(72000); //配置SYSTICK时钟节拍为1ms⼀次LCD_IOinit_OUT();LCD_init();while(1){Display(Line1,"你妹");Display(Line2,"你妹");Display(Line3,"你妹妹");Display(Line4,"完事了,哈哈哈哈哈");}}void RCC_Configuration(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE); }void Delay(__IO uint32_t nTime){TimingDelay = nTime;while(TimingDelay != 0);}void TimingDelay_Decrement(void){if (TimingDelay != 0x00){TimingDelay--;}}/*temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);重点解释⼀下这⾥,从串⾏时序图中可以看出,发送⼀个指令需要三个字节,第⼀个是0xf8或者0xfa这个根据你要发送的是命令还是数据⽽定,然后发送下⼀个数据的⾼四位和第四位,但是数据都是在⾼四位上⾯,⽤51的话我们要分三次发送,但是32的话⼀个字节可以是32位的/所以我们⼀次就能完成,这也是为什么下⾯的i<24的原因因为最后的8位没有⽤,例如:我们发送指令0x35,则应该是这样0xf8然后0x30然后0x50,这个应该很好理解所以看⼀下上⾯的语句⾸先我们cmd的值应该为0xf8000000,这个宏定义有的,这是发送命令然后我们让cmd=temp;在把temp和后⾯的计算结果做按位或运算.⾸先看这个(uint32_t)(ddata&(uint8_t)0xf0)<<16)我们的ddtate是0x35他和0xf0按位与之后/变为0x30然后左移16位变成0x30 0000;再强制转换为32位,就把⾼位补零变为0x00 30 0000再看这句话(uint32_t) (ddata&(uint8_t)0x0f)<<12)我们的ddtate是0x35他和0x0f按位与/之后变为0x05,左移12位0x05 000 强制转换为32位⾼位补零0x000 05 000 /在和前⾯的相加就是0x00 30 0000+0x000 05 000=0x0030 5000然后在和前⾯的0xf8000000按位或变为0xf830 5000 液晶读这个数据的时候是⼋位⼋位的读取所以在液晶看来是分四次的0xf8 0x30 0x50 0x00显然后⼋位没⽤所以我们只取前⾯的24位//应该能看懂了把结合时序图还有延时⼀定要精确⼤家有看不懂的可以给我留⾔*/。
常见液晶驱动控制芯片详解
常见液晶驱动控制芯片详解前言因此各位朋友在选择LCD液晶模块的时候,在考虑到串行,还是并行的方式时,可根据其驱动控制IC的型号来判别,当然你还需要看你选择的LCD模块引脚定义是固定支持并行,还是可选择并行或串行的方式。
一、字符型LCD驱动控制IC市场上通用的8×1、8×2、16×1、16X2、16X4、20X2、20X4、40X4等字符型LCD,基本上都采用的KS0066 作为LCD 的驱动控制器。
二、图形点阵型LCD驱动控制IC2.1、点阵数122X32—SED1520。
2.2、点阵数128×64。
(1)RA8816,支持串行或并行数据操作方式,内置中文汉字字库。
(2)KS0108/RA8808,只支持并行数据操作方式,也是最通用的12864点阵液晶的驱动控制IC。
(3)ST7565,支持中行或并行数据操作方式。
(4)S6B0724,支持中行或并行数据操作方式。
(5)RA6963,支持并行数据操作方式。
2.3、其他点阵数如192×64、240×64、320X64、240X128 的一般都是采用RA6963驱动控制芯片。
2.4、点阵数320X240,通用的采用RA8835 内置ASCII字库,以及RA8806驱动IC内置ASCII和中文等字库。
这里列举的只是一些常用的,当然还有其他LCD 驱动控制IC,在写LCD 驱动时要清楚是哪个型号的IC,再到网上去寻找对应的IC 数据手册吧。
后面我将慢慢补上其它一些常见的。
三、12864 液晶的奥秘CD1601/1602和LCD12864 都是通常使用的液晶,有人以为12864是一个统一的编号,主要是12864 的液晶驱动都是一样的,其实12864只是表示液晶的点阵是128*64点阵,而实际的12864 有带字库的,也有不带字库的:有5V电压的,也有3.3V工作电压:归根到底的区别在于驱动控制芯片,常用的控制芯片有RA8816、KS0108/RA8808、RA6963等等。
基于stm32的简易水情检测系统设计
基于stm32的简易水情检测系统设计目录第1章绪论 (4)1.1课题研究的目的及意义 (4)1.2课题研究的国内外发展现状 (4)1.3本课题的主要内容 (5)1.4论文结构安排 (6)第2章PH传感器检测模块 (7)2.1 PH检测传感器的组成 (7)2.1.1 PH复合电极 (7)2.2.2 PH传感器 (7)2.2 PH传感器的工作原理图 (8)2.3 PH工作原理 (8)第3章系统整体设计 (11)3.1系统方案论证 (11)3.1.1微处理器的论证与选择 (11)3.1.2液晶显示模块的论证与选择 (11)3.1.3超声波检测模块的论证与选择 (12)3.1.4温度检测模块的选择 (12)3.1.5串口通信的论证与选择 (12)3.2系统电路设计的指标 (13)3.2.1系统框架 (13)3.2.2超声波测距子系统框图 (13)3.2.3 PH检测子系统框图 (13)3.2.4温度检测子系统框图 (13)第4章系统硬件电路的构成 (14)4.1 STM32F407VET6最小系统 (14)4.2水位传感器 (14)4.3温度传感器 (16)4.4 RS-232串口通信模块 (17)4.5液晶显示模块 (17)第5章系统软件的设计 (18)5.1程序编程软件 (18)5.2程序编程软件 (18)5.2 .1程序功能描述 (18)5.2 .2程序的软件设计思路 (19)5.3 ADC程序编程软件 (19)5.4温度采集模块编程 (19)5.5水位采集模块编程 (20)5.6 PH值采集模块编程 (20)5.7显示模块编程 (21)5.8串口通信模块编程 (22)第6章系统调试与数据测量 (23)6.1测试条件与仪器 (23)6.1.1测试条件 (23)6.1.2测试仪器 (23)6.2测试数据及结果分析 (23)6.2.1测试数据 (23)6.2.2测试分析与结论 (24)结语 (25)第1章绪论1.1课题研究的目的及意义自我国改革开放以来,水情检测系统设计获得越来越多其他行业的关注和重视。
stm321621程序驱动
stm321621程序驱动//这⾥是符号对应的显⽰顺序,也就对应了在HT1621B数据寄存器内的位置#define _lcd_BUSY 0 #define _lcd_AC 1#define _lcd_PLUS 2#define _lcd_F1 3#define _lcd_ERROR 4#define _lcd_DC 5#define _lcd_MINUS 6#define _lcd_F2 7#define _lcd_DOT0 12#define _lcd_AUTO 20#define _lcd_RUN 24#define _lcd_PAUSE 25#define _lcd_DOT1 26#define _lcd_COLON0 27#define _lcd_DOT2 32#define _lcd_STOP 40#define _lcd_KPA 44#define _lcd_SETUP 45#define _lcd_DOT3 46#define _lcd_COLON1 47#define _lcd_DOT4 52#define _lcd_KG 60#define _lcd_MM 64#define _lcd_KM 65#define _lcd_L 66#define _lcd_M3 67#define _lcd_DB 68#define _lcd_PERCENT 69#define _lcd_OHOM 70#define _lcd_DEGREE 71#define _lcd_A 72#define _lcd_V 73#define _lcd_MA 76#define _lcd_MV 77#define _lcd_KHZ 78#define _lcd_W 79#define _lcd_NG 80#define _lcd_OK 81#define _lcd_RX 82#define _lcd_TX 83#define _lcd_FM 84#define _lcd_PM 85#define _lcd_AM 86#define _lcd_CARD 87#define _lcd_AT3 88#define _lcd_AT2 89#define _lcd_AT1 90#define _lcd_AT0 91#define _lcd_LOCK 95#define _lcd_BELL 103#define _lcd_COLON2 111 #define _lcd_BAT 119#define _lcd_MAX 124#define _lcd_MIN 125#define _lcd_CH 126#define _lcd_FAULT 127 __asm void wait(){nopnopnopnopnopnopnopnopBX lr}#define DELAY_COUNTS 0//下⾯是根据我的测试板情况定义的,⽤户可以需要修改#define CS_LOW {GPIO_ResetBits(GPIOB, GPIO_Pin_14) ;wait();}#define CS_HIGH {GPIO_SetBits(GPIOB, GPIO_Pin_14) ;wait();}#define RD_LOW {GPIO_ResetBits(GPIOD, GPIO_Pin_9) ;wait();}#define RD_HIGH {GPIO_SetBits(GPIOD, GPIO_Pin_9) ;wait();}#define WR_LOW {GPIO_ResetBits(GPIOB, GPIO_Pin_13);wait();}#define WR_HIGH {GPIO_SetBits(GPIOB, GPIO_Pin_13) ;wait();}#define DATA_LOW {GPIO_ResetBits(GPIOB, GPIO_Pin_12) ;wait();}#define DATA_HIGH {GPIO_SetBits(GPIOB, GPIO_Pin_12) ;wait(); }unsigned short int full[16]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};static void delay(int iCounts);//下⾯是驱动程序定义的⼀个显⽰缓冲区,共16个字节,128位unsigned char lcd_buffer[16];//={0,0,0,0,0,0,0,0};//这个函数可以向HT1621B写⼊⼀个命令;⽤户可能需要在语句间增加必要的延时void send_lcd_command(unsigned char command){unsigned short int i;CS_LOWWR_LOW //PRESENT 100 COMMAND CODEDATA_HIGHWR_HIGHWR_LOWDATA_LOWWR_HIGHWR_LOWWR_HIGHfor (i =0;i<=7;i++){WR_LOWif ((command & 0x80) !=0)DATA_HIGHWR_HIGHcommand = command << 1;}WR_LOWWR_HIGHCS_HIGH}//下⾯段并不⼀定使⽤//这个函数可以向HT1621B写⼊⼀个数据;⽤户可能需要在语句间增加必要的延时void send_lcd_data(unsigned short int address,unsigned short int data){unsigned short int i;CS_LOWWR_LOW //PRESENT 101 DATA CODEDATA_HIGHWR_HIGHWR_LOWDATA_LOWWR_HIGHWR_LOWDATA_HIGHWR_HIGHaddress = address << 2;for ( i =0;i<=6;i++) //5{WR_LOWif ((address & 0x80) !=0)DATA_HIGHelseDATA_LOWWR_HIGHaddress = address << 1;}for (i =0;i<=3;i++)if ((data & 0x01) !=0) DATA_HIGHelse DATA_LOWWR_HIGHdata = data >> 1;}CS_HIGH}//在测试时全使⽤的Ht 开头的函数进⾏的操作。
分享自己平时在网上收集的一些STM32源码,大家顶起哈!
分享⾃⼰平时在⽹上收集的⼀些STM32源码,⼤家顶起哈!本帖部分附件需要少量⾦币,此⽬的是为了⿎励⼤家积极发帖,请⼤家见谅!3.2⼨真彩TFT液晶触摸屏,320*240像素,26万⾊,i8080 16位并⾏接⼝,带转接板及触控芯⽚,可以直接⽤AVR、51、PIC、dsPIC、ARM7、STM32等单⽚机驱动。
3.2TFT.rar (6.69 MB, 下载次数: 180, 售价: 2 ⾦币)⾮常不错的⼀款STM32开发板资料。
含原理图、⽤户⼿册、各类例程:USB虚拟串⼝、TFT显⽰例程、U盘例程、TCP通信、uCOS例程、MP3解码、步进电机例程等。
有KEIL和IAR两套例程。
Armfly-STM32-SCH-SoftDemo.rar (16.05 MB, 下载次数: 431, 售价: 2 ⾦币)uC/OS-II官⽅的stm32的移植,基于arm的Cortex M3-uC/OS-II。
Micrium-ST-uCOS-II-LCD-STM32.rar (2.43 MB, 下载次数: 379)花了近3个⽉的毕业设计的时间,直到前⼏天完成的基本运营。
论⽂繁忙过去⼏天中,第⼀次在地图上从现在使⽤的软件代码的⽅式。
STM32 RVMDK 。
某些功能,这个MP3播放: MP3播放功能,⽀持MP3/WAV/WMA/MIDI播放,⽀持快进,快退,歌词显⽰⽀持[第⼆⼗条:第⼆⼗条:⼆⼗] / [第XX : XX.XX ] / [第XX号:第XX号] ,以⽀持多话歌词共享标记收⾳机功能,并⽀持⾃动发现服务台, FM76 ? 1.08 ,⾃动存⼊台湾图⽚播放功能,⽀持16位, 24位, 32位,任何⼤⼩的BMP图⽚浏览,以及符合JPEG / JPG格式图⽚浏览(只要它是正确的格式,⼤⼩限制)。
1,温度计功能。
,传感器DS18B20的。
2,彩⾊灯功能。
3,功率放⼤器功能。
4,职能亿多年来在⽀持太阳,⽉球和节⽓周查看。
基于某STM32的PT100温度测量
基于STM32的PT100温度测量目录一、前言1二、系统描述12.1 综述12.2系统框图12.3 功能实现1三、硬件设计23.1 STM32 微控制器23.2 PT100温度传感器电路33.31602液晶屏4四、软件设计44.1ADC程序44.21602LCD显示程序54.3主程序5五、性能测试5六、课程设计心得6参考文献6附录1:系统实物图7附录2:系统主要程序7一、前言Cortex-M3 是 ARM 公司为要求高性(1.25DhrystoneMIPS/MHz)、低本钱、低功耗的嵌入式应用专门设计的内核。
STM32 系列产品得益于 Cortex-M3 在架构上进展的多项改良,包括提升性能的同时又提高了代码密度的 Thumb-2 指令集和大幅度提高中断响应的紧耦合嵌套向量中断控制器,所有新功能都同时具有业界最优的功耗水平。
本系统是基于 Cortex-M3 内核的 STM32 微控制器与PT100温度传感器的温度测量,在硬件方面主要有最小系统板、1602LCD 液晶屏以与PT100温度传感电路,在软件方面主要有 1602LCD液晶屏的驱动,ADC功能的驱动,与滤波算法设计。
整个设计过程包括电子系统的设计技术与调试技术,包括需求分析,原理图的绘制,器件采购,安装,焊接,硬件调试,软件模块编写,软件模块测试,系统整体测试等整个开发调试过程。
二、系统描述本系统是基于 STM32微控制器所设计的多功能画板,该画板具有根本的绘画功能与画布颜色的选择,触摸屏校正等功能。
整个系统模块分为三个模块:ALIENTEK MiniSTM32开发板、液晶显示。
MiniSTM32开发板是ALIENTEK开发的是一款迷你型的开发板,小巧而不小气,简约而不简单。
上面有芯片工作需要的资源,时钟控制电路、复位电路、JTAG 控制口以与与外围电路相连的接口。
液晶屏采用的是1602LCD液晶屏。
2.2 系统框图本设计采用 STM32F103RBT6 作为微控制器,其外围硬件模块主要包括电源模块﹑微处理器模块﹑按键与JAIG等。
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));。
STM32液晶显示HT1621驱动原理及程序代码
STM32液晶显⽰HT1621驱动原理及程序代码1、HT1621电路分析HT1621为32×4即128点内存映像LCD驱动器,包含内嵌的32×4位显⽰RAM内存和时基发⽣器以及WDT看门狗定时器.HT1621驱动电路如下图所⽰:图1与单⽚机相连接控制的有9脚CS,3脚WR,12脚DATA,其功能描述如下表。
图22、字符显⽰原理液晶管点亮和熄灭原理分别为在对应的RAM地址中写1和写0.⾸先需要清楚所驱动控制的液晶的COM-SEG对应关系,然后需要了解HT1621的32×4RAM地址映射。
例如要控制的液晶的装脚成品图部分如下:图3着重看⼀个液晶数码管,我们了解原理就⾏。
可以看到图3中是第2个液晶数码管,有7段,分别为A,B,C,D,E,F,G。
也就分别为下⾯COM\SEG地址对应关系图中的2A,2B,2C,2D,2E,2F,2G。
液晶的显⽰字符的部分COM公共端输出⼝和SEG段输出⼝的分布如下表所⽰,同理我们可以看到例如:2D对应(SEG5,COM0),2E对应(SEG5,COM1),2F对应(SEG5,COM2),2A对应(SEG5,COM3),2C对应(SEG4,COM1),2G对应(SEG4,COM2),2B对应(SEG4,COM3)。
图4搞清楚我们要控制的对象之后那, HT1621的RAM 地址映射如下图所⽰:图5可以清楚的看到要控制液晶段对应SEG号作为6位地址,COM号对应作为4位数据写⼊,此时注意4位数据的⾼低位。
写数据到RAM命令格式为:101+6位RAM地址+4位数据,其中RAM地址为SEG序号.例如我们在图3的第⼆个液晶数码管上显⽰数字,⾸先我们根据图3得到地址映射关系,先写⼊地址SEG4中的四位数据(COM3,COM2,COM1,COM0),再写如地址SEG5中的四位数据(COM3,COM2,COM1,COM0),对应关系如下:SEG4SEG5COM3COM2COM1COM0COM3COM2COM1COM02B2G2C T102A2F2E2D所以如果在图3中显⽰“5”,则在显⽰的液晶段对应地址上写1,不显⽰写0,如下图所⽰。
基于STM32的温度采集系统设计
基于 STM32的温度采集系统设计摘要:本文利用STM32的一种微型处理器来当主控的CPU,通过使用一个独立的数据采集模块采集数据,在这个基础上实现了智能化的温度数据采取、然后还有传输、处理和显示等功能。
并商讨了该怎么提高系统的速度、性能和拓展性。
数据采集是获取信号对象信息的过程。
关键词:嵌入式系统;ARM;DS18B20温度传感器;STM32;温度采集;数据的处理一、引言当今社会,随着社会的不断发展,科学技术的不断进步,测温仪器在各个领域的广泛应用,智能化服务已成为这个时代温控系统发展的重要趋势。
温度控制在生活中还有在工业领域中涉及的非常多,像室内、供暖机构、天气预告等这些场所的温度控制。
像之前传统的温度控制都是手动的,操作起来很麻烦。
本文系统设计目的,首先它得是实现一种精准度高的系统来采集的温度控制系统,其应用必须得以普及,功能强大。
二、整体系统设计(一)系统方案设计第一个方案:需要使用模拟分立的元件,例如电容、电感、晶体管等非线性元件,观察采集的温度和显示的具体效果,这个方案的设计十分的好理解,特别简单,并且它的操作也不是特别的难,还有个好处,就是它的价格是非常合适的。
缺点就是如果用分立的元件,会造成它的分散性特别的大,对集成数字化是十分不好,而且最后测量之后,会存在很大的误差的,所以这个方案的可行性不太好,尽量不用。
第二个方案:选用PC机作为本次设计的主控机。
利用温度传感器来选用温度的信号,通过信号放大器之后,再送到A/D转换芯片中,然后再一次的经过拥有单片机的检测系统来进行下一步的解析和处理,然后再利用通信线路到PC机的上面,在PC的上面也可以通过对温度信号来进行很多的解析和处理的方式,所以这个方案简单来说还是不错的。
(二)系统工作原理通过了解设计需求方面确定了系统的总体方案,这个整体的系统其实是根据使用单片机、温度的传感器、显示屏的模块、报警器还有按键等五个部分来组成的。
使用者最开始得先将这个温度的报警的值输入到程序里,也就是温度的上下限。
stm32单片机驱动12232液晶屏
stm32单片机驱动12232液晶屏#include#include#include#include#define uchar unsigned char#define data 1#define comm 0#define f_page 0xb8#define f_row 0xc0#define f_line 0x00sbit rst=P3^0;sbit e1 =P2^0;sbit e2 =P2^1;sbit rw =P3^3;sbit a0 =P3^4;sbit bf =P1^7;void wr_lcd (uchar choe1,uchar choe2,uchar data_comm,ucharcontent);/*choe1为1,控制左半屏,choe2为1,控制右半屏*/void chk_busy (uchar choe1,uchar choe2);void delay (unsigned int us);void delay1 (unsigned int ms);//void init_lcd (void);void disphz (uchar code *chn);void dispzf (uchar code *chn);void disptu (uchar code *img);void wrlattice (uchar data1,uchar data2);uchar code tab1[]={/*-- 文字: 中 --*/0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x 08,0xFC,0x08,0x00,0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x 02,0x07,0x00,0x00,0x00,/*-- 文字: 科 --*/0x10,0x12,0x92,0x72,0xFE,0x51,0x91,0x00,0x22,0xCC,0x00,0x 00,0xFF,0x00,0x00,0x00,0x04,0x02,0x01,0x00,0xFF,0x00,0x04,0x04,0x04,0x02,0x02,0x 02,0xFF,0x01,0x01,0x00,/*-- 文字: 国 --*/0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A, 0x0A,0x02,0xFE,0x00,0x00,0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x 48,0x40,0xFF,0x00,0x00,/*-- 文字: 技 --*/0x08,0x08,0x88,0xFF,0x48,0x28,0x00,0xC8,0x48,0x48,0x7F,0x 48,0xC8,0x48,0x08,0x00,0x01,0x41,0x80,0x7F,0x00,0x40,0x40,0x20,0x13,0x0C,0x0C,0x 12,0x21,0x60,0x20,0x00,/*-- 文字: 肇 --*/0x80,0x60,0x1C,0x95,0x96,0x94,0x9C,0xC8,0xA4,0xAF,0x94,0 x94,0x2C,0x44,0x44,0x00,0x20,0x22,0x2A,0x2A,0x2A,0x2A,0x2A,0xFF,0x2A,0x2A,0x2A, 0x2F,0x22,0x22,0x20,0x00,/*-- 文字: 有 --*/0x00,0x04,0x84,0x44,0xE4,0x34,0x2C,0x27,0x24,0x24,0x24,0x E4,0x04,0x04,0x04,0x00,0x02,0x01,0x00,0x00,0xFF,0x09,0x09,0x09,0x29,0x49,0xC9,0x 7F,0x00,0x00,0x00,0x00,/*-- 文字: 庆 --*/0x00,0x00,0xFC,0x44,0x44,0x44,0x44,0xC5,0x7E,0xC4,0x44,0 x44,0x44,0x44,0x44,0x00,0x40,0x30,0x0F,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x 18,0x30,0x60,0x20,0x00,/*-- 文字: 限 --*/0xFE,0x02,0x32,0x4E,0x82,0x00,0xFE,0x4A,0xCA,0x4A,0x4A,0 x4A,0x7E,0x00,0x00,0x00,0xFF,0x00,0x02,0x04,0x03,0x00,0xFF,0x40,0x20,0x03,0x0C,0x 12,0x21,0x60,0x20,0x00,/*-- 文字: 金 --*/0x40,0x40,0x20,0x20,0x50,0x48,0x44,0xC3,0x44,0x48,0x50,0x 50,0x20,0x60,0x20,0x00,0x40,0x40,0x42,0x42,0x4A,0x72,0x42,0x7F,0x42,0x62,0x5A,0 x42,0x42,0x40,0x40,0x00,/*-- 文字: 公 --*/0x00,0x00,0x80,0x40,0x30,0x0E,0x84,0x00,0x00,0x0E,0x10,0x 60,0xC0,0x80,0x80,0x00,0x00,0x01,0x20,0x70,0x28,0x24,0x23,0x31,0x10,0x10,0x14,0x 78,0x30,0x01,0x00,0x00,/*-- 文字: 鹏 --*/0x00,0xFE,0x12,0xFE,0x00,0xFE,0x12,0xFE,0x00,0xFC,0x0E,0x 35,0x44,0x7C,0x00,0x00,0x20,0x1F,0x21,0x7F,0x20,0x1F,0x41,0x7F,0x08,0x09,0x09,0x2 9,0x49,0x21,0x1F,0x00,/*-- 文字: 司 --*/0x00,0x10,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x12,0x 02,0x02,0xFE,0x00,0x00,0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x0F,0x00,0x 20,0x40,0x3F,0x00,0x00};uchar code tab2[]={/*-- 文字: 8 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x 21,0x21,0x22,0x1C,0x00,/*-- 文字: G --*/0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x 20,0x22,0x1E,0x02,0x00,/*-- 文字: 6 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x 20,0x20,0x11,0x0E,0x00,/*-- 文字: o --*/0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x 20,0x20,0x20,0x1F,0x00,/*-- 文字: - --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x 01,0x01,0x01,0x01,0x01,/*-- 文字: l --*/0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x 3F,0x20,0x20,0x00,0x00,/*-- 文字: 7 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x 3F,0x00,0x00,0x00,0x00,/*-- 文字: d --*/0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x 20,0x20,0x10,0x3F,0x20,/*-- 文字: 5 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x 20,0x20,0x11,0x0E,0x00,/*-- 文字: e --*/0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x 22,0x22,0x22,0x13,0x00,/*-- 文字: 8 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x 21,0x21,0x22,0x1C,0x00,/*-- 文字: n --*/0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x 00,0x00,0x20,0x3F,0x20,/*-- 文字: - --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x0 1,0x01,/*-- 文字: P --*/0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x 01,0x01,0x01,0x00,0x00,/*-- 文字: 2 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x 24,0x22,0x21,0x30,0x00,/*-- 文字: a --*/0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x 22,0x22,0x22,0x3F,0x20,/*-- 文字: 2 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x 24,0x22,0x21,0x30,0x00,/*-- 文字: l --*/0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x/*-- 文字: 2 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x 24,0x22,0x21,0x30,0x00,/*-- 文字: m --*/0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x 00,0x3F,0x20,0x00,0x3F,/*-- 文字: 3 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x 20,0x20,0x11,0x0E,0x00,/*-- 文字: --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,/*-- 文字: 1 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x 3F,0x20,0x20,0x00,0x00,/*-- 文字: L --*/0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x 20,0x20,0x20,0x30,0x00,/*-- 文字: 9 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x 22,0x22,0x11,0x0F,0x00,/*-- 文字: C --*/0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x 20,0x20,0x10,0x08,0x00,/*-- 文字: 6 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x 20,0x20,0x11,0x0E,0x00,/*-- 文字: M --*/0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x};uchar code tab3[]={/*-- 调入了一幅图像:F:\梁\其它\HOCO12232.bmp --*//*-- 宽度x高度=122x32 --*/0x00,0x00,0x00,0x70,0xF8,0xF8,0xFC,0xFC,0xFE,0xFE,0xFE,0x FE,0xFC,0xFC,0xF0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x48,0xD4,0xB4,0x62,0 xC2,0x82,0x03,0x02,0x02,0x02,0x84,0xC4,0xE0,0xA0,0xE0,0x60,0x20,0x20,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xB0,0xF8,0xF0,0xF0,0x F8,0xFC,0x60,0x60,0x30,0x18,0x00,0x00,0x00,0x80,0xC0,0xE0,0xE0,0xF0,0xF0,0xF0,0x D8,0x58,0x58,0x58,0x58,0x58,0xD8,0xD8,0x98,0xB0,0x30,0x70,0xE0,0x80,0x00,0x00,0 x00,0x00,0x00,0x00,0x07,0x07,0x07,0x02,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, 0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xF8,0xF0,0xC0,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0xFE,0x01,0x00,0x04,0x0D,0x1B,0x36,0x6D,0xDB,0xF6,0xED,0xFB,0xFE,0xFE,0xFF,0 x7F,0x1F,0x07,0x01,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFC,0xE0,0xC0,0xC0,0xF 8,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0 x3E,0xF8,0x01,0x37,0x0C,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x60,0xFF,0xC7,0x 03,0x03,0x03,0x03,0xE1,0xFF,0x3F,0x0F,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x 0F,0x3F,0x7F,0xFF,0xEF,0xBF,0x7F,0xFF,0xC7,0x07,0x1F,0xFE,0xF8,0xB0,0x60,0x80,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x04,0x08,0x10,0x 20,0x40,0x40,0x80,0x83,0xFF,0xFF,0xFF,0xFF,0x83,0x40,0x40,0x20,0x10,0x08,0x04,0x0 3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x0F,0x 1F,0x3F,0x3F,0x7F,0xFF,0xFF,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xDF,0x3F,0x3F,0x0F,0x61, 0x3F,0x1F,0x2F,0x3F,0x1F,0x0F,0x00,0x0F,0x07,0x03,0x00,0x01,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x1E,0x07,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x60,0x70,0x3C,0x1F,0x07,0x 03,0x01,0x01,0x00,0x00,0x01,0x07,0x07,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x 00,0x7C,0x44,0xEC,0x00,0x7C,0x44,0x7C,0x00,0x7C,0x40,0x40,0x00,0x7C,0x44,0x38,0 x00,0x7C,0x14,0x1C,0x00,0x7C,0x40,0x40,0x00,0x78,0x24,0x78,0x00,0x7C,0x18,0x18,00x00,0x00,0x00,0x20,0x20,0x20,0x20,0x10,0x04,0x07,0x00,0x 01,0x00,0x00,0x00,0x01,0x05,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*------------------------------------------*/void wr_lcd (uchar choe1,uchar choe2,uchar data_comm,ucharcontent){chk_busy (choe1,choe2);if(data_comm){a0=1; //datarw=0; //write}else{a0=0; //commandrw=0; //write}if(choe1==1){P1=content; //output data or comme1=1;;e1=0;}if(choe2==1){P1=content; //output data or comme2=1;;e2=0;}}void chk_busy (uchar choe1,uchar choe2) {if(choe1==1){a0=0;rw=1;e1=1;while(bf==1)delay(2);e1=0;}if(choe2==1){a0=0;rw=1;e2=1;while(bf==1)delay(2);e2=0;}}void delay (unsigned int us) //delay time {while(us--);}void delay1 (unsigned int ms){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<1000;j++);}/*------------------初始化-----------------*/ void init_lcd (void){rst=1;;wr_lcd (1,1,comm,0xe2);wr_lcd (1,1,comm,0xa4);wr_lcd (1,1,comm,0xa9);wr_lcd (1,1,comm,0xa0);wr_lcd (1,1,comm,0xee);wr_lcd (1,1,comm,0xaf);}/*--------------显示汉字(16x16)---------------*/ void disphz (uchar code *chn){uchar i,j,k;for(k=0;k<3;k++){for(j=0;j<4;j++){wr_lcd (1,0,comm,f_page+j);wr_lcd (1,0,comm,f_row);wr_lcd (1,0,comm,f_line+12+k*16);for(i=0;i<16;i++)wr_lcd (1,0,data,chn[k*64+j*16+i]);}}for(k=3;k<6;k++){for(j=0;j<4;j++){wr_lcd (0,1,comm,f_page+j);wr_lcd (0,1,comm,f_row);wr_lcd (0,1,comm,f_line+k*16-48);for(i=0;i<16;i++)wr_lcd (0,1,data,chn[k*64+j*16+i]);</ms;i++)}}}/*--------------显示字符(8x16)---------------*/ void dispzf (uchar code *eng){uchar i,j,k;for(k=0;k<7;k++){for(j=0;j<4;j++)wr_lcd (1,0,comm,f_page+j);wr_lcd (1,0,comm,f_row);wr_lcd (1,0,comm,f_line+5+k*8);for(i=0;i<8;i++)wr_lcd (1,0,data,eng[k*32+j*8+i]);}}for(k=7;k<14;k++){for(j=0;j<4;j++){wr_lcd (0,1,comm,f_page+j);wr_lcd (0,1,comm,f_row);wr_lcd (0,1,comm,f_line+k*8-56);for(i=0;i<8;i++)wr_lcd (0,1,data,eng[k*32+j*8+i]);}}}/*----------------画图形-----------------*/ void disptu (uchar code *img){uchar i,j;for(j=0;j<4;j++){wr_lcd (1,1,comm,f_page+j);wr_lcd (1,1,comm,f_row);wr_lcd (1,1,comm,f_line);for(i=0;i<122;i++)if(i<61){wr_lcd (1,0,comm,f_line+i);wr_lcd (1,0,data,img[j*122+i]);}else{wr_lcd (0,1,comm,f_line+i-61);wr_lcd (0,1,data,img[j*122+i]);}}}}/*--------------写点阵------------------*/ void wrlattice (uchar data1,uchar data2) {uchar i,j;for(j=0;j<4;j++){wr_lcd (1,1,comm,f_page+j);wr_lcd (1,1,comm,f_row);wr_lcd (1,1,comm,f_line);for(i=0;i<61;i=i+2){wr_lcd (1,1,data,data1);wr_lcd (1,1,data,data2);}}}/*------------------主程序--------------------*/ void main (){SP=0x5f;init_lcd ();while (1){wrlattice (0x00,0x00); disphz (tab1); delay1 (300); wrlattice (0xff,0x00); delay1 (300);wrlattice (0x00,0x00); dispzf (tab2);delay1 (300); wrlattice (0x33,0x33); delay1 (300); disptu (tab3);delay1 (300);}}。
LCD1602驱动-STM32程序
//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液晶显示
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驱动程序
1602显示屏驱动详解
LCD1602的单片机驱动详解一.接口LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。
刚开始接触它的大多是单片机的初学者。
由于对它的不了解,不能随心所欲地对它进行驱动。
经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。
与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的。
一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。
我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。
如图1所示:图1再来一它的背面的,如图2所示:图2它的16条引脚定义如下:对这个表的说明:1. VSS接电源地。
2. VDD接+5V。
3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。
或同样阻值的RM065/RM063蓝白可调电阻。
见图3。
图34. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。
5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。
如果不需要进行读取操作,可以直接将其接VSS。
6. E,执行命令的使能引脚,接单片机的一个I/O。
7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意的8个I/O口。
如果接P0口,P0口应该接4.7K —10K的上拉电阻。
如果是4线并行驱动,只须接4个I/O口。
8. A背光正极,可接一个10—47欧的限流电阻到VDD。
9. K背光负极,接VSS。
单片机驱动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 接口定义******************************
加个模块,实现IIC方式驱动LCD1602
加个模块,实现IIC驱动LCD1602 PCF8574模块使实现IIC驱动LCD1602成为现实。
下图是PCF8574模块与1602的连接电路图:实物接法如下:想要使用PCF8574模块来实现IIC驱动LCD1602,首先非常必要弄清楚IIC的时序、PCF8574设备地址、四线控制LCD1602方法。
下面是两个重要的h文件。
通过修改这两个h文件中的部分代码(接线有所不同)即可移植到你的程序中去。
PCF8574.h程序:sbit scl=P1^6;sbit sda=P1^7;void delay()//{ ;; }void init()//IIC初始化{sda=1;delay();scl=1;delay();}void start() //IIC开始信号{sda=1;delay();sda=0;delay();}void stop() //IIC停止{sda=0;delay();scl=1;delay();sda=1;delay();}void respons() //IIC应答{uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;}void write_byte(uchar date)//IIC写入数据{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay();sda=CY;delay();scl=1;delay();}scl=0;delay();sda=1;uchar read_byte()//IIC读取字节{uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay();}return k;}start();write_byte(0x7e); //8574设备地址(写)respons();write_byte(date1);respons();stop();}uchar read_add()//向IO读取数据{uchar date1;start();write_byte(0x71); //8574设备地址(读)respons();date1=read_byte();respons();stop();return date1;}PCF8574+LCD1602_4.h程序:uchar a,b;for(a=x;a>0;a--)for(b=200;b>0;b--);}void write_com(uchar com) //写命令函数{ uchar com1,com2;com1=com|0x0f;write_add(com1&0xfc);delay1(2);write_add(com1&0xf8);com2=com<<4;com2=com2|0x0f;write_add(com2&0xfc);delay1(2);write_add(com2&0xf8);}void write_date(uchar date) //写数据函数{date1=date|0x0f;write_add(date1&0xfd);delay1(2);write_add(date1&0xf9);date2=date<<4;date2=date2|0x0f;write_add(date2&0xfd);delay1(2);write_add(date2&0xf9);}void init_lcd() //初始化函数{write_com(0x33); //显示模式设置delayms(6);write_com(0x32); //显示模式设置delayms(6);write_com(0x28); //4位总线,双行显示,显示5×7的点阵字符delayms(6);write_com(0x01); //清屏write_com(0x06); //字符进入模式:屏幕不动,字符后移delayms(6);write_com(0x0c); //显示开,关光标//write_LCD_Command(0x0f); //显示开,开光标,光标闪烁delayms(6);}//显示字符串:第x行第y列显示什么内容void ShowString(unsigned char x,unsigned char y,unsigned char *str){//设置起始位置if(x == 1){write_com(0x80 | y-1);// |相当于加法}if(x == 2){write_com(0xc0 | y-1);}//输出字符串while(*str!='\0') {write_date(*str);str++;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/******************************************************************** ********文件名称:LCD1602.h for STM32**by 追梦 2011-4-5********************************************************************* *****/#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~47hvoid 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,ucharhour,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已经操作完毕,空闲。
*说明:一般在写入新命令或数据之前用while(LCD_busy())语句等待LCD 就绪********************************************************************* /uint8_t LCD_busy(void){LCD_RS_0;delay_nus(1);LCD_RW_1;delay_nus(1);do{LCD_EN_0;delay_nus(200);LCD_EN_1;delay_nus(200);}while(GPIOD->IDR & 0x80);LCD_EN_0;return (uint8_t)0;}/******************************************************************** **功能:一直等待到LCD1602空闲********************************************************************* /void Wait_Leisure(void){LCD_busy();}/******************************************************************** **功能:写入LCD初始化时的命令,不可以检测忙状态********************************************************************* /void LCD_WriteInitcmd(uchar cmd){LCD_RS_0;delay_nus(1);LCD_RW_0;delay_nus(1);DATAOUT = cmd;LCD_EN_0;delay_nus(300);LCD_EN_1;delay_nus(300);LCD_EN_0;delay_nms(2);}/******************************************************************** **名称:LCD_Writecmd()*功能:写指令到LCD1602,指令数据占一个字节*入口参数:cmd:待写入的指令*出口参数:无********************************************************************* /void LCD_Writecmd(uchar cmd){while(LCD_busy());LCD_RS_0; //对同一个寄存器的两次写入,中间延时一会delay_nus(1);LCD_RW_0;delay_nus(1);LCD_EN_0;delay_nus(300);//产生脉冲DATAOUT = cmd;LCD_EN_1;delay_nus(300);//必要的延时LCD_EN_0; //下降沿,LCD1602开始工作}/******************************************************************** **名称:LCD_Writedata()*功能:写一字节数据到LCD1602*入口参数:dat:无符号字节类型,0~255 包括各个ASCII码字符*出口参数:无********************************************************************* /void LCD_Writedata(uchar dat){while(LCD_busy());//等待LCD1602空闲LCD_RS_1;delay_nus(1);LCD_RW_0;delay_nus(1);DATAOUT = dat;LCD_EN_1; //先拉高delay_nus(300); //很重要的延时,经调试,延时300us以上才可以LCD_EN_0; //下降沿,开始写入有效数据}/******************************************************************** **名称:LCD_pos()*功能:设定显示位置*入口参数:pos:显示位置,值的范围如下:* 0x00----------------0x0f 0x10-------0x27 第一行(一次显示16个字符)* 0x40----------------0x4f 0x50-------0x67 第二行*出口参数:无********************************************************************* /void LCD_pos(uchar pos){LCD_Writecmd(pos | 0x80);}/******************************************************************** **名称:LCD_Setpos()*功能:根据习惯设定显示位置*入口参数:row:行,row=1表示第一行,row=2表示第二行* col:列,0~15,用于指定显示的列,范围可以是0~40*出口参数:无********************************************************************* /void LCD_Setpos(uchar row,uchar col){if(row==1) LCD_Writecmd(col | 0x80);else LCD_Writecmd(col | 0xC0);}/******************************************************************** **功能:显示一个字符*入口:ch:待显示的字符********************************************************************* /void LCD_DispChar(char ch){LCD_Writedata(ch);}/******************************************************************** **功能:在指定位置显示一个字符*入口:row:行 1或2 col:列,0~15* ch:待显示的字符********************************************************************* /void LCD_Setpos_DispChar(uchar row,uchar col,char ch){LCD_Setpos(row,col);LCD_Writedata(ch);}/******************************************************************** **名称:LCD_DispString()*功能:使LCD1602显示一个字符串,显示位置需提前设定*入口参数:str[]:待显示的字符串*出口参数:无********************************************************************* /void LCD_DispString(char str[]){uchar i=0;while(str[i] != '\0'){LCD_Writedata(str[i]);++i;}}/******************************************************************** **名称:LCD_Setpos_DispString()*功能:使LCD1602从指定位置开始显示一个字符串*入口参数:row:显示行,1或2* col:显示列,0~15 (0~40)* str[]:待显示的字符串*出口参数:无*说明:指定位置是显示的初始位置,第一个字符显示的位置********************************************************************* /void LCD_Setpos_DispString(uchar row,uchar col,char str[]){LCD_Setpos(row,col);LCD_DispString(str);}/******************************************************************** **名称:LCD_Dispnum()*功能:显示一个不超过8位的整数,显示位置需提前设置*入口参数:num:待显示的整数,不超过8位*出口参数:无********************************************************************* /void LCD_Dispnum(uint32_t num){uint i=0,j,k=0,wei,q;char str[9];if(num>=10000000)wei=8;else if(num>=1000000)wei=7;else if(num>=100000)wei=6;else if(num>=10000)wei=5;else if(num>=1000) wei=4;else if(num>=100)wei=3;else if(num>=10) wei=2;else wei=1;for(i=wei;i>0;i--){ q=1;j=1; //i=1时,q=1,得到个位for(;j<i;j++)q *=10;num %= q;}str[k] = '\0'; //添加字符串结束标志LCD_DispString(str);//显示字符串}/******************************************************************** **名称:LCD_Setpos_Dispnum()*功能:在指定位置显示一个不超过8位的整数*入口参数:num:待显示的整数,不超过8位*出口参数:无********************************************************************* /void LCD_Setpos_Dispnum(uchar row,uchar col,uint32_t num){LCD_Setpos(row,col);LCD_Dispnum(num);}/******************************************************************** **名称:LCD_DispDecimal()*功能:显示一个有效位不超过8位的浮点数,显示位置需要提前设定*入口参数:num:待显示的浮点数放大后得到的整数,不超过8位* dot:小数点的位数*出口参数:无********************************************************************* /void LCD_DispDecimal(uint32_t num,uchar dot){uint i=0,j,k=0,wei,q;char str[10];if(num>=10000000)wei=8;else if(num>=1000000)wei=7;else if(num>=100000)wei=6;else if(num>=10000)wei=5;else if(num>=1000) wei=4;else if(num>=100)wei=3;else if(num>=10) wei=2;else wei=1;for(i=wei;i>0;i--){ q=1;j=1; //i=1时,q=1,得到个位for(;j<i;j++)q *=10;num %= q;}str[k] = '\0'; //添加字符串结束标志for(i=8;i>0;i--){ if((str[i]>='0')&&(str[i]<='9')) break;}str[i+2]='\0'; //添加字符串结束符for(j=0;j<dot;j++,i--)//小数点后各位依次右移,准备插入{str[i+1]=str[i];}str[i+1]='.'; //插入小数点LCD_DispString(str);//显示浮点小数}/******************************************************************** **名称:LCD_Setpos_DispDecimal()*功能:在指定位置显示一个有效位不超过8位的浮点数*入口参数:row:待显示的行 1,2* col:待显示的列 0~15* num:待显示的浮点数放大10的整数倍后得到的整数,不超过8位* dot:小数点的位数*出口参数:无********************************************************************* /void LCD_Setpos_DispDecimal(uchar row,uchar col,uint32_t num,uchar dot) {LCD_Setpos(row,col);LCD_DispDecimal(num,dot);}/******************************************************************** **名称:LCD_DispDateTime()*功能:显示日历,显示日期与时间*入口参数:year:年,可以是任意值* month:月,1~12* day:日,1~31* hour:时,1~24 或 1~12* min:分,0~59* sec:秒,0~59*出口参数:无*说明:使用前必须先宏定义USE_LCD_DISP_DATE,在包含文件之前定义有效*显示格式:Date:yyyy-mm-dd ** Time:hh:mm:ss ********************************************************************** /void LCD_DispDateTime(uint32_t year,uchar month,uchar day,uchar hour,uchar min,uchar sec){LCD_Setpos(1,0);LCD_DispString("Date:");LCD_Dispnum((uint32_t)year);LCD_DispChar('-');LCD_Dispnum((uint32_t)month);LCD_DispChar('-');LCD_Dispnum((uint32_t)day);LCD_Setpos(1,15);LCD_DispChar('*'); //第一行结束符显示LCD_Setpos(2,0);LCD_DispString("Time:");LCD_Dispnum((uint32_t)hour);LCD_DispChar(':');LCD_Dispnum((uint32_t)min);LCD_DispChar(':');LCD_Dispnum((uint32_t)sec);LCD_Setpos(2,15);LCD_DispChar('*'); //第二行结束符显示}/******************************************************************** **名称:LCD_DispStopWatch()*功能:显示秒表,显示时,分,秒,10毫秒,精确到10ms*入口参数:hour:时,1~24 或 1~12* min:分,0~59* sec:秒,0~59* tenms:10ms计数值,如3表示30ms*出口参数:无*显示格式:Current Time: ** hh:mm:ss:tt ********************************************************************** /void LCD_DispStopWatch(uchar hour,uchar min,uchar sec,uchar tenms) {LCD_Setpos(1,0);LCD_DispString("Current Time:");LCD_Setpos(1,15);LCD_DispChar('*'); //第一行结束符显示LCD_Setpos(2,2);LCD_Dispnum((uint32_t)hour);LCD_DispChar(':');LCD_Dispnum((uint32_t)min);LCD_DispChar(':');LCD_Dispnum((uint32_t)sec);LCD_DispChar(':');LCD_Dispnum((uint32_t)tenms);LCD_Setpos(2,15);LCD_DispChar('*'); //第二行结束符显示}/******************************************************************** **名称:LCD_DispFreq()*功能:显示频率计,动态自动调整频率显示*入口参数:freq:可以显示8位整数表示的频率值,频率范围1Hz~99MHz*出口参数:无*说明:入口的频率值单位是Hz,显示函数自动选择合适的显示方式* freq>=1000000显示成6位小数的MHz* else freq>=1000 显示成3位小数的KHz* else freq>=0 默认显示单位是Hz (三个区间互斥)********************************************************************* /void LCD_DispFreq(uint32_t freq){LCD_Setpos(1,0);LCD_DispString("Current Freq:");LCD_Setpos(2,1); //显示位置if(freq>=1000000){LCD_DispDecimal(freq,6);LCD_DispString("MHz");}else if(freq>=1000){LCD_DispDecimal(freq,3);LCD_DispString("KHz");}else { LCD_Dispnum(freq);LCD_DispString("Hz");}LCD_Setpos(2,14);LCD_DispString("OK");}//屏幕整体左移一格,用于滚动显示void LCD_ShiftLeft(){LCD_Writecmd(0x18);}//屏幕整体右移一格,用于滚动显示void LCD_ShiftRight(void){LCD_Writecmd(0x1C);}//清屏,清除显示void LCD_Clear(void){LCD_Writecmd(0x01);}//使光标还回原点位置void LCD_Return(void){LCD_Writecmd(0x02);}//关显示void LCD_Close(void){LCD_Writecmd(0x08);}//开显示void LCD_Open(void){LCD_Writecmd(0x0C);}/******************************************************************** **名称:LCD_FlickerChar()*功能:使指定位置字符闪烁,不显示光标*入口参数:row:行 1,2* col:列 0~15*出口参数:无*说明:写命令0x0D不显示光标的闪烁,写命令0x0F是显示光标的闪烁* 一旦设定闪烁后,会根据位置变化闪烁,关闪烁写命令0x0C********************************************************************* /void LCD_FlickerChar(uchar row,uchar col){LCD_Writecmd(0x0D);LCD_Setpos(row,col);}//关闭字符闪烁void LCD_CloseFlicker(void){LCD_Writecmd(0x0C);}//屏幕秒闪烁一次void LCD_FlickerScreen(void){LCD_Writecmd(0x08);//关显示delay_nms(500);LCD_Writecmd(0x0C);//开显示delay_nms(500);}/******************************************************************** **名称: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){delay_nms(200); //延时20msLCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据delay_nms(10);LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据delay_nms(5);LCD_WriteInitcmd(0x38); //16*2显示,5*7点阵,8位数据delay_nms(5);LCD_WriteInitcmd(0x08); //先关显示,后开显示delay_nms(5);LCD_WriteInitcmd(0x06); //自动右移光标,0x04为左移光标delay_nms(5);LCD_WriteInitcmd(0x01); //清除LCD的显示内容delay_nms(6);LCD_WriteInitcmd(0x0c); //显示开,关光标;0x08为关显示delay_nms(5);}#endif //防止多次编译/************************************************************** LCD1602驱动显示实验*by 追梦 2011-4-3、5*************************************************************/#include "stm32f10x.h"#include "LCD1602.h"#define PE00 (uint32_t *)0x40230180//时钟配置函数 8MHz*9=72MHzvoid RCC_Configuration(){RCC_DeInit();RCC_HSEConfig(RCC_HSE_ON);//使能HSEif(RCC_WaitForHSEStartUp()==SUCCESS){RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK=SYSCLKRCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);RCC_PLLCmd(ENABLE);while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while(RCC_GetSYSCLKSource()!=0x08);}RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC|\RCC_APB2Periph_GPIOD |RCC_APB2Periph_GPIOE,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);}//延时n usvoid delay_nus(unsigned long n){unsigned long j;while(n--){ j=8;while(j--);}}//延时n msvoid delay_nms(unsigned long n){while(n--)delay_nus(1100);}//GPIO配置函数void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOD, &GPIO_InitStructure); //PD口OD输出GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //PE.0~2 OD输出GPIO_Init(GPIOE, &GPIO_InitStructure);}///////////////////////////////////////////int main(){//uint32_t i=0;char str[]={"happy!"};RCC_Configuration();GPIO_Configuration();LCD_Init();LCD_Setpos_DispString(1,3,str);LCD_DispFreq(123456);LCD_FlickerChar(2,3);LCD_FlickerScreen();LCD_FlickerScreen();LCD_FlickerScreen(); delay_nms(2000);LCD_CloseFlicker(); while(1){};}。