?? +
字號:
/******************** 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 + -