標(biāo)題:
stm32單片機+GPS+1602液晶代碼
[打印本頁]
作者:
風(fēng)氣天藍(lán)
時間:
2019-1-20 13:27
標(biāo)題:
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); //使用相應(yīng)的時鐘
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); //中斷優(yōu)先級的設(shè)置
}
//寫命令
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
}
//寫數(shù)據(jù)
void LCD1602_Write_Date(unsigned char dat)
{
GPIO_SetBits(GPIOF,LCD_1602RS); //RS 1 RS高是數(shù)據(jù),低是命令
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(); //系統(tǒng)時鐘初始化
delay_init(); //延時函數(shù)初始化
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); //清屏,數(shù)據(jù)指針清零
delay_us(10);
LCD1602_Write_Cmd(0x80); //設(shè)置數(shù)據(jù)地址指針初始值
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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
usart 1062 BS280 - prefer.7z
(190.6 KB, 下載次數(shù): 53)
2019-1-20 14:10 上傳
點擊文件名下載附件
程序源碼
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1