msg_pt100/LCD/lcd_init.c

329 lines
6.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "lcd_init.h"
#include "delay.h"
#include "linear.h"
#include "adcs.h"
#include "ads1220.h"
#include "timer.h"
void LCD_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET);
}
/******************************************************************************
函数说明LCD串行数据写入函数
入口数据dat 要写入的串行数据
返回值: 无
******************************************************************************/
void LCD_Writ_Bus(u8 dat)
{
u8 i;
LCD_CS_Clr();
for(i=0;i<8;i++)
{
LCD_SCLK_Clr();
delay_us(1);
if(dat&0x80)
{
LCD_MOSI_Set();
}
else
{
LCD_MOSI_Clr();
}
LCD_SCLK_Set();
delay_us(1);
dat<<=1;
}
LCD_CS_Set();
}
/******************************************************************************
函数说明LCD写入数据
入口数据dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
LCD_Writ_Bus(dat);
}
/******************************************************************************
函数说明LCD写入数据
入口数据dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
LCD_Writ_Bus(dat>>8);
LCD_Writ_Bus(dat);
}
/******************************************************************************
函数说明LCD写入命令
入口数据dat 写入的命令
返回值: 无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
LCD_DC_Clr();//写命令
LCD_Writ_Bus(dat);
LCD_DC_Set();//写数据
}
/******************************************************************************
函数说明:设置起始和结束地址
入口数据x1,x2 设置列的起始和结束地址
y1,y2 设置行的起始和结束地址
返回值: 无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
if(USE_HORIZONTAL==0)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+34);
LCD_WR_DATA(x2+34);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==1)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1+34);
LCD_WR_DATA(x2+34);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1);
LCD_WR_DATA(y2);
LCD_WR_REG(0x2c);//储存器写
}
else if(USE_HORIZONTAL==2)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+34);
LCD_WR_DATA(y2+34);
LCD_WR_REG(0x2c);//储存器写
}
else
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_DATA(x1);
LCD_WR_DATA(x2);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_DATA(y1+34);
LCD_WR_DATA(y2+34);
LCD_WR_REG(0x2c);//储存器写
}
}
void LCD_Init(void)
{
LCD_GPIO_Init();//初始化GPIO
LCD_RES_Clr();//复位
delay_ms(30);
LCD_RES_Set();
delay_ms(100);
LCD_BLK_Clr();
//LCD_BLK_Set();//打开背光
delay_ms(100);
LCD_WR_REG(0x11);
// delay_ms(120);
LCD_WR_REG(0x36);
if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
else LCD_WR_DATA8(0xA0);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x13);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);
LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);
LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xD6);
LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3E);
LCD_WR_DATA8(0x38);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x30);
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xF0);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x0A);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x07);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x3E);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x29);
LCD_WR_DATA8(0x32);
LCD_WR_REG(0x21);
LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x29);
//屏幕填充白色
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
//第一行显示电池电量和工作状态
LCD_DrawRectangle(215,5,295,30,BLACK);
LCD_DrawRectangle(295,12,300,23,BLACK);
LCD_Fill(216,6,294,29,GREEN);
LCD_ShowString(10,0,"default",RED,WHITE,32,0);
//第二行显示采样电压
LCD_ShowString(10,33,"CurrentV:",RED,WHITE,32,0);
LCD_ShowString(260,33,"mv",RED,WHITE,32,0);
//第三行显示采样电压最大值
LCD_ShowString(10,66,"MaxV:",RED,WHITE,32,0);
LCD_ShowString(200,66,"mv",RED,WHITE,32,0);
//第四行像是采样电压最小值
LCD_ShowString(10,99,"MinV:",RED,WHITE,32,0);
LCD_ShowString(200,99,"mv",RED,WHITE,32,0);
//第五行显示线性度
LCD_ShowString(10,132,"Linearity:",RED,WHITE,32,0);
LCD_ShowString(270,132,"%",RED,WHITE,32,0);
}
int display_v = 0,display_max = 0,display_min = 0;
void lcd_display()
{
long samp_v = ads1220_data;
uint16_t power = 0;
//电池电量
power = 216 + ((ADC_ConvertedValue - 1200.0) / 160.0) * 68.0;
if(power > 294)
power = 294;
if(power < 216)
power = 216;
if(power > 237)
{
LCD_Fill(216,6,power,29,GREEN);
LCD_Fill(power,6,294,29,WHITE);
}
else
{
LCD_Fill(216,6,power,29,YELLOW);
LCD_Fill(power,6,294,29,WHITE);
}
//采样电压
if(samp_v < 0)
{
LCD_ShowString(165,33,"-",RED,WHITE,32,0);
display_v = -samp_v;
}
else
{
LCD_ShowString(165,33,"+",RED,WHITE,32,0);
display_v = samp_v;
}
LCD_ShowIntNum(180,33,display_v,4,RED,WHITE,32);
//最大电压
if(maxv < 0)
{
LCD_ShowString(105,66,"-",RED,WHITE,32,0);
display_max = -maxv;
}
else
{
LCD_ShowString(105,66,"+",RED,WHITE,32,0);
display_max = maxv;
}
LCD_ShowIntNum(120,66,display_max,4,RED,WHITE,32);
//最小电压
if(minv < 0)
{
LCD_ShowString(105,99,"-",RED,WHITE,32,0);
display_min = -minv;
}
else
{
LCD_ShowString(105,99,"+",RED,WHITE,32,0);
display_min = minv;
}
LCD_ShowIntNum(120,99,display_min,4,RED,WHITE,32);
//线性度
LCD_ShowFloatNum1(180,132,(linearity * 100),4,RED,WHITE,32);
}