SSD1289主控液晶的STM32驱动程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SSD1289主控液晶的STM32驱动程序
#include "GLCD.h"
#include "AsciiLib.h"
#include "Hzlib.h"
#include "win7.h"
/************************************************************** *****************
* Function Name : Lcd_Configuration
* Description : Configures LCD Control lines
* Input : None
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
static void LCD_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);
/*GPIOE=DATABUS*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* PD.13(RS), PD.14(WR), PD.15(RD),PD.12(CS) ,PD11(RST)*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_1
5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/************************************************************** *****************
* Function Name : LCD_WriteReg
* Description : LCD控制器寄存器地址
* Input : - index: 寄存器地址
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void LCD_WriteIndex(uint16_t index)
{
Clr_Rs;
Set_nRd;
GPIOE->ODR = index;
Clr_nWr;
Set_nWr;
}
/************************************************************** *****************
* Function Name : LCD_WriteReg
* Description : LCD寄存器数据
* Input : - index: 寄存器数据
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void LCD_WriteData(uint16_t data)
{
Set_Rs;
GPIOE->ODR = data;
Clr_nWr;
Set_nWr;
}
/************************************************************** *****************
* Function Name : LCD_ReadData
* Description : 读取控制器数据
* Input : None
* Output : None
* Return : 返回读取到的数据
* Attention : None
*************************************************************** ****************/
uint16_t LCD_ReadData(void)
{
uint16_t value;
Set_Rs;
Set_nWr;
Clr_nRd;
GPIOE->CRH = 0x44444444;
GPIOE->CRL = 0x44444444;
value = GPIOE->IDR;
value = GPIOE->IDR;
GPIOE->CRH = 0x33333333;
GPIOE->CRL = 0x33333333;
Set_nRd;
return value;
}
/************************************************************** *****************
* Function Name : LCD_WriteReg
* Description : Writes to the selected LCD register.
* Input : - LCD_Reg:
address of the selected register.
* - LCD_RegValue: value to write to the selected register.
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)
{
LCD_WriteIndex(LCD_Reg);
LCD_WriteData(LCD_RegValue);
}
/************************************************************** *****************
* Function Name : LCD_WriteReg
* Description : Reads the selected LCD Register.
* Input : None
* Output : None
* Return : LCD Register Value.
* Attention : None
*************************************************************** ****************/
uint16_t LCD_ReadReg(uint16_t LCD_Reg)
{
uint16_t LCD_RAM;
LCD_WriteIndex(LCD_Reg);
LCD_RAM = LCD_ReadData();
return LCD_RAM;
}
/************************************************************** *****************
* Function Name : LCD_SetCursor
* Description : Sets the cursor position.
* Input : - Xpos: specifies the X position.
* - Ypos: specifies the Y position.
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void LCD_SetCursor( uint16_t Xpos, uint16_t Ypos )
{
LCD_WriteReg(0x004e, Ypos );
LCD_WriteReg(0x004f, Xpos );
}
/************************************************************** *****************
* Function Name : LCD_Delay
* Description : Delay Time
* Input : - nCount: Delay Time
* Output : None
* Return : None
* Return : None
* Attention : None
*************************************************************** ****************/
static void delay_ms(uint16_t ms)
{
uint16_t i,j;
for( i = 0; i < ms; i++ )
{
for( j = 0; j < 1141; j++ );
}
}
/************************************************************** *****************
* Function Name : LCD_Initializtion
* Description : Initialize TFT Controller.
* Input : None
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void LCD_Initializtion(void)
{
LCD_Configuration();
Clr_Cs;
Clr_Rst;
delay_ms(100);
Set_Rst;
delay_ms(100);
LCD_WriteReg(0x0000,0x0001);//打开晶振
LCD_WriteReg(0x0010,0x0000);//退出休眠
delay_ms(50);
LCD_WriteReg(0x0001,0x293F);//横屏显示
LCD_WriteReg(0x0007,0x0033);//
LCD_WriteReg(0x0011,0x6838);//横屏显示
LCD_WriteReg(0x0002,0x0600);
/*gamma*/
LCD_WriteReg(0x0030,0x0101);
LCD_WriteReg(0x0031,0x0101);
LCD_WriteReg(0x0032,0x0101);
LCD_WriteReg(0x0033,0x0101);
LCD_WriteReg(0x0034,0x0101);
LCD_WriteReg(0x0035,0x0101);
LCD_WriteReg(0x0036,0x0101);
LCD_WriteReg(0x0037,0x0101);
LCD_WriteReg(0x003A,0x0101);
LCD_WriteReg(0x003B,0x0101);
/*Pixel*/
LCD_WriteRe
g(0x0044,0xEF00);
LCD_WriteReg(0x0045,0x0000);
LCD_WriteReg(0x0046,0x013F);
}
/************************************************************** *****************
* Function Name : LCD_Clear
* Description : 将屏幕填充成指定的颜色,如清屏,则填充 0xffff * Input : - Color: Screen Color
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void LCD_Clear(uint16_t Color)
{
uint32_t index=0;
LCD_Window(0,319,0,239);
for( index = 0; index <76800; index++ )
LCD_WriteData(Color);
}
/************************************************************** *****************
* Function Name : LCD_Window
* Description : LCD窗口显示
* Input : xs,xe,ys,ye窗口坐标
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void LCD_Window(uint16_t xs,uint16_t xe,uint16_t ys,uint16_t ye)
{
LCD_WriteReg(0x0044,ys+(ye<<8));
LCD_WriteReg(0x0045,xs);
LCD_WriteReg(0x0046,xe);
LCD_SetCursor(xs,ys);
LCD_WriteIndex(0x0022);
}
/************************************************************** ****************
* Function Name : LCD_GetPoint
* Description : 获取指定座标的颜色值
* Input : - Xpos: Row Coordinate
* - Xpos: Line Coordinate
* Output : None
* Return : Screen Color
* Attention : None
*************************************************************** ****************/
uint16_t LCD_GetPoint(uint16_t Xpos,uint16_t Ypos)
{
uint16_t dummy;
LCD_SetCursor(Xpos,Ypos);
LCD_WriteIndex(0x0022);
dummy = LCD_ReadData(); /* 空读一次 */
dummy = LCD_ReadData();
return dummy;
}
/************************************************************** ****************
* Function Name : LCD_SetPoint
* Description : 在指定座标画点
* Input : - Xpos: Row Coordinate
* - Ypos: Line Coordinate
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void LCD_SetPoint(uint16_t Xpos,uint16_t Ypos,uint16_t point)
{
if( Xpos >= MAX_X || Ypos >= MAX_Y )
return;
LCD_SetCursor(Xpos,Ypos);
LCD_WriteReg(0x0022,point);
}
/************************************************************** ****************
* Function Name : LCD_DrawLine
* Description : Bresenham's line algorithm
* Input : - x1: A点行座标
* - y1: A点列座标
* - x2: B点行座标
* - y2: B点列座标
* - color: 线颜色
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void LCD_DrawLine( uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1 , uint16_t color )
{
short dx,dy; /* 定义X Y轴上
增加的变量值 */
short temp; /* 起点终点大小比较交换数据时的中间变量 */
if( x0 > x1 ) /* X轴上起点大于终点交换数据 */
{
temp = x1;
x1 = x0;
x0 = temp;
}
if( y0 > y1 ) /* Y轴上起点大于终点交换数据 */
{
temp = y1;
y1 = y0;
y0 = temp;
}
dx = x1-x0; /* X轴方向上的增量 */
dy = y1-y0; /* Y轴方向上的增量 */
if( dx == 0 ) /* X轴上没有增量画垂直线 */
{
do
{
LCD_SetPoint(x0, y0, color); /* 逐点显示描垂直线 */ y0++;
}
while( y1 >= y0 );
return;
}
if( dy == 0 ) /* Y轴上没有增量画水平直线 */
{
do
{
LCD_SetPoint(x0, y0, color); /* 逐点显示描水平线 */ x0++;
}
while( x1 >= x0 );
return;
}
/* 布兰森汉姆(Bresenham)算法画线 */
if( dx > dy ) /* 靠近X轴 */
{
temp = 2 * dy - dx; /* 计算下个点的位置 */
while( x0 != x1 )
{
LCD_SetPoint(x0,y0,color); /* 画起点 */
x0++; /* X轴上加1 */
if( temp > 0 ) /* 判断下下个点的位置 */
{
y0++; /* 为右上相邻点,即(x0+1,y0+1) */
temp += 2 * dy - 2 * dx;
}
else
temp += 2 * dy; /* 判断下下个点的位置 */
}
LCD_SetPoint(x0,y0,color);
}
else
{
temp = 2 * dx - dy; /* 靠近Y轴 */
while( y0 != y1 )
{
LCD_SetPoint(x0,y0,color);
y0++;
if( temp > 0 )
{
x0++;
temp+=2*dy-2*dx;
}
else
temp += 2 * dy;
}
LCD_SetPoint(x0,y0,color);
}
}
/************************************************************** ****************
* Function Name : DrawCircle
* Description : 在屏幕任意位置画圆
* Input : - X0: 水平坐标
* - Y0: 垂直坐标
* - R: 圆半径
* - Color: 圆颜色
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void DrawCircle(uint16_t X0,uint16_t Y0,uint16_t R,uint16_t color)
{
uint16_t a=0,b=0;
int16_t di=0;
b=R;
di=1-R;
while(a<=b)
{
LCD_SetPoint(X0+b,Y0-a,color);//0
LCD_SetPoint(X0-a,Y0+b,color);//1
LCD_SetPoint(X0-a,Y0-b,color);//2
LCD_SetPoint(X0-b,Y0-a,color);//3
LCD_SetPoint(X0+b,Y0+a,color);//4
LCD_SetPoint(X0+a,Y0-b,color);//5
LCD_SetPoint(X0+a,Y0+b,color);//6
LCD_SetPoint(X0-b,Y0+a,color);//7
a++;
if(di<0)
{
di+=(a<<1)+3;
}
else
{
di+=((a-b)<<1)+5;
b--;
}
}
}
/************************************************************** ****************
* F
unction Name : PutChar
* Description : 将Lcd屏上任意位置显示一个字符
* Input : - Xpos: 水平坐标
* - Ypos: 垂直坐标
* - ASCI: 显示的字符
* - charColor: 字符颜色
* - bkColor: 背景颜色
- ack:背景色控制(0:无背景色;1:有背景色;)
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void PutChar( uint16_t Xpos, uint16_t Ypos, uint8_t ASCI, uint16_t charColor, uint16_t bkColor,uint8_t ack)
{
uint16_t i, j;
uint8_t buffer[16], tmp_char;
GetASCIICode(buffer,ASCI); /* 取字模数据 */
LCD_Window(Xpos,Xpos+7,Ypos,Ypos+15); LCD_WriteIndex(0x0022);
if(ack==0)
{
for( i=0; i<16; i++ )
{
tmp_char = buffer[i];
for(j=0;j<8;j++)
{
if( (tmp_char >> 7 - j) & 0x01 == 0x01 ) LCD_WriteData(charColor); /* 字符颜色 */ else
LCD_ReadData();/*无背景色*/
}
}
}
else
{
for( i=0; i<16; i++ )
{
tmp_char = buffer[i];
for(j=0;j<8;j++)
{
if( (tmp_char >> 7 - j) & 0x01 == 0x01 ) LCD_WriteData(charColor); /* 字符颜色 */ else
LCD_WriteData(bkColor); /* 背景颜色 */
}
}
}
}
/************************************************************** ****************
* Function Name : GUI_Text
* Description : 在指定座标显示字符串
* Input : - Xpos: 行座标
* - Ypos: 列座标
* - str: 字符串
* - charColor: 字符颜色
* - bkColor: 背景颜色
- ack:背景色控制(0:无背景色;1:有背景色;)
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void GUI_Text(uint16_t Xpos, uint16_t Ypos, uint8_t *str,uint16_t Color, uint16_t bkColor,uint8_t ack)
{
uint8_t TempChar;
do
{
TempChar = *str++;
PutChar( Xpos, Ypos, TempChar, Color, bkColor ,ack);
if( Xpos < MAX_X - 8 )
Xpos += 8;
else if ( Ypos < MAX_Y - 16 )
{
Xpos = 0;
Ypos += 16;
}
else
{
Xpos = 0;
Ypos = 0;
}
}
while ( *str != 0 );
}
/************************************************************** ****************
* Function Name : PutChinese
* Description : 将Lcd屏上任意位置显示一个中文字
* Input : - Xpos: 水平坐标
* - Ypos: 垂直坐标
* - str: 显示的中文字
* - Color: 字符颜色
* - bkColor: 背景颜色
- ack:背景色控制(0:无背景色;1:有背景色;)
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void PutChinese(uint16_t Xpos,uint16_t Ypos,uint8_t *str,uint16_t Color,uint16_t
bkColor,uint8_t ack)
{
uint8_t i,j;
uint8_t buffer[32];
uint16_t tmp_char=0;
GetGBKCode(buffer,str); /* 取字模数据 */ LCD_Window(Xpos,Xpos+15,Ypos,Ypos+15); if(ack==0)
{
for ( i = 0; i < 16; i++ )
{
tmp_char = buffer[i*2];
tmp_char = ( tmp_char << 8 );
tmp_char |= buffer[2*i+1];
for (j = 0; j < 16; j++ )
{
if ( (tmp_char >> 15-j ) & 0x01 == 0x01 ) LCD_WriteData(Color); /* 字符颜色 */
else
LCD_ReadData(); /* 无背景颜色 */
}
}
}
else
{
for ( i = 0; i < 16; i++ )
{
tmp_char = buffer[i*2];
tmp_char = ( tmp_char << 8 );
tmp_char |= buffer[2*i+1];
for (j = 0; j < 16; j++ )
{
if ( (tmp_char >> 15-j ) & 0x01 == 0x01 )
LCD_WriteData(Color); /* 字符颜色 */
else
LCD_WriteData(bkColor); /* 背景颜色 */
}
}
}
}
/************************************************************** ****************
* Function Name : GUI_Chinese
* Description : 在指定座标显示字符串
* Input : - Xpos: 行座标
* - Ypos: 列座标
* - str: 字符串
* - charColor: 字符颜色
* - bkColor: 背景颜色
- ack:背景色控制(0:无背景色;1:有背景色;)
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void GUI_Chinese(uint16_t Xpos, uint16_t Ypos, uint8_t *str,uint16_t Color, uint16_t bkColor,uint8_t ack)
{
do
{
PutChinese(Xpos,Ypos,str++,Color,bkColor,ack);
str++;
if ( Xpos < MAX_X - 16 )
Xpos += 16;
else if ( Ypos < MAX_Y - 16 )
{
Xpos = 0;
Ypos += 16;
}
else
{
Xpos = 0;
Ypos = 0;
}
}
while(*str!=0);
}
/************************************************************** *****************
* Function Name : LCD_Picture
* Description : LCD显示图片
* Input : xs,xe,ys,ye
* Output : None
* Return : None
* Attention : None
*************************************************************** ****************/
void LCD_Picture(uint16_t xs,uint16_t xe,uint16_t ys,uint16_t ye)
{
uint32_t temp;
LCD_Window(xs,xe,ys,ye);
for(temp=0;temp<(xe-xs+1)*(ye-ys+1);temp++)
LCD_WriteData((win7[2*temp]<<8)+win7[2*temp+1]);
}
/************************************************************** *******************************************
END FILE
*************************************************************** ******************************************/。

相关文档
最新文档