1.硬件
芯片:stm32f103rct6
3.5寸屏幕驅(qū)動(dòng):ili9488
驅(qū)動(dòng)方式:8080
接口方式:16位并口文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-616011.html
2.硬件連接
LCD屏幕 | Stm32引腳 |
---|---|
LCD_CS | PC9 |
LCD_RS | PC8 |
LCD_WR | PC7 |
LCD_RD | PC6 |
D0-D15 | PB0~15 |
3.頭文件
#ifndef __LCD_H
#define __LCD_H
#include "sys.h"
#include "stdlib.h"
//LCD重要參數(shù)集
typedef struct
{
u16 width; //LCD 寬度
u16 height; //LCD 高度
u16 id; //LCD ID
u8 dir; //橫屏還是豎屏控制:0,豎屏;1,橫屏。
u16 wramcmd; //開(kāi)始寫gram指令
u16 setxcmd; //設(shè)置x坐標(biāo)指令
u16 setycmd; //設(shè)置y坐標(biāo)指令
}_lcd_dev;
// LCD參數(shù)
extern _lcd_dev lcddev; //管理LCD重要參數(shù)
// LCD的畫筆顏色和背景色
extern u16 POINT_COLOR;//默認(rèn)紅色
extern u16 BACK_COLOR; //背景顏色.默認(rèn)為白色
// PB0~15,作為數(shù)據(jù)線
#define DATAOUT(x) GPIOB->ODR=x; //數(shù)據(jù)輸出
#define DATAIN GPIOB->IDR; //數(shù)據(jù)輸入
//-----------------LCD端口定義----------------
#define LCD_LED PCout(10) //LCD背光 PC10
#define LCD_CS_SET GPIOC->BSRR=1<<9 //片選端口 PC9
#define LCD_RS_SET GPIOC->BSRR=1<<8 //數(shù)據(jù)/命令 PC8
#define LCD_WR_SET GPIOC->BSRR=1<<7 //寫數(shù)據(jù) PC7
#define LCD_RD_SET GPIOC->BSRR=1<<6 //讀數(shù)據(jù) PC6
#define LCD_CS_CLR GPIOC->BRR=1<<9 //片選端口 PC9
#define LCD_RS_CLR GPIOC->BRR=1<<8 //數(shù)據(jù)/命令 PC8
#define LCD_WR_CLR GPIOC->BRR=1<<7 //寫數(shù)據(jù) PC7
#define LCD_RD_CLR GPIOC->BRR=1<<6 //讀數(shù)據(jù) PC6
//寫數(shù)據(jù)函數(shù)
//#define LCD_WR_DATA(data){\
//LCD_RS_SET;\
//LCD_CS_CLR;\
//DATAOUT(data);\
//LCD_WR_CLR;\
//LCD_WR_SET;\
//LCD_CS_SET;\
//}
//
//掃描方向定義
#define L2R_U2D 0 //從左到右,從上到下
#define L2R_D2U 1 //從左到右,從下到上
#define R2L_U2D 2 //從右到左,從上到下
#define R2L_D2U 3 //從右到左,從下到上
#define U2D_L2R 4 //從上到下,從左到右
#define U2D_R2L 5 //從上到下,從右到左
#define D2U_L2R 6 //從下到上,從左到右
#define D2U_R2L 7 //從下到上,從右到左
#define DFT_SCAN_DIR L2R_U2D //默認(rèn)的掃描方向
//畫筆顏色
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40 //棕色
#define BRRED 0XFC07 //棕紅色
#define GRAY 0X8430 //灰色
#define DARKBLUE 0X01CF //深藍(lán)色
#define LIGHTBLUE 0X7D7C //淺藍(lán)色
#define GRAYBLUE 0X5458 //灰藍(lán)色
#define LIGHTGREEN 0X841F //淺綠色
#define LGRAY 0XC618 //淺灰色(PANNEL),窗體背景色
#define LGRAYBLUE 0XA651 //淺灰藍(lán)色(中間層顏色)
#define LBBLUE 0X2B12 //淺棕藍(lán)色(選擇條目的反色)
void LCD_SetCursor(uint16_t statr_x,uint16_t start_y,uint16_t end_x,uint16_t end_y); //設(shè)置光標(biāo)
void LCD_Init(void); //初始化
void LCD_DisplayOn(void); //開(kāi)顯示
void LCD_DisplayOff(void); //關(guān)顯示
void LCD_Clear(u16 Color); //清屏
void LCD_DrawPoint(u16 x,u16 y); //畫點(diǎn)
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color); //快速畫點(diǎn)
u16 LCD_ReadPoint(u16 x,u16 y); //讀點(diǎn)
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r); //畫圓
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2); //畫線
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2); //畫矩形
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color); //填充單色
void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color); //填充指定顏色
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode); //顯示一個(gè)字符
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size); //顯示一個(gè)數(shù)字
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode); //顯示 數(shù)字
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p); //顯示一個(gè)字符串,12/16字體
void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue);
u16 LCD_ReadReg(u16 LCD_Reg);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(u16 RGB_Code);
void LCD_Scan_Dir(u8 dir); //設(shè)置屏掃描方向
void LCD_Display_Dir(u8 dir); //設(shè)置屏幕顯示方向
void LCD_test(void);
#endif
4.主程序
#include "lcd.h"
#include "stdlib.h"
#include "font.h"
#include "usart.h"
#include "delay.h"
// LCD的畫筆顏色和背景色
u16 POINT_COLOR = 0x0000; // 畫筆顏色
u16 BACK_COLOR = 0xFFFF; // 背景色
//管理LCD重要參數(shù)
//默認(rèn)為豎屏
_lcd_dev lcddev;
//* 名稱:void LCD_WR_REG(u16 regval)
//* 功能:寫寄存器
//* 輸入:regval:寄存器值
//* 返回:無(wú)
void LCD_WR_REG(u16 regval)
{
LCD_RS_CLR;
LCD_CS_CLR;
DATAOUT(regval);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
//* 名稱:void LCD_WR_DATA(u16 data)
//* 功能:寫LCD數(shù)據(jù)
//* 輸入:data:要寫入的值
//* 返回:無(wú)
void LCD_WR_DATA(u16 data)
{
LCD_RS_SET;
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
//* 名稱:u16 LCD_RD_DATA(void)
//* 功能:讀LCD數(shù)據(jù)
//* 輸入:無(wú)
//* 返回:返回值:讀到的值
u16 LCD_RD_DATA(void)
{
u16 t;
GPIOB->CRL=0X88888888; //PB0-7 上拉輸入
GPIOB->CRH=0X88888888; //PB8-15 上拉輸入
GPIOB->ODR=0X0000; //全部輸出0
LCD_RS_SET;
LCD_CS_CLR;
LCD_RD_CLR;
t=DATAIN;
LCD_RD_SET;
LCD_CS_SET;
GPIOB->CRL=0X33333333; //PB0-7 上拉輸出
GPIOB->CRH=0X33333333; //PB8-15 上拉輸出
GPIOB->ODR=0XFFFF; //全部輸出高
return t;
}
//* 名稱:void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)
//* 功能:寫寄存器
//* 輸入:LCD_Reg:寄存器地址,LCD_RegValue:要寫入的數(shù)據(jù)
//* 返回:無(wú)
void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)
{
LCD_WR_REG(LCD_Reg);
LCD_WR_DATA(LCD_RegValue);
}
//* 名稱:u16 LCD_ReadReg(u16 LCD_Reg)
//* 功能:讀寄存器
//* 輸入:LCD_Reg:寄存器地址
//* 返回:讀到的數(shù)據(jù)
u16 LCD_ReadReg(u16 LCD_Reg)
{
LCD_WR_REG(LCD_Reg); //寫入要讀的寄存器號(hào)
delay_us(15);
return LCD_RD_DATA();
}
//* 名稱:void LCD_WriteRAM_Prepare(void)
//* 功能:開(kāi)始寫GRAM
//* 輸入:無(wú)
//* 返回:無(wú)
void LCD_WriteRAM_Prepare(void)
{
LCD_WR_REG(lcddev.wramcmd);
}
//* 名稱:void LCD_WriteRAM(u16 RGB_Code)
//* 功能:LCD寫GRAM
//* 輸入:RGB_Code:顏色值
//* 返回:無(wú)
void LCD_WriteRAM(u16 RGB_Code)
{
LCD_WR_DATA(RGB_Code);//寫十六位GRAM
}
//* 名稱:u16 LCD_BGR2RGB(u16 c)
//* 功能:從ILI93xx讀出的數(shù)據(jù)為GBR格式,而我們寫入的時(shí)候?yàn)镽GB格式。
//* 輸入:c:GBR格式的顏色值
//* 返回:RGB格式的顏色值
u16 LCD_BGR2RGB(u16 c)
{
u16 r,g,b,rgb;
b=(c>>0)&0x1f;
g=(c>>5)&0x3f;
r=(c>>11)&0x1f;
rgb=(b<<11)+(g<<5)+(r<<0);
return(rgb);
}
//* 名稱:void opt_delay(u8 i)
//* 功能:當(dāng)mdk -O1時(shí)間優(yōu)化時(shí)需要設(shè)置
//* 輸入:延時(shí)i
//* 返回:無(wú)
void opt_delay(u8 i)
{
while(i--);
}
//* 名稱:u16 LCD_ReadPoint(u16 x,u16 y)
//* 功能:讀取個(gè)某點(diǎn)的顏色值
//* 輸入:x,y:坐標(biāo)
//* 返回:此點(diǎn)的顏色
u16 LCD_ReadPoint(u16 x,u16 y)
{
u16 r=0,g=0,b=0;
u16 color;
if(x>=lcddev.width||y>=lcddev.height)return 0; //超過(guò)了范圍,直接返回
LCD_WR_REG(0X2E);//9486 發(fā)送讀GRAM指令
color=LCD_RD_DATA(); //讀出顏色值
opt_delay(2);
color=LCD_RD_DATA(); //實(shí)際坐標(biāo)顏色
opt_delay(2);
return color;
}
//* 名稱:void LCD_DisplayOn(void)
//* 功能:LCD開(kāi)啟顯示
//* 輸入:無(wú)
//* 返回:無(wú)
void LCD_DisplayOn(void)
{
LCD_WR_REG(0X29); //開(kāi)啟顯示
}
//* 名稱:void LCD_DisplayOff(void)
//* 功能:LCD關(guān)閉顯示
//* 輸入:無(wú)
//* 返回:無(wú)
void LCD_DisplayOff(void)
{
LCD_WR_REG(0X28); //關(guān)閉顯示
}
//* 名稱:void LCD_Scan_Dir(u8 dir)
//* 功能:設(shè)置LCD的自動(dòng)掃描方向
//* 輸入:無(wú)
//* 返回:無(wú)
void LCD_Scan_Dir(u8 dir)
{
u16 regval=0;
u16 dirreg=0;
if((lcddev.dir==1&&lcddev.id!=0X6804&&lcddev.id!=0X1963)||(lcddev.dir==0&&lcddev.id==0X1963))//橫屏?xí)r,對(duì)6804和1963不改變掃描方向!豎屏?xí)r1963改變方向
{
switch(dir)//方向轉(zhuǎn)換
{
case 0:dir=6;break;
case 1:dir=7;break;
case 2:dir=4;break;
case 3:dir=5;break;
case 4:dir=1;break;
case 5:dir=0;break;
case 6:dir=3;break;
case 7:dir=2;break;
}
}
switch(dir)
{
case L2R_U2D://從左到右,從上到下
regval|=(0<<7)|(0<<6)|(0<<5);
break;
case L2R_D2U://從左到右,從下到上
regval|=(1<<7)|(0<<6)|(0<<5);
break;
case R2L_U2D://從右到左,從上到下
regval|=(0<<7)|(1<<6)|(0<<5);
break;
case R2L_D2U://從右到左,從下到上
regval|=(1<<7)|(1<<6)|(0<<5);
break;
case U2D_L2R://從上到下,從左到右
regval|=(0<<7)|(0<<6)|(1<<5);
break;
case U2D_R2L://從上到下,從右到左
regval|=(0<<7)|(1<<6)|(1<<5);
break;
case D2U_L2R://從下到上,從左到右
regval|=(1<<7)|(0<<6)|(1<<5);
break;
case D2U_R2L://從下到上,從右到左
regval|=(1<<7)|(1<<6)|(1<<5);
break;
}
dirreg=0X36;
regval|=0X08;
LCD_WriteReg(dirreg,regval);
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(0);LCD_WR_DATA(0);
LCD_WR_DATA((lcddev.width-1)>>8);LCD_WR_DATA((lcddev.width-1)&0XFF);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(0);LCD_WR_DATA(0);
LCD_WR_DATA((lcddev.height-1)>>8);LCD_WR_DATA((lcddev.height-1)&0XFF);
}
//* 名稱:void LCD_Display_Dir(u8 dir)
//* 功能:設(shè)置LCD顯示方向
//* 輸入:dir:0,豎屏;1,橫屏
//* 返回:無(wú)
void LCD_Display_Dir(u8 dir)
{
if(dir==0)
{
lcddev.dir=0;
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;
lcddev.width=320;
lcddev.height=480;
}
else
{
lcddev.dir=1;
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;
lcddev.width=480;
lcddev.height=320;
}
LCD_Scan_Dir(DFT_SCAN_DIR); //默認(rèn)掃描方向
}
//* 名稱:void LCD_Init(void)
//* 功能:初始化lcd
//* 輸入:無(wú)
//* 返回:無(wú)
void LCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//開(kāi)啟SWD,失能JTAG
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6);
GPIO_ResetBits(GPIOC,GPIO_Pin_10);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_All);
LCD_WR_REG(0XD3);
lcddev.id=LCD_RD_DATA();
lcddev.id=LCD_RD_DATA();
lcddev.id=LCD_RD_DATA();
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA();
LCD_WR_REG( 0XF7 );
LCD_WR_DATA( 0xA9 );
LCD_WR_DATA( 0x51 );
LCD_WR_DATA( 0x2C );
LCD_WR_DATA( 0x82 );
/* Power Control 1 (C0h) */
LCD_WR_REG( 0xC0 );
LCD_WR_DATA( 0x11 );
LCD_WR_DATA( 0x09 );
/* Power Control 2 (C1h) */
LCD_WR_REG( 0xC1 );
LCD_WR_DATA( 0x41 );
/* VCOM Control (C5h) */
LCD_WR_REG( 0XC5 );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x0A );
LCD_WR_DATA( 0x80 );
/* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
LCD_WR_REG( 0xB1 );
LCD_WR_DATA( 0xB0 );
LCD_WR_DATA( 0x11 );
/* Display Inversion Control (B4h) */
LCD_WR_REG( 0xB4 );
LCD_WR_DATA( 0x02 );
/* Display Function Control (B6h) */
LCD_WR_REG( 0xB6 );
LCD_WR_DATA( 0x02 );
LCD_WR_DATA( 0x22 );
/* Entry Mode Set (B7h) */
LCD_WR_REG( 0xB7 );
LCD_WR_DATA( 0xc6 );
/* HS Lanes Control (BEh) */
LCD_WR_REG( 0xBE );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x04 );
/* Set Image Function (E9h) */
LCD_WR_REG( 0xE9 );
LCD_WR_DATA( 0x00 );
LCD_WR_REG( 0x36 );
LCD_WR_DATA( 0x08 );
/* Interface Pixel Format (3Ah) */
LCD_WR_REG( 0x3A );
LCD_WR_DATA( 0x55 ); /* 0x55 : 16 bits/pixel */
/* PGAMCTRL (Positive Gamma Control) (E0h) */
LCD_WR_REG( 0xE0 );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x07 );
LCD_WR_DATA( 0x10 );
LCD_WR_DATA( 0x09 );
LCD_WR_DATA( 0x17 );
LCD_WR_DATA( 0x0B );
LCD_WR_DATA( 0x41 );
LCD_WR_DATA( 0x89 );
LCD_WR_DATA( 0x4B );
LCD_WR_DATA( 0x0A );
LCD_WR_DATA( 0x0C );
LCD_WR_DATA( 0x0E );
LCD_WR_DATA( 0x18 );
LCD_WR_DATA( 0x1B );
LCD_WR_DATA( 0x0F );
/* NGAMCTRL (Negative Gamma Control) (E1h) */
LCD_WR_REG( 0XE1 );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x17 );
LCD_WR_DATA( 0x1A );
LCD_WR_DATA( 0x04 );
LCD_WR_DATA( 0x0E );
LCD_WR_DATA( 0x06 );
LCD_WR_DATA( 0x2F );
LCD_WR_DATA( 0x45 );
LCD_WR_DATA( 0x43 );
LCD_WR_DATA( 0x02 );
LCD_WR_DATA( 0x0A );
LCD_WR_DATA( 0x09 );
LCD_WR_DATA( 0x32 );
LCD_WR_DATA( 0x36 );
LCD_WR_DATA( 0x0F );
/* Sleep Out11h */
LCD_WR_REG( 0x11 );
delay_ms( 120 );
LCD_WR_REG( 0x29 );
LCD_Display_Dir(0);
LCD_LED=1;
LCD_Clear(WHITE);
}
//* 名稱:void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
//* 功能:快速畫點(diǎn)
//* 輸入:x,y:坐標(biāo),color:顏色
//* 返回:無(wú)
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
{
LCD_SetCursor(x,y,lcddev.width,lcddev.height);
LCD_WR_REG(lcddev.wramcmd);
LCD_WR_DATA(color);
}
//* 名稱:void LCD_Clear(u16 color)
//* 功能:清屏函數(shù)
//* 輸入:color:顏色
//* 返回:無(wú)
void LCD_Clear(u16 color)
{
u32 index=0;
u32 totalpoint=lcddev.width;
totalpoint*=lcddev.height; //得到總點(diǎn)
LCD_SetCursor(0,0,lcddev.width,lcddev.height);
LCD_WriteRAM_Prepare(); //開(kāi)始寫入GRAM
for(index=0;index<totalpoint;index++)
{
LCD_WR_DATA(color);
}
}
//* 名稱:void LCD_SetCursor(uint16_t statr_x,uint16_t start_y,uint16_t end_x,uint16_t end_y)
//* 功能:設(shè)置光標(biāo)位置
//* 輸入:坐標(biāo)
//* 返回:無(wú)
void LCD_SetCursor(uint16_t statr_x,uint16_t start_y,uint16_t end_x,uint16_t end_y)
{
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(statr_x>>8);
LCD_WR_DATA(statr_x&0XFF);
LCD_WR_DATA(end_x>>8);
LCD_WR_DATA(end_x&0XFF);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(start_y>>8);
LCD_WR_DATA(start_y&0XFF);
LCD_WR_DATA(end_y>>8);
LCD_WR_DATA(end_y&0XFF);
}
//* 名稱:void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
//* 功能:在指定區(qū)域內(nèi)填充單個(gè)顏色
//* 輸入:sx,sy),(ex,ey):填充矩形對(duì)角坐標(biāo),區(qū)域大小為:(ex-sx+1)*(ey-sy+1) color:要填充的顏色
//* 返回:無(wú)
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
{
u16 i,j;
u16 xlen=0;
u16 temp;
LCD_SetCursor(sx,sy,ex,ey);
LCD_WriteRAM_Prepare(); //開(kāi)始寫入GRAM
for(j=sy;j<ey-sy+1;j++)
{
for(i=sx;i<ex-sx+1;i++)
{
LCD_WR_DATA(color);
}
}
}
//* 名稱:void LCD_DrawPoint(u16 x,u16 y)
//* 功能:畫點(diǎn)
//* 輸入:x,y:坐標(biāo)
//* 返回:無(wú)
void LCD_DrawPoint(u16 x,u16 y)
{
LCD_SetCursor(x,y,lcddev.width,lcddev.height); //設(shè)置光標(biāo)位置
LCD_WriteRAM_Prepare(); //開(kāi)始寫入GRAM
LCD_WR_DATA(POINT_COLOR);
}
//* 名稱:void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
//* 功能:畫線
//* 輸入:x1,y1:起點(diǎn)坐標(biāo),x2,y2:終點(diǎn)坐標(biāo)
//* 返回:無(wú)
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1; //計(jì)算坐標(biāo)增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x>0)incx=1; //設(shè)置單步方向
else if(delta_x==0)incx=0;//垂直線
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;//水平線
else{incy=-1;delta_y=-delta_y;}
if( delta_x>delta_y)distance=delta_x; //選取基本增量坐標(biāo)軸
else distance=delta_y;
for(t=0;t<=distance+1;t++ )//畫線輸出
{
LCD_DrawPoint(uRow,uCol);//畫點(diǎn)
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr>distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr>distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
//* 名稱:void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
//* 功能:畫矩形
//* 輸入:(x1,y1),(x2,y2):矩形的對(duì)角坐標(biāo)
//* 返回:無(wú)
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
{
LCD_DrawLine(x1,y1,x2,y1);
LCD_DrawLine(x1,y1,x1,y2);
LCD_DrawLine(x1,y2,x2,y2);
LCD_DrawLine(x2,y1,x2,y2);
}
//* 名稱:void LCD_Draw_Circle(u16 x0,u16 y0,u8 r)
//* 功能:在指定位置畫一個(gè)指定大小的圓
//* 輸入:(x,y):中心點(diǎn),r:半徑
//* 返回:無(wú)
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r)
{
int a,b;
int di;
a=0;b=r;
di=3-(r<<1); //判斷下個(gè)點(diǎn)位置的標(biāo)志
while(a<=b)
{
LCD_DrawPoint(x0+a,y0-b); //5
LCD_DrawPoint(x0+b,y0-a); //0
LCD_DrawPoint(x0+b,y0+a); //4
LCD_DrawPoint(x0+a,y0+b); //6
LCD_DrawPoint(x0-a,y0+b); //1
LCD_DrawPoint(x0-b,y0+a);
LCD_DrawPoint(x0-a,y0-b); //2
LCD_DrawPoint(x0-b,y0-a); //7
a++;
//使用Bresenham算法畫圓
if(di<0)di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
}
}
//* 名稱:void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
//* 功能:在指定位置顯示一個(gè)字符
//* 輸入:x,y:起始坐標(biāo),num:要顯示的字符:" "--->"~",size:字體大小 12/16/24,mode:疊加方式(1)還是非疊加方式(0)
//* 返回:無(wú)
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{
u8 temp,t1,t;
u16 y0=y;
u8 csize=(size/8+((size%8)?1:0))*(size/2); //得到字體一個(gè)字符對(duì)應(yīng)點(diǎn)陣集所占的字節(jié)數(shù)
num=num-' ';//得到偏移后的值(ASCII字庫(kù)是從空格開(kāi)始取模,所以-' '就是對(duì)應(yīng)字符的字庫(kù))
for(t=0;t<csize;t++)
{
if(size==12)
temp=asc2_1206[num][t]; //調(diào)用1206字體
else if(size==16)
temp=asc2_1608[num][t]; //調(diào)用1608字體
else if(size==24)
temp=asc2_2412[num][t]; //調(diào)用2412字體
else
return; //沒(méi)有的字庫(kù)
for(t1=0;t1<8;t1++)
{
if(temp&0x80)
LCD_Fast_DrawPoint(x,y,POINT_COLOR);
else if(mode==0)
LCD_Fast_DrawPoint(x,y,BACK_COLOR);
temp<<=1;
y++;
if(y>=lcddev.height)
return; //超區(qū)域了
if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width)
return; //超區(qū)域了
break;
}
}
}
}
//* 名稱:u32 LCD_Pow(u8 m,u8 n)
//* 功能:m^n函數(shù)
//* 輸入:m^n次方
//* 返回:無(wú)
u32 LCD_Pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
//* 名稱:void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
//* 功能:顯示數(shù)字,高位為0,則不顯示
//* 輸入:x,y :起點(diǎn)坐標(biāo),len :數(shù)字的位數(shù),size:字體大小,color:顏色 ,num:數(shù)值(0~4294967295);
//* 返回:無(wú)
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/LCD_Pow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
LCD_ShowChar(x+(size/2)*t,y,' ',size,0);
continue;
}
else
enshow=1;
}
LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,0);
}
}
//* 顯示數(shù)字,高位為0,還是顯示
//* x,y:起點(diǎn)坐標(biāo)
//* num:數(shù)值(0~999999999);
//* len:長(zhǎng)度(即要顯示的位數(shù))
//* size:字體大小
//* mode:
//* [7]:0,不填充;1,填充0.
//* [6:1]:保留
//* [0]:0,非疊加顯示;1,疊加顯示.
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/LCD_Pow(10,len-t-1))%10;
if(enshow==0&&t<(len-1))
{
if(temp==0)
{
if(mode&0X80)LCD_ShowChar(x+(size/2)*t,y,'0',size,mode&0X01);
else LCD_ShowChar(x+(size/2)*t,y,' ',size,mode&0X01);
continue;
}else enshow=1;
}
LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,mode&0X01);
}
}
//* 顯示字符串
//* x,y:起點(diǎn)坐標(biāo)
//* width,height:區(qū)域大小
//* size:字體大小
//* *p:字符串起始地址
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)
{
u8 x0=x;
width+=x;
height+=y;
while((*p<='~')&&(*p>=' '))//判斷是不是非法字符!
{
if(x>=width){x=x0;y+=size;}
if(y>=height)break;//退出
LCD_ShowChar(x,y,*p,size,0);
x+=size/2;
p++;
}
}
//* 名稱:void LCD_test(void)
//* 功能:LCD功能函數(shù)測(cè)試
//* 輸入:無(wú)
//* 返回:無(wú)
void LCD_test(void)
{
uint16_t i ,j;
LCD_Fill(0,0,150,150,YELLOW);
for( j=150;j<300;j++)
{
for( i=150;i<300;i++)
{
LCD_Fast_DrawPoint(j,i,CYAN);
}
}
LCD_ShowNum(10,150,88888,5,24);
LCD_ShowChar(10,170,'8',24,0);
LCD_ShowxNum(10,210,112233,6,24,0);
LCD_ShowString(10,230,60,10,24,"AABBCC");
LCD_DrawLine(0,0, 300, 300);
LCD_Draw_Circle(150,150,100);
}
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-616011.html
到了這里,關(guān)于Stm32F103RC驅(qū)動(dòng)ili9488 LCD TFT 3.5寸液晶屏的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!