STM32的1602程序.docx
《STM32的1602程序.docx》由会员分享,可在线阅读,更多相关《STM32的1602程序.docx(7页珍藏版)》请在冰豆网上搜索。
STM32的1602程序
#ifndefLCD1602_STM32_H
#defineLCD1602_STM32_H
#defineLCD_RS_1GPIOE->BSRR=GPIO_Pin_07]--(LCD)D0~D7
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
externvoiddelay_nms(unsignedlongn);
externvoiddelay_nus(unsignedlongn);
uint8_tLCD_busy(void);;//插入小数点
LCD_DispString(str);//显示浮点小数
}
/*********************************************************************
*名称:
LCD_Setpos_DispDecimal()
*功能:
在指定位置显示一个有效位不超过8位的浮点数
*入口参数:
row:
待显示的行1,2
*col:
待显示的列0~15
*num:
待显示的浮点数放大10的整数倍后得到的整数,不超过8位
*dot:
小数点的位数
*出口参数:
无
*********************************************************************/
voidLCD_Setpos_DispDecimal(ucharrow,ucharcol,uint32_tnum,uchardot)
{
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*
*********************************************************************/
voidLCD_DispDateTime(uint32_tyear,ucharmonth,ucharday,ucharhour,ucharmin,ucharsec)
{
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
*出口参数:
无
*显示格式:
CurrentTime:
*
*hh:
mm:
ss:
tt*
*********************************************************************/
voidLCD_DispStopWatch(ucharhour,ucharmin,ucharsec,uchartenms)
{
LCD_Setpos(1,0);
LCD_DispString("CurrentTime:
");
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
*elsefreq>=1000显示成3位小数的KHz
*elsefreq>=0默认显示单位是Hz(三个区间互斥)
*********************************************************************/
voidLCD_DispFreq(uint32_tfreq)
{
LCD_Setpos(1,0);
LCD_DispString("CurrentFreq:
");
LCD_Setpos(2,1);//显示位置
if(freq>=1000000)
{
LCD_DispDecimal(freq,6);
LCD_DispString("MHz");
}
elseif(freq>=1000)
{
LCD_DispDecimal(freq,3);
LCD_DispString("KHz");
}
else{LCD_Dispnum(freq);
LCD_DispString("Hz");
}
LCD_Setpos(2,14);
LCD_DispString("OK");
}
//屏幕整体左移一格,用于滚动显示
voidLCD_ShiftLeft()
{
LCD_Writecmd(0x18);
}
//屏幕整体右移一格,用于滚动显示
voidLCD_ShiftRight(void)
{
LCD_Writecmd(0x1C);
}
//清屏,清除显示
voidLCD_Clear(void)
{
LCD_Writecmd(0x01);
}
//使光标还回原点位置
voidLCD_Return(void)
{
LCD_Writecmd(0x02);
}
//关显示
voidLCD_Close(void)
{
LCD_Writecmd(0x08);
}
//开显示
voidLCD_Open(void)
{
LCD_Writecmd(0x0C);
}
/*********************************************************************
*名称:
LCD_FlickerChar()
*功能:
使指定位置字符闪烁,不显示光标
*入口参数:
row:
行1,2
*col:
列0~15
*出口参数:
无
*说明:
写命令0x0D不显示光标的闪烁,写命令0x0F是显示光标的闪烁
*一旦设定闪烁后,会根据位置变化闪烁,关闪烁写命令0x0C
*********************************************************************/
voidLCD_FlickerChar(ucharrow,ucharcol)
{
LCD_Writecmd(0x0D);
LCD_Setpos(row,col);
}
//关闭字符闪烁
voidLCD_CloseFlicker(void)
{
LCD_Writecmd(0x0C);
}
//屏幕秒闪烁一次
voidLCD_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:
字符闪烁,关光标,接着设定位置,闪烁周期左右
*0x0F:
字符闪烁,开光标
*0x06:
写完数据自动右移光标,普通情形,从左向右显示40us
*0x04:
写完数据自动左移光标,可以从右向左显示40us
*0x01:
清除显示内容,即清屏
*0x02:
使光标还回起始位置
*0x18:
屏幕上所有字符同时左移一格,适合滚动显示40us
*0x1C:
屏幕上所有字符同时右移一格,适合滚动显示40us
*********************************************************************/
voidLCD_Init(void)
{
delay_nms(200);//延时20ms
LCD_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""
#include""
#definePE00(uint32_t*)0x
//时钟配置函数8MHz*9=72MHz
voidRCC_Configuration()
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);//使能HSE
if(RCC_WaitForHSEStartUp()==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//HCLK=SYSCLK
RCC_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);
}
//延时nus
voiddelay_nus(unsignedlongn)
{
unsignedlongj;
while(n--)
{j=8;
while(j--);
}
}
//延时nms
voiddelay_nms(unsignedlongn)
{
while(n--)
delay_nus(1100);
}
//GPIO配置函数
voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
=GPIO_Pin_All;
=GPIO_Speed_10MHz;
=GPIO_Mode_Out_OD;
GPIO_Init(GPIOD,&GPIO_InitStructure);//PD口OD输出
=(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
=GPIO_Mode_Out_OD;//~2OD输出
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
///////////////////////////////////////////
intmain()
{
//uint32_ti=0;
charstr[]={"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)
{
};
}