标题:
stm32单片机+GPS+1602液晶代码
[打印本页]
作者:
风气天蓝
时间:
2019-1-20 13:27
标题:
stm32单片机+GPS+1602液晶代码
借用了原子哥的程序,自己修改后又加入了北斗模块,通过北斗读取实时的时间显示到液晶上。
单片机源程序如下:
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "gps.h"
#define LCD_1602RS GPIO_Pin_12
#define LCD_1602RW GPIO_Pin_13
#define LCD_1602EN GPIO_Pin_14
unsigned char USART_Buff[12];
unsigned char table[5]= "times";
unsigned char a;
u8 i = 0;
u8 res=0;
u8 flag_M=0;
u8 flag_C=0;
u8 flag = 0;
u8 j = 0;
u8 t = 0;
//串口初始化
void My_USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使用相应的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init (GPIOA,&GPIO_InitStrue); //初始化IO口
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING ;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init (GPIOA,&GPIO_InitStrue); //初始化IO口
USART_InitStrue.USART_BaudRate=9600;
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStrue.USART_Parity=USART_Parity_No;
USART_InitStrue.USART_StopBits=USART_StopBits_1;
USART_InitStrue.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStrue);
USART_Cmd(USART1,ENABLE); //使能串口1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启接受中断
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStrue); //中断优先级的设置
}
//写命令
void LCD1602_Write_Cmd(unsigned char cmd)
{
GPIO_ResetBits(GPIOF,LCD_1602RS); //RS 0
delay_us(2);
GPIO_ResetBits(GPIOF,LCD_1602RW); //RW 0
GPIO_Write(GPIOD, cmd);
GPIO_ResetBits(GPIOF,LCD_1602EN); //E 0
delay_us(2);
GPIO_SetBits(GPIOF,LCD_1602EN); //E 1
delay_us(2);
GPIO_ResetBits(GPIOF,LCD_1602EN); //E 0
}
//写数据
void LCD1602_Write_Date(unsigned char dat)
{
GPIO_SetBits(GPIOF,LCD_1602RS); //RS 1 RS高是数据,低是命令
delay_us(2);
GPIO_ResetBits(GPIOF,LCD_1602RW); //RW 0
GPIO_Write(GPIOD, dat);
GPIO_ResetBits(GPIOF,LCD_1602EN); //E 0
delay_us(2);
GPIO_SetBits(GPIOF,LCD_1602EN); //E 1
delay_us(2);
GPIO_ResetBits(GPIOF,LCD_1602EN); //E 0
delay_us(2);
}
//VO 11
//RS 12
//RW 13
//E 14
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SystemInit(); //系统时钟初始化
delay_init(); //延时函数初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOF, ENABLE); //使能PF,PD端口时钟
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; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOD0~7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化GPIOF 11,14,13,12
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_ms(300);
//液晶初始化
LCD1602_Write_Cmd(0x38); //显示16*2
delay_us(10);
LCD1602_Write_Cmd(0x0c);
delay_us(10);
LCD1602_Write_Cmd(0x06); //读写字符后地址加1,屏显不移动
delay_us(10);
LCD1602_Write_Cmd(0x01); //清屏,数据指针清零
delay_us(10);
LCD1602_Write_Cmd(0x80); //设置数据地址指针初始值
delay_us(2);
My_USART1_Init();
GPIO_ResetBits(GPIOA,GPIO_Pin_10);
while(1)
{
delay_ms(1);
if(flag == 1)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC));
flag=0;
while(USART_GetFlagStatus(USART1,USART_FLAG_TC));
for(i = 0;i<5;i++)
{
LCD1602_Write_Cmd(0x80+i+5);
delay_ms(10);
LCD1602_Write_Date(table[i]);
delay_ms(10);
}
//显示时间
for(j =3;j<5;j++) //h
{
LCD1602_Write_Cmd(0xc0+j-1);
delay_ms(10);
LCD1602_Write_Date(USART_Buff[j]);
delay_ms(10);
USART_SendData(USART1,USART_Buff[j]);
}
LCD1602_Write_Cmd(0xc0+4);
delay_ms(10);
LCD1602_Write_Date(':');
delay_ms(10);
for(j =5;j<7;j++) //m
{
LCD1602_Write_Cmd(0xc0+j);
delay_ms(10);
LCD1602_Write_Date(USART_Buff[j]);
delay_ms(10);
USART_SendData(USART1,USART_Buff[j]);
}
LCD1602_Write_Cmd(0xc0+7);
delay_ms(10);
LCD1602_Write_Date(':');
delay_ms(10);
for(j =7;j<12;j++) //s
{
LCD1602_Write_Cmd(0xc0+j+1);
delay_ms(10);
LCD1602_Write_Date(USART_Buff[j]);
delay_ms(10);
USART_SendData(USART1,USART_Buff[j]);
}
}
delay_ms(1000);
}
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
USART_Buff[i++] = USART_ReceiveData(USART1);
if(flag_M==1)
{
USART_SendData(USART1,0+0x30);
if(USART_Buff[1] == 'C')
{
flag_C=1;
}
else
{
flag_M=0;
i = 0;
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
usart 1062 BS280 - prefer.7z
(190.6 KB, 下载次数: 53)
2019-1-20 14:10 上传
点击文件名下载附件
程序源码
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1