标题:
2.4寸9341的STM32驱动代码 直接可以显示 8位
[打印本页]
作者:
liuzhengduo16
时间:
2019-9-7 18:50
标题:
2.4寸9341的STM32驱动代码 直接可以显示 8位
2.4寸 tftlcd 9341 驱动代码部分程序预览:
单片机源程序如下:
/****************************************Copyright (c)***************************************************
**--------------文件信息---------------------------------------------------------------------------------
**文 件 名: bsp.c
**描 述: STM32F4xxx 板基代码
**
**电 路 板 号:
**版 本: V1.0
**
**------------------------------------当前版本修订-------------------------------------------------------
**
**当 前 版 本:
**修 改 人:
**修 改 日 期:
**修 改 描 述:
**
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
#include "lcd.h"
#include "font.h"
char str[10];
char *getStringToInt(int16_t data,uint8_t type)
{
char *tmpstr = str;
memset(str,0,10);
if((type != 10) && (type != 16))
{
tmpstr = "0";
} else
{
if(type == 16)
{
sprintf(tmpstr,"%-8X",data);
if(data <= 0x0f)
{
str[1] = 0;
}
} else if (type == 10)
{
sprintf(tmpstr,"%d",data);
if((data <= 9) && (data >=0))
{
str[1] = 0;
}
}
}
return tmpstr;
}
char *getStringToFloat(float data)
{
char *tmpstr = str;
memset(str,0,10);
sprintf(tmpstr,"%.1f",data);
return tmpstr;
}
#define DELAY_MS(n) BSP_WaitUntilTime(n);
//LCD的画笔颜色和背景色
u16 POINT_COLOR=WHITE; //画笔颜色
u16 BACK_COLOR=BLUE; //背景色
_lcd_dev lcddev;
//u16 POINT_COLOR;//默认红色
//u16 BACK_COLOR; //背景颜色.默认为白色
//void DELAY_MS(n)
//{
// BSP_WaitUntilTime(n);
//}
//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
vu16 ram; //防止被优化
ram=TFT_RAM;
return ram;
}
//写寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_DataOut (uint8_t data) {
uint16_t ReadData = GPIOB->ODR;
ReadData = (ReadData & 0x00FF) | (data << 8);
GPIOB->ODR = ReadData;
}
uint8_t LCD_ReadData (void)
{
uint16_t ReadData = GPIOB->IDR;
return (ReadData >> 8);
}
/////////////////////////////////
void LCD_WR_REG(u16 regval)
{
// uint8_t TestData;
//TFT_REG=regval;//写入要写的寄存器序号
LCD_RS_L();
LCD_CS_L();
LCD_DataOut(regval&0xFF);
LCD_WR_L();
LCD_WR_H();
LCD_CS_H();
}
//////////////////////////////////
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(u16 data)
{
LCD_RS_H();
LCD_RD_H();
LCD_CS_L();
LCD_DataOut(data&0xff);
LCD_WR_L();
LCD_WR_H();
LCD_CS_H();
}
u16 LCD_ReadReg(u16 LCD_Reg)
{
LCD_WR_REG(LCD_Reg); //写入要读的寄存器序号
DELAY_MS(5);
return LCD_RD_DATA(); //返回读到的值
}
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
LCD->LCD_REG=lcddev.wramcmd;
}
//LCD写GRAM
//RGB_Code:颜色值
void LCD_WriteRAM(u8 RGB_Code)
{
LCD->LCD_RAM = RGB_Code;//写十六位GRAM
}
void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)
{
TFT_REG = LCD_Reg; //写入要写的寄存器序号
TFT_RAM = LCD_RegValue;//写入数据
}
const uint8_t ComTable[]={7,6,5,4,3,2,1,0,};
void LCD2_GPIO_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PB0 推挽输出 背光
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7| GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
//8位数据输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
LCD_CS_H();
LCD_RS_L();
lcddev.id=0X9341;
lcddev.dir=1;
lcddev.width=320;
lcddev.height = 240;
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;
}
//////////////////////////////////////////////////////////////////
//最底层数据传输函数
//m^n函数
//返回值:m^n次方.
u32 LCD_Pow(u8 m,u8 n)
{
u32 result=1;
while(n--)result*=m;
return result;
}
//显示数字,高位为0,则不显示
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//color:颜色
//num:数值(0~4294967295);
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);
}
}
//显示数字,高位为0,还是显示
//x,y:起点坐标
//num:数值(0~999999999);
//len:长度(即要显示的位数)
//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:起点坐标
//width,height:区域大小
//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_ShowStringT(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p,int mode)
{
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,mode);
x+=size/2;
p++;
}
}
void draw_line(int x1,int y1,int x2,int y2,int color)
{
int dx,dy,e;
dx=x2-x1;
dy=y2-y1;
if(dx>=0)
{
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 1/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
LCD_OutP(x1,y1,color);
if(e>0){y1+=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 2/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
LCD_OutP(x1,y1,color);
if(e>0){x1+=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 8/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
LCD_OutP(x1,y1,color);
if(e>0){y1-=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 7/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
LCD_OutP(x1,y1,color);
if(e>0){x1+=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
else //dx<0
{
dx=-dx; //dx=abs(dx)
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 4/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
LCD_OutP(x1,y1,color);
if(e>0){y1+=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 3/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
LCD_OutP(x1,y1,color);
if(e>0){x1-=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 5/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
LCD_OutP(x1,y1,color);
if(e>0){y1-=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 6/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
LCD_OutP(x1,y1,color);
if(e>0){x1-=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
}
void draw_lineS(int x1,int y1,int x2,int y2,int num,int color)
{
int con=0;
int i;
for(i=0;i<num;i++)
{
draw_line(x1+con,y1+con,x2+con,y2+con,color);
con++;
}
}
void LCDOpenWindows(u16 x, u16 y, u16 len, u16 wid)
{
LCD_WR_REG(0X2A);
LCD_WR_DATA(x>>8); //start
LCD_WR_DATA(x-((x>>8)<<8));
LCD_WR_DATA((x+len-1)>>8); //end
LCD_WR_DATA((x+len-1)-(((x+len-1)>>8)<<8));
LCD_WR_REG(0X2B);
LCD_WR_DATA(y>>8); //start
LCD_WR_DATA(y-((y>>8)<<8));
LCD_WR_DATA((y+wid-1)>>8); //end
LCD_WR_DATA((y+wid-1)-(((y+wid-1)>>8)<<8));
LCD_WR_REG(0x2C);
}
void fnImageShow( const unsigned char *img , u16 x , u16 y )
{
u16 i;
u16 HighFirst=0;
u16 Width,Hight; //图像的宽度和高度(16位数据)
u16 data;
//0:WORD类型高低位字节顺序与PC相同,1:WORD类型高低位字节顺序与PC相反。
if( img[0] & (1<<4) ) // 1,高位在前,低位在后.
{
HighFirst=1;
}
else //0,低位在前,高位在后.
{
HighFirst=0;
}
if(HighFirst==0) //高位在后
{
Width = img[3]; //img[3]是图像宽度高8位,赋值
Width <<= 8; //左移8位变成16位数据的高8位
Width |= img[2];//与低八位数据字节img[2]相或组成16位数据
Hight = img[5]; //img[5]是图像宽度高8位,赋值
Hight <<= 8; //左移8位变成16位数据的高8位
Hight |= img[4];//与低八位数据字节img[4]相或组成16位数据
}
else //高位在前
{
Width = img[2];//img[2]是图像宽度高8位,赋值
Width <<= 8; //左移8位变成16位数据的高8位
Width |= img[3];//与低八位数据字节img[3]相或组成16位数据
Hight = img[4]; //img[4]是图像宽度高8位,赋值
Hight <<= 8; //左移8位变成16位数据的高8位
Hight |= img[5]; //与低八位数据字节img[5]相或组成16位数据
}
/* if((X_Position+Width)>240||(Y_Position+Hight)>320)//如果宽度与高度超过范围,则警告
{
//可在此写警告
}
else
{
}*/
img=img+8; //图片数据中 前8个字节是图片信息 从第9个开始是图片像素信息(注意 img是从img[0]开始的,所以第9个字节是img[8])
LCD_SetPos( x , y , x+Width-1 , y+Hight-1 );//设置坐标
LCD_WriteReg(0x0020,x); //宽度位置坐标
LCD_WriteReg(0x0021,y); //高度位置坐标
LCD_WriteRAM(data); // 开始写入
for(i=0; i <Width*Hight; i++) // Hight Y_Position是高起始坐标,Y_Position+Hight是高终止坐标
{
if(HighFirst==0)
{
data = *(img++);
data |= ((u16)*img)<<8;
LCD_WR_REG(data);
img += 1;
}
else
{
data =((u16)*(img++));
data |=((u16)*img)<<8;
LCD_WR_REG(data);
img+=1;
}
}
}
复制代码
所有资料51hei提供下载:
Desktop.zip
(9.42 KB, 下载次数: 29)
2019-9-7 18:48 上传
点击文件名下载附件
2.4寸9341驱动代码
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1