SSD2119 ID:9919;基于stm32f1的
单片机源程序如下:
- //-------------------------------------------------------------------------*
- //文件名: 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)
|