标题:
TFT液晶SSD2119的stm32单片机驱动
[打印本页]
作者:
回首梦烟云
时间:
2017-9-6 12:25
标题:
TFT液晶SSD2119的stm32单片机驱动
SSD2119 ID:9919;基于stm32f1的
0.png
(36.85 KB, 下载次数: 74)
下载附件
2017-9-6 16:31 上传
单片机源程序如下:
//-------------------------------------------------------------------------*
//文件名: LCD.c (LCD操作函数文件) *
//-------------------------------------------------------------------------*
#include "LCD.h"
#include "font.h"
//内部调用的函数声明
static void WriteRegister(uint16 index,uint16 data);//写指定地址寄存器的值
static void WriteIndex(uint16 index);//写 SSD2119 控制器寄存器地址
static void WriteData(uint16 data);//写 SSD2119 寄存器数据
static uint16 ReadRegister(uint16 index);//读取指定地址寄存器的值
static uint16 ReadData(void);//读取控制器数据
static void SetCursor(uint16 x,uint16 y);//设置屏幕坐标
static void Reset();//复位 SSD2119 控制器
static void LCDDrawChar(uint16 x, uint16 y, uint8 *c);//在屏幕上画一个字符
static void LCDDrawChinese(uint16 x, uint16 y, uint16 *c);//在屏幕上画一个汉字
//-------------------------------------------------------------------------*
//函数名: LCDInit *
//功 能: 液晶初始化程序 *
//参 数: 无 *
//返 回: 无 *
//内部调用:WriteRegister *
//说 明: 初始化液晶的显示方式 *
//-------------------------------------------------------------------------*
void LCDInit(void)
{
uint8 tmp;
uint16 i;
static uint16 DeviceCode;
PIN_FUNCTION();//配置引脚功能为GPIO
CONTROL_OUTPUT();//配置控制引脚为输出
//设置GPIO为输出
DATA_OUTPUT();
WriteData(0xffff);
Set_RST;
Set_Cs;
Set_Rs;
Set_nWr;
Set_nRd;
Set_RST;
Reset();
Delay(200);
WriteRegister(0x0000,0x0001);
Delay(200);
for(i=50000;i>0;i--);
for(i=50000;i>0;i--);
//DeviceCode = ReadRegister(0x0000);
DeviceCode=0x9919;
if(DeviceCode == 0x9919)
{
//*********POWER ON &RESET DISPLAY OFF
WriteRegister(0x28,0x0006);
WriteRegister(0x00,0x0001);
WriteRegister(0x10,0x0000);
WriteRegister(0x01,0x72ef);
WriteRegister(0x02,0x0600);
WriteRegister(0x03,0x6a38);
//WriteRegister(0x11,0x6874);//70//从左到右(横屏显示)
WriteRegister(0x11,0x685C); //70//从上到下(竖屏显示)
// RAM WRITE DATA MASK
WriteRegister(0x0f,0x0000);
// RAM WRITE DATA MASK
WriteRegister(0x0b,0x5308);
WriteRegister(0x0c,0x0003);
WriteRegister(0x0d,0x000a);
WriteRegister(0x0e,0x2e00); //0030
WriteRegister(0x1e,0x00be);
WriteRegister(0x25,0x8000);
WriteRegister(0x26,0x7800);
WriteRegister(0x27,0x0078);
WriteRegister(0x4e,0x0000);
WriteRegister(0x4f,0x0000);
WriteRegister(0x12,0x08d9);
// -----------------Adjust the Gamma Curve----//
WriteRegister(0x30,0x0000); //0007
WriteRegister(0x31,0x0104); //0203
WriteRegister(0x32,0x0100); //0001
WriteRegister(0x33,0x0305); //0007
WriteRegister(0x34,0x0505); //0007
WriteRegister(0x35,0x0305); //0407
WriteRegister(0x36,0x0707); //0407
WriteRegister(0x37,0x0300); //0607
WriteRegister(0x3a,0x1200); //0106
WriteRegister(0x3b,0x0800);
WriteRegister(0x07,0x0033);
}
for(i=50000;i>0;i--);
//LCDClear(0xff00);
}
//-------------------------------------------------------------------------*
//函数名: LCDClear *
//功 能: 将屏幕填充成指定的颜色,如清屏,则填充 0xffff *
//参 数: ClearColor:填充颜色 *
//返 回: 无 *
//内部调用:SetCursor,WriteIndex,WriteData *
//说 明: 将屏幕填充成指定的颜色 *
//-------------------------------------------------------------------------*
void LCDClear(uint16 ClearColor)
{
uint32 i;
SetCursor(0x0000, 0x0000);
Clr_Cs;
WriteIndex(0x0022);
Set_Rs;
for(i=0;i<76800;i++)
{
WriteData(ClearColor);
Clr_nWr;
Set_nWr;
}
Set_Cs;
}
//-------------------------------------------------------------------------*
//函数名: LCDTest *
//功 能: 测试液晶屏 *
//参 数: 无 *
//返 回: 无 *
//内部调用:WriteIndex,WriteRegister,WriteData *
//说 明: *
//-------------------------------------------------------------------------*
void LCDTest(void)
{
uint16 i,j;
WriteRegister(0x4e, 0);
WriteRegister(0x4f, 0);
Clr_Cs;
WriteIndex(0x22);
for(i=0;i<320;i++)
for(j=0;j<240;j++)
{
if(i>279)WriteData(0xffff);
else if(i>239)WriteData(0x001f);
else if(i>199)WriteData(0x07e0);
else if(i>159)WriteData(0x07ff);
else if(i>119)WriteData(0xf800);
else if(i>79)WriteData(0xf81f);
else if(i>39)WriteData(0xffe0);
else WriteData(0xffff);
}
Set_Cs;
}
//-------------------------------------------------------------------------*
//函数名: LCDSetPixel *
//功 能: 在指定座标画点 *
//参 数: x 行座标 *
// y 列座标 *
// PixcelColor 像素的颜色 *
//返 回: 无 *
//内部调用:SetCursor,WriteIndex,WriteData *
//说 明: *
//-------------------------------------------------------------------------*
void LCDSetPixel(uint16 x,uint16 y,uint16 PixcelColor)
{
if ( (x>320)||(y>240) ) return;
SetCursor(x,y);
Clr_Cs;
WriteIndex(0x0022);
WriteData(PixcelColor);
Set_Cs;
}
//-------------------------------------------------------------------------*
//函数名: LCDShowChar *
//功 能: 显示一个字符(8*16点阵) *
//参 数: ln:字符要显示的行 *
// col:字符要显示的列 *
// c:要显示的字符 *
//返 回: 无 *
//内部调用:LCDDrawChar *
//说 明: *
//-------------------------------------------------------------------------*
void LCDShowChar(uint16 ln, uint16 col, uint8 c)
{
c -= 32;
LCDDrawChar(ln, col, &ASCII_Character[c*16]);
}
//-------------------------------------------------------------------------*
//函数名: LCDShowStringLn *
//功 能: 在指定的行显示字符串 *
//参 数: ln:要显示的行 *
// *s: 指向字符串的指针 *
//返 回: 无 *
//内部调用:LCDDrawChar *
//说 明: *
//-------------------------------------------------------------------------*
void LCDShowStringLn(uint16 ln, uint8 *s)
{
uint16 i = 1;
uint16 Count=0;
//uint16 refcolumn = (WIDTH/*-1*/)-16;
uint16 refcolumn = 240;
uint8 *p;
p=s;
//统计字符个数
while(*p!= 0)
{
Count++;
p++;
}
UartSend1(0,Count);
while ((*s != 0) && (i <= Count)) //在屏幕上依次写每个字符
{
LCDShowChar(ln, refcolumn, *s);
refcolumn -= 8; //列减去一个字符
s++;
if((i%30)==0)
{
refcolumn=240;
ln+=16;//换行
}
i++; //统计字符的个数
}
}
//-------------------------------------------------------------------------*
//函数名: LCDShowChinese *
//功 能: 在指定的行、列显示一个汉字 *
//参 数: ln:汉字要显示的行 *
// col:汉字要显示的列 *
// start:要显示的汉字串的开始下标 *
//返 回: 无 *
//内部调用:LCDDrawChinese *
//说 明: *
//-------------------------------------------------------------------------*
void LCDShowChinese(uint16 ln, uint16 col, uint8 start)
{
LCDDrawChinese(ln, col, &ASCII_Chinese[16*start]);
}
//-------------------------------------------------------------------------*
//函数名: LCDShowChineseLine *
//功 能: 在指定的行显示一串汉字 *
//参 数: ln:汉字要显示的行 *
// start:要显示的汉字串的开始下标 *
// count:一行中要显示的汉字个数 *
//返 回: 无 *
//内部调用:LCDDrawChinese *
//说 明: *
//-------------------------------------------------------------------------*
void LCDShowChineseLine(uint16 ln, uint8 start,uint8 count)
{
uint8 i,temp=0;
uint16 column = 240;
for(i=start;i<count+start;i++)
{
LCDDrawChinese(ln, column, &ASCII_Chinese[16*i]);
column-=16;
temp++;
if(temp%15==0)
{
ln+=16;
column=240;
}
}
}
//-------------------------------------------------------------------------*
//函数名: LCDShowBitmap *
//功 能: 显示一幅图片,x为水平坐标,y为垂直坐标,每个像素用16位二进制表示 *
// 5:6:5格式 *
//参 数: x: 水平起始位置 *
// y: 垂直起始位置 *
// w: 图片的宽度 *
// h: 图片的高度 *
// bitmap: 指向图片数组的指针 *
//返 回: 无 *
//内部调用: *
//说 明: *
//-------------------------------------------------------------------------*
void LCDShowBitmap(uint16 x, uint16 y, uint16 w, uint16 h, uint8 *bitmap)
{
uint16 i,j;
uint16 len = w*h;
uint16 *bitmap_ptr = (uint16 *)bitmap;
for (j = 0; j< h; j++)
{
SetCursor(x,y);
Clr_Cs;
WriteIndex(0x22);
Set_Rs;
for(i = 0; i<w; i++)
{
WriteData(*bitmap_ptr++);
}
x++;//换行
Set_Cs;
}
}
//内部调用的函数
//-------------------------------------------------------------------------*
//函数名: WriteRegister *
//功 能: 写指定地址寄存器的值 *
//参 数: index 寄存器地址 *
// data 寄存器值 *
//返 回: 无 *
//内部调用:WriteIndex,WriteData *
//说 明: 内部函数 *
//-------------------------------------------------------------------------*
static void WriteRegister(uint16 index,uint16 data)
{
/************************************************************************
** **
** nCS ----\__________________________________________/------- **
** RS ------\____________/----------------------------------- **
** nRD ------------------------------------------------------- **
** nWR --------\_______/--------\_____/----------------------- **
** DB[0:15] ---------[index]----------[data]----------------------- **
** **
************************************************************************/
Clr_Cs;
WriteIndex(index);
WriteData(data);
Set_Cs;
}
//-------------------------------------------------------------------------*
//函数名: WriteIndex *
//功 能: 写 SSD2119 控制器寄存器地址 *
//参 数: index 寄存器地址 *
//返 回: 无 *
//内部调用: *
//说 明: 调用前需先选中控制器,内部函数 *
//-------------------------------------------------------------------------*
static void WriteIndex(uint16 index)
{
Clr_Rs;
Set_nRd;
DATA_LO_PORT = index;
DATA_HI1_PORT = (index>>8);
DATA_HI2_PORT = (index>>12);
Clr_nWr;
Set_nWr;
Set_Rs;
}
//-------------------------------------------------------------------------*
//函数名: WriteData *
//功 能: 写 SSD2119 寄存器数据 *
//参 数: data 寄存器数据 *
//返 回: 无 *
//内部调用: *
//说 明: 向控制器指定地址写入数据,调用前需先写寄存器地址,内部函数 *
//-------------------------------------------------------------------------*
static void WriteData(uint16 data)
{
Set_Rs;
Set_nRd;
DATA_LO_PORT = data;
DATA_HI1_PORT = (data>>8);
DATA_HI2_PORT = (data>>12);
Clr_nWr;
Set_nWr;
}
//-------------------------------------------------------------------------*
//函数名: ReadRegister *
//功 能: 读取指定地址寄存器的值 *
//参 数: index 寄存器地址 *
//返 回: 寄存器值 *
//内部调用: WriteIndex, ReadData *
//说 明: 内部函数 *
//-------------------------------------------------------------------------*
static uint16 ReadRegister(uint16 index)
{
Clr_Cs;
WriteIndex(index);
Clr_nRd;
index = ReadData();
Set_nRd;
Set_Cs;
return index;
}
//-------------------------------------------------------------------------*
//函数名: ReadData *
//功 能: 读取控制器数据 *
//参 数: 无 *
//返 回:返回读取到的数据 *
//内部调用: *
//说 明: 内部函数 *
//-------------------------------------------------------------------------*
static uint16 ReadData(void)
{
//========================================================================
// ** **
// ** nCS ----\__________________________________________/------- **
// ** RS ------\____________/----------------------------------- **
// ** nRD -------------------------\_____/--------------------- **
// ** nWR --------\_______/-------------------------------------- **
// ** DB[0:15] ---------[index]----------[data]----------------------- **
// ** **
//========================================================================
uint16 tmp;
DATA_INPUT();
tmp =DATA_HI2_PORT;
tmp = (tmp << 4) + DATA_HI1_PORT; /* 读入高8位数据*/
tmp = (tmp << 8) + DATA_LO_PORT; /* 读入低8位数据*/
DATA_OUTPUT();
return tmp;
}
//-------------------------------------------------------------------------*
//函数名: SetCursor *
//功 能: 设置屏幕坐标 *
//参 数: x 行坐标 *
// y 列坐标 *
//返 回:无 *
//内部调用: *
//说 明: 内部函数 *
//-------------------------------------------------------------------------*
static void SetCursor(uint16 x,uint16 y)
{
WriteRegister(0x004e,x); // 行
WriteRegister(0x004f,y); // 列
}
//-------------------------------------------------------------------------*
//函数名: Reset *
//功 能: 复位 SSD2119 控制器 *
//参 数: 无 *
//返 回: 无 *
//内部调用: *
//说 明: 复位控制器,内部函数 *
//-------------------------------------------------------------------------*
static void Reset()
{
/***************************************
** **
** -------\______________/------- **
** | <---Tres---> | **
** **
** Tres: Min.1ms **
***************************************/
Set_RST;
Delay(50);
Cls_RST;
Delay(50);
Set_RST;
Delay(50);
}
//-------------------------------------------------------------------------*
//函数名: LCDDrawChar *
//功 能: 在给定的行、列画一个字符(8*16点阵) *
//参 数: x :字符所在的行 *
// y :字符所在的列 *
// c*:指向字符的指针 *
//返 回: 无 *
//内部调用: *
//说 明: 内部函数 *
//-------------------------------------------------------------------------*
static void LCDDrawChar(uint16 x, uint16 y, uint8 *c)
{
uint16 index = 0;
int32 i = 0;
uint16 Xaddress = 0;
Xaddress = x;
WriteRegister(0x4e, Xaddress);
WriteRegister(0x4f, y);
for(index = 0; index < 16; index++)
{
Clr_Cs;
WriteIndex(0x22);
for(i = 8; i >= 0; i--)
{
if((c[index] & (1 << i)) == 0x00)
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
SSD2119驱动.rar
(5.03 KB, 下载次数: 60)
2017-9-6 12:25 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
回首梦烟云
时间:
2017-9-6 12:26
TFT液晶!!!
作者:
dengmcu
时间:
2018-6-14 09:53
SSD2119是不是也是属于8080接口的?
作者:
lg2911
时间:
2018-8-31 22:53
本帖最后由 lg2911 于 2018-9-1 11:26 编辑
dengmcu 发表于 2018-6-14 09:53
SSD2119是不是也是属于8080接口的?
看手册确认了一下,SSD2119本身是8080和6800两种接口都支持的,用PS3-PS0来选择,要看液晶模组是否把这4根线引出来了,要是引出了,那就是可以使用者自己设置的
作者:
imaginever
时间:
2018-11-13 13:52
谢谢分享,正在学习这方面知识
作者:
sunlinfei
时间:
2021-6-15 16:15
谢谢分享,正在学习这方面知识
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1