📄 +
字号:
/******************** CHD1807 Team **************************
* 文件名 :lcd.c
* 描述 :LCD 应用函数库。
* 实现的功能:清屏、画点、划线、显示数字、字符串、图片、汉字
* 实验平台:CHD1807-STM32开发板
* 库版本 :ST3.5.0
**********************************************************************************/
#include "lcd.h"
#include "sd_fs_app.h"
#include "ascii.h"
#include "asc_font.h"
#include <stdlib.h>
u16 POINT_COLOR = RED; /*描点默认颜色*/
extern volatile u8 display_direction; /*0:横屏 1:竖屏*/
/*************************************API START*************************************************************/
/*****************************************
* 函数名:LCD_Init
* 描述 :LCD 控制 I/O 初始化
* LCD FSMC 初始化
* LCD 控制器 HX8347 初始化
* 输入 : 无
* 输出 :无
* 举例 :无
* 注意 :无
******************************************/
void LCD_Init(void)
{
unsigned long i;
LCD_GPIO_Config();
LCD_FSMC_Config();
LCD_Rst();
Lcd_init_conf();
Lcd_data_start();
for(i=0; i<(320*240); i++)
{
LCD_WR_Data(BLUE);
}
}
/******************************************************
* 函数名:LCD_Rectangle
* 描述 :在指定坐标处显示指定长宽的矩形
* 输入 : -x1 横向矩形起点 0~319
-y1 纵向矩形起点 0~239
-len 横向长度 0~319
-wid 纵向宽度 0~239
-rgb565 填充颜色
* 输出 :无
* 举例 : LCD_Rectangle(10,10,120,160,0);
LCD_Rectangle(200,200,120,40,0);
* 注意 : 已测试
*********************************************************/
void LCD_Rectangle(u16 x,u16 y,u16 len,u16 wid,u16 rgb565)
{
u32 n, temp;
Set_direction(0); /*设定方向为横向*/
LCD_open_windows(x,y,len,wid);
temp = (u32)len*wid;
for(n=0; n<temp; n++)
{
LCD_WR_Data( rgb565 );
}
}
/******************************************************
* 函数名:LCD_Point
* 描述 :在指定坐标处显示一个点
* 输入 : -x 横向显示位置 0~319
-y 纵向显示位置 0~239
* 输出 :无
* 举例 : LCD_Point(100,200);
LCD_Point(10,200);
LCD_Point(300,220);
* 注意 : (0,0)位置为液晶屏左上角 已测试
*********************************************************/
void LCD_Point(u16 x,u16 y)
{
LCD_open_windows(x,y,1,1);
LCD_WR_Data(POINT_COLOR);
}
/******************************************************
* 函数名:LCD_ColorPoint
* 描述 :在指定坐标处显示一个指定颜色的点
* 输入 : -x 横向显示位置 0~319
-y 纵向显示位置 0~239
-rgb565 指定颜色
* 输出 :无
* 举例 : LCD_ColorPoint(100,200,0);
LCD_ColorPoint(10,200,100);
LCD_ColorPoint(300,220,1000);
* 注意 : (0,0)位置为液晶屏左上角 已测试
*********************************************************/
void LCD_ColorPoint(u16 x,u16 y, u16 rgb565)
{
LCD_open_windows(x,y,1,1);
LCD_WR_Data(rgb565);
}
/******************************************************
* 函数名:LCD_Line
* 描述 :在指定两点之间画直线
* 输入 : -x1 横向起点 0~319
-y1 纵向起点 0~239
-x2 横向终点 0~319
-y2 纵向终点 0~239
* 输出 :无
* 举例 : LCD_Line(10,10, 319, 239);
LCD_Line(10,10, 100, 150);
LCD_Line(100, 150,10,10 );
* 注意 : 已测试
*********************************************************/
void LCD_Line(u16 x1, u16 y1, u16 x2, u16 y2)
{
u16 x, y, t;
Set_direction(0);
if( (x1 == x2) && (y1 == y2) )
LCD_Point(x1, y1);
else if( abs(y2 - y1) > abs(x2 - x1) ) /*斜率大于1*/
{
if(y1 > y2)
{
t = y1;
y1 = y2;
y2 = t;
t = x1;
x1 = x2;
x2 = t;
}
for(y=y1; y<y2; y++) /*以y轴为基准*/
{
x = (u32)(y-y1)*(x2-x1) / (y2-y1) + x1;
LCD_Point(x, y);
}
}
else /*斜率小于等于1*/
{
if(x1 > x2)
{
t = y1;
y1 = y2;
y2 = t;
t = x1;
x1 = x2;
x2 = t;
}
for(x=x1; x<x2; x++) /*以x轴为基准*/
{
y = (u32)(x-x1)*(y2-y1) / (x2-x1) + y1;
LCD_Point(x, y);
}
}
}
/******************************************************
* 函数名:LCD_Char_6x12_O
* 描述 :在指定位置悬浮显示指定字符
* 输入 : -x
-y
-acsii 要写入的字符
-Color 字符颜色
* 输出 :无
* 举例 :无
* 注意 :横屏 内部调用
*********************************************************/
void LCD_Char_6x12_O(u16 x, u16 y, u8 acsii, u16 Color)
{
#define MAX_CHAR_POSX (320-6)
#define MAX_CHAR_POSY (240-12)
u8 temp, t, pos;
if(x > MAX_CHAR_POSX || y > MAX_CHAR_POSY)
{
return;
}
LCD_open_windows(x,y,6,12);
acsii = acsii - ' '; /*得到偏移后的值*/
for(pos=0; pos<12; pos++)
{
temp = asc2_1206[acsii][pos];
for(t=0; t<6; t++) /* 低位开始,丢弃高两位*/
{
if(temp & 0x01)
{
if(t==0)
{
LCD_open_windows(x,y+pos,6,12-pos);
LCD_WR_Data(Color);
}
else
{
LCD_WR_Data(Color);
}
}
else
{
if(t==5) /*如果是末尾点--开启剩下窗户*/
{
LCD_open_windows(x,y+pos+1,6,12-pos-1);
}
else
{
LCD_open_windows(x+t+1,y+pos,6-t,1); /*前进一位 开启一行线*/
}
}
temp >>= 1;
}
}
#undef MAX_CHAR_POSX
#undef MAX_CHAR_POSY
}
/******************************************************
* 函数名:LCD_Char_6x12_O_P
* 描述 :在指定位置悬浮显示指定字符
* 输入 : -x
-y
-acsii 要写入的字符
-Color 字符颜色
* 输出 :无
* 举例 :无
* 注意 :竖屏 内部调用
*********************************************************/
void LCD_Char_6x12_O_P(u16 x, u16 y, u8 acsii,u16 Color) //竖屏
{
#define MAX_CHAR_POSX (320-12)
#define MAX_CHAR_POSY (240-6)
u8 temp, t, pos;
if(x > MAX_CHAR_POSX || y > MAX_CHAR_POSY)
return;
LCD_open_windows(x,y,12,6);
acsii = acsii - ' '; //得到偏移后的值
for(pos=0; pos<12; pos++)
{
if(display_direction==0)
temp = asc2_1206[acsii][pos];
else
temp = asc2_1206[acsii][12-pos];
for(t=0; t<6; t++) // 低位开始,丢弃高两位
{
if(temp & 0x01)
{
if(t==0)
{
LCD_open_windows(x+pos,y,12-pos,6);
LCD_WR_Data(Color);
}
else
{
LCD_WR_Data(Color);
}
}
else
{
if(t==5) /*如果是末尾点--则直接开启下一个矩形*/
{
LCD_open_windows(x+pos+1,y,12-pos-1,6);
}
else
{
LCD_open_windows(x+pos,y+t+1,1,6-t); /*前进一位 开启一行线*/
}
}
temp >>= 1;
}
}
#undef MAX_CHAR_POSX
#undef MAX_CHAR_POSY
}
/******************************************************
* 函数名:LCD_Char_O
* 描述 :在指定位置悬浮显示指定字符
* 输入 : -x
* -y
* -acsii 要写入的字符
* -Color 字符颜色
* 输出 :无
* 举例 :无
* 注意 :横屏 内部调用
*********************************************************/
void LCD_Char_O(u16 x, u16 y, u8 acsii,u16 Color)
{
#define MAX_CHAR_POSX (320-8)
#define MAX_CHAR_POSY (240-16)
u8 temp, t, pos;
if(x > MAX_CHAR_POSX || y > MAX_CHAR_POSY)
return;
LCD_open_windows(x,y,8,16);
for (pos=0;pos<16;pos++)
{
temp=ascii_8x16[((acsii-0x20)*16)+pos];
for(t=0; t<8; t++)
{
if(temp & 0x80)
{
if(t==0) /*如果是一行起点--则重新开启一个矩形*/
{
LCD_open_windows(x,y+pos,8,16-pos);
LCD_WR_Data(Color);
}
else
{
LCD_WR_Data(Color);
}
}
else
{
if(t==7) /*如果是末尾点--则直接开启下一个矩形*/
{
LCD_open_windows(x,y+pos+1,8,16-pos-1);
}
else
{
LCD_open_windows(x+t+1,y+pos,8-t,1);/*前进一位 开启一行线*/
}
}
temp <<= 1;
}
}
#undef MAX_CHAR_POSX
#undef MAX_CHAR_POSY
}
/******************************************************
* 函数名:LCD_Char_O_P
* 描述 :在指定位置悬浮显示指定字符
* 输入 : -x
* -y
* -acsii 要写入的字符
* -Color 字符颜色
* 输出 :无
* 举例 :无
* 注意 :竖屏
*********************************************************/
void LCD_Char_O_P(u16 x, u16 y, u8 acsii,u16 Color)
{
#define MAX_CHAR_POSX (320-16)
#define MAX_CHAR_POSY (240-8)
u8 temp, t, pos;
if(x > MAX_CHAR_POSX || y > MAX_CHAR_POSY)
return;
LCD_open_windows(x,y,16,8);
for (pos=0;pos<16;pos++)
{
temp=ascii_8x16[((acsii-0x20)*16)+16-pos];
for(t=0; t<8; t++)
{
if(temp & 0x80)
{
if(t==0)
{
LCD_open_windows(x+pos,y,16-pos,8);
LCD_WR_Data(Color);
}
else
{
LCD_WR_Data(Color);
}
}
else
{
if(t==7) /*如果是末尾点--则直接开启下一个矩形*/
{
LCD_open_windows(x+pos+1,y,16-pos-1,8);
}
else
{
LCD_open_windows(x+pos,y+t+1,1,8-t);/*前进一位 开启一行线*/
}
}
temp <<= 1;
}
}
#undef MAX_CHAR_POSX
#undef MAX_CHAR_POSY
}
/****************************************************************
* 函数名:LCD_Str_O
* 描述 :在指定坐标处悬浮显示8*16大小的字符串
* 输入 : -x 显示位置横向坐标 0 ~ 319
-y 显示位置纵向坐标 0 ~ 239
* -str 字符串首址
* -Color字符颜色
* 输出 :无
* 举例 : LCD_Str_O(0, 0, "Runing", 0);
LCD_Str_O(320-8*6, 239-16, "Runing",0);
* 注意 : 字符串显示方向为横向 已测试
******************************************************************/
void LCD_Str_O(u16 x, u16 y,const u8 *str,u16 Color)
{
Set_direction(0);
while(*str != '\0')
{
if(x > (320-8))
{
//换行
x = 0;
y += 16;
}
if(y > (240-16))
{
//一屏
x = y = 0;
}
LCD_Char_O(x ,y, *str,Color);
x += 8;
str ++ ;
}
}
/************************************************************
* 函数名:LCD_Char
* 描述 :在液晶坐标(x,y)中,显示一个16*8大小的字符
* 输入 : -x 0~(239-6)
* -y 0~(319-12)
* -acsii 要写入的字符
* -Color 字符颜色
* -bkColor 背景颜色
* 输出 :无
* 举例 :无
* 注意 :字符串显示方向为横 已测试
******************************************************************/
void LCD_Char(u16 x, u16 y,const u8 ascii, u16 Color, u16 bkColor)
{
#define MAX_CHAR_POSX (320-8)
#define MAX_CHAR_POSY (240-16)
u8 temp, t, pos;
if(x > MAX_CHAR_POSX || y > MAX_CHAR_POSY)
return;
LCD_open_windows(x,y,8,16);
for (pos=0;pos<16;pos++)
{
temp=ascii_8x16[((ascii-0x20)*16)+pos];
for(t=0; t<8; t++)
{
if(temp & 0x80)
{
LCD_WR_Data(Color);
}
else
{
LCD_WR_Data(bkColor);
}
temp <<= 1;
}
}
#undef MAX_CHAR_POSX
#undef MAX_CHAR_POSY
}
/************************************************************
* 函数名:LCD_Str_R
* 描述 :在液晶坐标(x,y)中,显示一个16*8大小的字符串,右对齐
* 输入 : -x 0~(239-6)
* -y 0~(319-12)
* -str 字符串首址
-len 字符串长度
-strColor 字符颜色
-bkColor 背景颜色
* 输出 :无
* 举例 :LCD_Str_R(304,59,“12345”,14,0x0000,0xffff)
* 注意 :字符串显示方向为横 已测试
******************************************************************/
void LCD_Str_R(u16 x,u16 y,const u8 *str,u8 len,u16 Color,u16 bkColor) //右对齐,超过35位,仅显示最后35位
{
u16 i=1,strlen=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -