您的当前位置:首页正文

STM32的1602程序

2022-03-18 来源:个人技术集锦


STM32的1602程序

#define LCD_RS_1 GPIOE->BSRR=GPIO_Pin_0 7]--(LCD)D0~D7 #ifndef uchar

#define uchar unsigned char

#endif

#ifndef uint

#define uint unsigned int

#endif

extern void delay_nms(unsigned long n);

extern void delay_nus(unsigned long n);

uint8_t LCD_busy(void); ; //插入小数点

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:字符闪烁,关光标,接着设定位置,闪烁周期左右

* 0x0F:字符闪烁,开光标

* 0x06:写完数据自动右移光标,普通情形,从左向右显示 40us

* 0x04:写完数据自动左移光标,可以从右向左显示40us

* 0x01:清除显示内容,即清屏

* 0x02:使光标还回起始位置

* 0x18:屏幕上所有字符同时左移一格,适合滚动显示40us

* 0x1C:屏幕上所有字符同时右移一格,适合滚动显示

40us

******************************************************* **************/

void LCD_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 \"\"

#define PE00 (uint32_t *)0x

//时钟配置函数 8MHz*9=72MHz

void RCC_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); }

//延时n us

void delay_nus(unsigned long n)

{

unsigned long j;

while(n--)

{ j=8;

while(j--);

}

}

//延时n ms

void delay_nms(unsigned long n)

{

while(n--)

delay_nus(1100);

}

//GPIO配置函数

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_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; //~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)

{

};

}

因篇幅问题不能全部显示,请点此查看更多更全内容