在线时间83 小时
UID3135871
ST金币1272
蝴蝶豆3
注册时间2015-6-9
该用户从未签到
金牌会员
- 最后登录
- 2023-1-28
|
周末整理东西,翻出了老早之前的5110的屏幕,点阵是84*48。看到它,我就想到了我的青葱岁月,真是时光如梭啊~5110虽然简单,但是用它来学习单色屏,确实一个很好的选择。我们往往能从最原始的某些东西的原型,看出物质的本质。
5110的引出引脚分别为:RST、 CE 、DC 、DIN 、CLK 、VCC 、BL 、GND。我把它插到我做的一个Ardunio接口的万能板上,
让它和MCU引脚相连。上面接口,下面连了个触摸按键!
我们用模拟SPI的方式来驱动5110。
我们打开STM32CUBEMX来配置引脚:
生成代码,cubeMx的事就到此结束。
我们打开MDK工程,开始写LCD5110的驱动代码:
C文件:
- #include "LCD5110.h"
- #include "Pixel_EN.h"
- #include "delay.h"
- #include "string.h"
- #include "font.h"
- #include "icon.h"
- //-------------------------------------------------------------------
- // Nokia5510指令集
- // D7 D6 D5 D4 D3 D2 D1 D0
- // 0 0 1 0 0 PD V H
- // | | |_______1->扩展指令集 0->基本指令集
- // | |___________1->垂直寻址 0->水平寻址
- // |_______________1->低功耗模式 0->正常模式
- //-------------------------------------------------------------------
- // 显示模式
- // D7 D6 D5 D4 D3 D2 D1 D0
- // 0 0 0 0 1 D 0 E
- // | |_______0 0 1 1
- // |_______________0 1 0 1
- // 白屏 正常 全显 反转
- //-------------------------------------------------------------------
- static u8 lcd_buf[84*6] ;
- unsigned char LcdDispBuf[GUI_LCD_YMAX/8][GUI_LCD_XMAX] ={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};
- /**************************************
- 为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法
- ***************************************/
- const u8 MaskTab[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- /*******************************************************************************
- * Function Name : LCD_Init
- * Description : LCD初始化
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_Init(void)
- {
- //GPIO配置
- LCD_GPIO_Configuration();
- //复位LCD_低电平脉冲
- LCD_RST_L();
- delay_ms(1);
- LCD_RST_H();
- //复位串行接口_高电平脉冲
- LCD_CE_H();
- delay_ms(1);
- LCD_CE_L();
- //设置LCD
- LCD_Send(0x21, DC_CMD); //使用扩展命令设置LCD模式
- LCD_Send(0xC8, DC_CMD); //设置偏置电压
- LCD_Send(0x06, DC_CMD); //温度校正
- LCD_Send(0x13, DC_CMD); //1:48
- LCD_Send(0x20, DC_CMD); //使用基本命令
- LCD_Send(0x0E, DC_CMD); //设定显示模式,反转显示
- }
- //更新显存到LCD
- void LCD_Refresh_Gram(void)
- {
- LCD_Disp_Buf();
- }
- /*******************************************************************************
- * Function Name : LCD_SetContrast
- * Description : 设置LCD对比度(对比度范围: 0~127)
- * Input : u8 contrast
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_SetContrast(u8 contrast)
- {
- LCD_Send(0x21, DC_CMD);
- LCD_Send(0x80 | contrast, DC_CMD);
- LCD_Send(0x20, DC_CMD);
- }
- /*******************************************************************************
- * Function Name : LCD_SetXY
- * Description : 设置LCD当前坐标
- * Input : u8 X, u8 Y X:0-83 Y:0-5
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_SetXY(u8 X, u8 Y)
- {
- if (X>83) X = 83;
- if (Y>5) Y = 5;
- LCD_Send(0x80 | X, DC_CMD); // 列
- delay_ms(10);
- LCD_Send(0x40 | Y, DC_CMD); // 行
- }
- /*******************************************************************************
- * Function Name : LCD_Clear
- * Description : LCD清屏
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_Clear(void)
- {
- u16 i;
- LCD_Send(0x80, DC_CMD);
- delay_ms(1);
- LCD_Send(0x40, DC_CMD);
- for(i=0; i<504; i++)
- LCD_Send(0, DC_DATA);
- }
- //画点
- void LCD_DrawPoint(u8 x, u8 y, u8 Color) //(0,0) //1 = Black.
- {
- if(x>GUI_LCD_XMAX||y>GUI_LCD_YMAX)return;//超出范围了.
-
- if(Color == BLACK)
- {
- LcdDispBuf[y/8][x] |= MaskTab[y%8];
- }
- else if(Color == WHITE)
- {
- LcdDispBuf[y/8][x] &= ~MaskTab[y%8];
- }
- }
- void LCD_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot)
- {
- u8 x,y;
- for(x=x1;x<=x2;x++)
- {
- for(y=y1;y<=y2;y++)LCD_DrawPoint(x,y,dot);
- }
- LCD_Refresh_Gram();//更新显示
- }
- /*******************************************************************************
- * Function Name : LCD_Send
- * Description : 向LCD发送数据
- * Input : u8 data, DCType dc
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_Send(u8 data, DCType dc)
- {
- u8 i=8;
- if (dc==DC_CMD)
- LCD_DC_CMD(); //发送命令
- else
- LCD_DC_DATA();//发送数据
- while (i--)
- {
- LCD_CLK_L();
- if(data&0x80)
- LCD_MOSI_H(); /* MSB first */
- else
- LCD_MOSI_L();
- LCD_CLK_H();
- data <<= 1; /* Data shift */
- }
- }
- /*******************************************************************************
- * Function Name : LCD_Write_Char
- * Description : 向LCD写一个英文字符 显示6(宽)*8(高)点阵列数字字母符号等半角类
- * Input : u8 ascii 84/6=14 一行共可写14个字 row 范围0~13 page:0~5
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_Write_Char_6X8(u8 row,u8 page,u8 ascii)
- {
- u8 n;
- LCD_SetXY(row*6, page);// 列,页
- ascii -= 32; //ASCII码-32
- for (n=0; n<6; n++)
- LCD_Send(Font6x8[ascii][n], DC_DATA);
- }
- /*---------------------------------------------
- LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类
- 输入参数:c:显示的字符;
- 编写日期:20080918
- -----------------------------------------------*/
- void LCD_write_Char_8X16(u8 row, u8 page,u8 c) //row:列 page:页 dd:字符
- {
- unsigned char i;
-
- LCD_SetXY(row*8, page);// 列,页
- c -= 32; //ASCII码-32
-
- for(i=0; i<8;i++)
- {
- //LCD_Send(shuzi[c*16+i],DC_DATA);
- LCD_Send(Font8x16[c][i],DC_DATA);
- }
-
- LCD_SetXY(row*8, page+1);// 列,页
- for(i=8; i<16;i++)
- {
- //LCD_Send(shuzi[c*16+i],DC_DATA);
- LCD_Send(Font8x16[c][i],DC_DATA);
- }
- }
- /*******************************************************************************
- * Function Name : LCD_Write_Char
- * Description : 向LCD写一个汉字
- * Input : u8 ascii
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_Write_Hanzi_12x16(u8 X, u8 Y,u8 GBK)
- {
- u8 n;
- LCD_SetXY(X*12,Y);
- for (n=0; n<12; n++)
- {
- LCD_Send(Font12x16_chinese[GBK][n], DC_DATA);
- }
- delay_ms(10);
- LCD_SetXY(X*12,Y+1);
- for (n=12; n<24; n++)
- {
- LCD_Send(Font12x16_chinese[GBK][n], DC_DATA);
- }
-
- }
- void LCD_Write_Hanzi_16x16(u8 X, u8 Y,u8 GBK)
- {
- u8 n;
- LCD_SetXY(X*16,Y);
- for (n=0; n<16; n++)
- {
- LCD_Send(Font16x16_chinese[GBK][n], DC_DATA);
- }
- delay_ms(10);
- LCD_SetXY(X*16,Y+1);
- for (n=16; n<32; n++)
- {
- LCD_Send(Font16x16_chinese[GBK][n], DC_DATA);
- }
-
- }
- /*******************************************************************************
- * Function Name : LCD_Write_Char
- * Description : 向LCD写一个图像
- * Input : u8 ascii
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_Write_Image(void)
- {
- u8 row,column;
-
- for (row=0; row<6; row++)
- {LCD_SetXY(0,row);
- for (column=0; column<84; column++)
- {
- LCD_Send(image1[row][column], DC_DATA);
- }
-
- delay_ms(100);
-
- }
-
- }
- /*******************************************************************************
- * Function Name : LCD_Write_EnStr
- * Description : 向LCD写英文字符串
- * Input : u8 ascii
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_Write_EnStr_6X8(u8 X, u8 Y, u8* s)
- {
- u8 * str = s;
- int i = 0;
- int lcd_index =0;
- if(str == 0 )
- {
- return ;
- }
- LCD_SetXY(X,Y);//设置光标位置
- while(*str)
- {
- //拷贝显示数据到缓冲区
- for(i=0;i<6;i++)
- {
- lcd_buf[lcd_index ++ ] = Font6x8[*str - 32][i];
- }
- //memcpy(lcd_buf+6*str,&Font6x8[*str - 32][0],6);
- str ++ ;
- }
- lcd_buf[lcd_index ++ ] = 0 ; // lcd_index ++ 多发送一个0否者最后一个字符会缺少一个像素
- for(i = 0 ;i<lcd_index ;i++)
- {
- LCD_Send(lcd_buf[i], DC_DATA);
- }
- }
- /*******************************************************************************
- * Function Name : LCD_Write_EnStr
- * Description : 向LCD写英文字符串
- * Input : u8 ascii 当前行的数量 84/8=10个 最多显示10个 超出范围的不显示
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_Write_EnStr_8X16(u8 X, u8 Y, u8* s)
- {
- u8 * str = s;
- int i = 0,j=0;
- int lcd_index =0;
-
- if(str == 0 )
- {
- return ;
- }
- LCD_SetXY(X,Y);//设置光标位置
- while(*str)
- {
- //拷贝显示数据到缓冲区
- for(i=0;i<16;i++)
- {
- lcd_buf[lcd_index ++ ] = Font8x16[*str - 32][i];
- }
- //memcpy(lcd_buf+6*str,&Font6x8[*str - 32][0],6);
- str ++ ;
- }
-
- //如果要写的字大于10个,就仅仅显示10个
- if(lcd_index/16>(84-X)/8) lcd_index=(84-X)/8*16;
-
- lcd_buf[lcd_index ++ ] = 0 ; // lcd_index ++ 多发送一个0否者最后一个字符会缺少一个像素
-
- //写上半部
- LCD_SetXY(X,Y);//设置光标位置
- for(i = 0;i<(lcd_index-1)/16;i++)//一般的数值为上半部分
- {
- for(j=0;j<8;j++)
- LCD_Send(lcd_buf[i*16+j], DC_DATA);
- }
-
- //写下半部
- LCD_SetXY(X,Y+1);//设置光标位置
- for(i = 0 ;i<(lcd_index-1)/16 ;i++)
- {
- for(j=0;j<8;j++)
- LCD_Send(lcd_buf[i*16+8+j], DC_DATA);
- }
- }
- void LCD_draw_map(unsigned char X,unsigned char Y,unsigned char map, //unsigned char *map,
- unsigned char Pix_x,unsigned char Pix_y)
- {
- unsigned int i,n;
- unsigned char row;
- if (Pix_y%8==0)
- row=Pix_y/8;//计算位图所占行数
- else
- row=Pix_y/8+1;
- for (n=0;n<row;n++)
- {
- LCD_SetXY(X,Y);
- for(i=0; i<Pix_x; i++)
- {
- LCD_Send(0xFE,DC_DATA);
- }
- Y++;//换行
- }
- }
- void LCD_Disp_Buf(void)
- {
- unsigned char x = 0, y = 0;
-
- for (y = 0; y < GUI_LCD_YMAX/8; y++)
- {
- LCD_SetXY(0,y);
- for(x = 0; x < GUI_LCD_XMAX; x++)
- {
- LCD_Send(LcdDispBuf[y][x],DC_DATA);
- }
- }
-
- }
- /////////////////////////new add //////////////////////
- /* @ horizontal addressing (V = 0)
- */
- void LCD_draw_bytes(const u8 *buffer, int nbytes) {
- while(nbytes --) {
- // LCDSPI_WRITE(*(buffer ++));
- LCD_Send(*(buffer ++), DC_DATA);
- }
- }
- /*
- * @ write char by ascii code
- */
- void LCD_draw_string(u8 *str) {
- int index;
- u8 c;
- while(*str != 0)
- {
- c = *str;
- index = c - ' ';
- str ++;
- LCD_draw_bytes(font_5_8[index], 5);
- //LCDSPI_WRITE(0x00);
- LCD_Send(0x00, DC_DATA);
- }
- }
- /*
- * @ write symble by id
- * @ id = [0, 21]
- */
- void LCD_draw_symble(u8 id) {
- if(id > 21) {
- id = 0;
- }
- LCD_draw_bytes(font_5_8[id + 0x5f], 5);
- //LCDSPI_WRITE(0x00);
- LCD_Send(0x00, DC_DATA);
- }
- /*
- * @ LCD draw icon
- * @ id = [0, 26]
- */
- void LCD_draw_icon(u8 id) {
- LCD_draw_bytes(icon[id], 10);
- // LCDSPI_WRITE(0x00);
- // LCDSPI_WRITE(0x00);
- LCD_Send(0x00, DC_DATA);
- LCD_Send(0x00, DC_DATA);
- }
- /*******************************************************************************
- * Function Name : GPIO_Configuration
- * Description : Configures the different GPIO ports.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- void LCD_GPIO_Configuration(void)
- {
- //其余全部置低
- LCD_VCC_H();
- LCD_GND_L();
- delay_ms(1000);
- LCD_BGL_H();
- delay_ms(100);
- }
复制代码 H文件:
- #ifndef _LCD5110_H
- #define _LCD5110_H
- #include "main.h"
- #include "sys.h"
- #include "gpio.h"
- #include "Pixel_EN.h"
- /******************************宽高像素 ******************************/
- //#define LCD_X_RES 84
- //#define LCD_Y_RES 48
- #define GUI_LCD_XMAX 84 // 定义液晶x轴的像素数 *
- #define GUI_LCD_YMAX 48 // 定义液晶y轴的像素数 *
- /* 定义LCM像素数宏 */
- //#define GUI_LCM_XMAX GUI_LCD_XMAX // 定义液晶x轴的像素数 *
- //#define GUI_LCM_YMAX GUI_LCD_YMAX // 定义液晶y轴的像素数 *
- extern unsigned char LcdDispBuf[GUI_LCD_YMAX/8][GUI_LCD_XMAX];
- /**************************枚举 D/C模式选择 **************************/
- typedef enum
- {
- DC_CMD = 0, //写命令
- DC_DATA = 1 //写数据
- } DCType;
- #define BLACK 1
- #define WHITE 0
- //#define TCOLOR u32
- /***************************config as spi2 ***************************/
- #define LCD_RST_H() HAL_GPIO_WritePin(NOKAI5110_RST_GPIO_Port,NOKAI5110_RST_Pin,GPIO_PIN_SET)
- #define LCD_RST_L() HAL_GPIO_WritePin(NOKAI5110_RST_GPIO_Port,NOKAI5110_RST_Pin,GPIO_PIN_RESET)
- #define LCD_CE_H() HAL_GPIO_WritePin(NOKIA5110_CE_GPIO_Port, NOKIA5110_CE_Pin,GPIO_PIN_SET)
- #define LCD_CE_L() HAL_GPIO_WritePin(NOKIA5110_CE_GPIO_Port, NOKIA5110_CE_Pin,GPIO_PIN_RESET)
- #define LCD_DC_DATA() HAL_GPIO_WritePin(NIKIA5110_DC_GPIO_Port, NIKIA5110_DC_Pin,GPIO_PIN_SET)
- #define LCD_DC_CMD() HAL_GPIO_WritePin(NIKIA5110_DC_GPIO_Port, NIKIA5110_DC_Pin,GPIO_PIN_RESET)
- #define LCD_MOSI_H() HAL_GPIO_WritePin(NOKIA5110_DIN_GPIO_Port,NOKIA5110_DIN_Pin,GPIO_PIN_SET)
- #define LCD_MOSI_L() HAL_GPIO_WritePin(NOKIA5110_DIN_GPIO_Port,NOKIA5110_DIN_Pin,GPIO_PIN_RESET)
- #define LCD_CLK_H() HAL_GPIO_WritePin(NOKIA5110_SCK_GPIO_Port,NOKIA5110_SCK_Pin,GPIO_PIN_SET)
- #define LCD_CLK_L() HAL_GPIO_WritePin(NOKIA5110_SCK_GPIO_Port,NOKIA5110_SCK_Pin,GPIO_PIN_RESET)
- #define LCD_VCC_H() HAL_GPIO_WritePin(NOKIA5110_VCC_GPIO_Port,NOKIA5110_VCC_Pin,GPIO_PIN_SET)
- #define LCD_BGL_H() HAL_GPIO_WritePin(NOKIA5110_BL_GPIO_Port, NOKIA5110_BL_Pin,GPIO_PIN_SET)
- #define LCD_GND_L() HAL_GPIO_WritePin(NIKOA5110_GND_GPIO_Port,NIKOA5110_GND_Pin,GPIO_PIN_RESET)
- /************************函数定义****************************/
- void LCD_Init(void);
- void LCD_Clear(void);
- void LCD_SetXY(u8 X, u8 Y);
- void LCD_SetContrast(u8 contrast);
- void LCD_Send(u8 data, DCType dc);
- void LCD_Write_Char_6X8(u8 row,u8 page,u8 ascii);
- void LCD_write_Char_8X16(u8 row, u8 page,u8 c);
- void LCD_Write_EnStr_6X8(u8 X, u8 Y, u8* s);
- void LCD_Write_EnStr_8X16(u8 X, u8 Y, u8* s);
- void LCD_Write_Hanzi_12x16(u8 X, u8 Y,u8 GBK);
- void LCD_Write_Hanzi_16x16(u8 X, u8 Y,u8 GBK);
- void LCD_Write_Image(void);
- void LCD_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
- void LCD_DrawPoint(u8 x, u8 y, u8 Color);
- void LCD_Refresh_Gram(void);
- void LCD_draw_map(unsigned char X,unsigned char Y,unsigned char map, //unsigned char *map,
- unsigned char Pix_x,unsigned char Pix_y);
- void LCD_Disp_Buf(void);
- //一个应用实例
- void LCD_Disp_test(void);
- void LCD_GPIO_Configuration(void);
- void Array_chinese(void);
- #define puts_xy(x,y,s) LCD_Write_EnStr(x, y, s)
- //NEW ADD 5x7字符
- void LCD_draw_bytes(const u8 *buffer, int nbytes);
- void LCD_draw_string(u8 *str);
- void LCD_draw_symble(u8 id);
- void LCD_draw_icon(u8 id);
- #endif
复制代码
其中关于字模的大小选择,ASCII字符,有6x8 、8x16。汉字取模则用了12X16及16x16.具体看个人需求。字模软件用的PCtoLCD2002,设置为:
我们让RTOS的其中一个任务显示:
- void StartDefaultTask(void const * argument)
- {
- /* USER CODE BEGIN StartDefaultTask */
- u16 i,cnt;
-
- GUI_Initialize();
- GUI_SetColor(1,0);//此时是正常显示,若(0,1)则反色显示
- //LCD_Write_Image();
-
- /* Infinite loop */
- for(;;)
- {
- LCD_Clear();
- LCD_Write_Image();
- osDelay(2000);
- LCD_Clear();
- LCD_draw_string("!"#$%&'()*+,-./");
- LCD_draw_string("0123456789:;<=>?@");
- osDelay(2000);
- for(i = 0; i < 22; i ++)
- {
- LCD_draw_symble(i);
- }
- osDelay(2000);
- LCD_Clear();
- LCD_draw_string("ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`");
- LCD_draw_string("abcdefghijklmnopqrstuvwxyz{|}~");
- osDelay(2000);
- LCD_Clear();
- for(i = 0; i < 27; i ++)
- {
- LCD_draw_icon(i);
- }
- osDelay(2000);
-
- LCD_Clear();
- LCD_Write_EnStr_6X8(0,0,"Thanks ST!");
-
- LCD_Write_EnStr_8X16(0,2,"ThanksST");
-
- //84/12=7
- // LCD_Write_Hanzi_12x16(0,4,0);
- // LCD_Write_Hanzi_12x16(1,4,1);
- // LCD_Write_Hanzi_12x16(2,4,2);
- // LCD_Write_Hanzi_12x16(3,4,3);
- // LCD_Write_Hanzi_12x16(4,4,4);
- // LCD_Write_Hanzi_12x16(5,4,5);
- // LCD_Write_Hanzi_12x16(6,4,6);
-
- //84/16=5
- LCD_Write_Hanzi_16x16(0,4,0);
- LCD_Write_Hanzi_16x16(1,4,1);
- LCD_Write_Hanzi_16x16(2,4,2);
- LCD_Write_Hanzi_16x16(3,4,3);
- LCD_Write_Hanzi_16x16(4,4,4);
-
- // LCD_write_Char_8X16(0,2,'a');
- // LCD_Write_Char_6X8(0,1,'a');
- osDelay(2000);
- }
- /* USER CODE END StartDefaultTask */
- }
复制代码 编译,查看效果:
下面,我们来移植ZLGGUI,虽然年代久远,但用在单色屏还是不错的,而且源码易懂,好修改~
我们把ZLG_GUI文件夹复制到工程目录,并添加到工程。我们对底层接口实现函数文件lvmdrv,进行修改:
C文件:
- #include "config.h"
- #include "main.h"
- #include "delay.h"
- #include "LCD5110.h"
- /****************************************************************************
- * 名称:GUI_Initialize()
- * 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
- * 入口参数:无
- * 出口参数:无
- * 说明:用户根据LCM的实际情况编写此函数。
- ****************************************************************************/
- void GUI_Initialize(void)
- {
- LCD_Init();//LCD初始化
- }
- /****************************************************************************
- * 名称:GUI_FillSCR()
- * 功能:全屏填充。直接使用数据填充显示缓冲区。
- * 入口参数:dat 填充的数据
- * 出口参数:无
- * 说明:用户根据LCM的实际情况编写此函数。
- ****************************************************************************/
- void GUI_FillSCR(TCOLOR dat)
- {
- LCD_Fill(0,0,83,47,dat);
- }
- /****************************************************************************
- * 名称:GUI_ClearSCR()
- * 功能:清屏。
- * 入口参数:无
- * 出口参数:无
- * 说明:用户根据LCM的实际情况编写此函数。
- ****************************************************************************/
- void GUI_ClearSCR()
- {
- LCD_Clear();
- }
- /****************************************************************************
- * 名称:GUI_Point()
- * 功能:在指定位置上画点。
- * 入口参数: x 指定点所在列的位置
- * y 指定点所在行的位置
- * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
- * 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
- * 效范围)
- * 说明:用户根据LCM的实际情况编写此函数。
- ****************************************************************************/
- void GUI_Point(uint16 x, uint8 y, TCOLOR color)
- {
- LCD_DrawPoint(x,y,color);
- }
- /****************************************************************************
- * 名称:GUI_ReadPoint()
- * 功能:读取指定点的颜色。
- * 入口参数:x 指定点所在列的位置
- * y 指定点所在行的位置
- * ret 保存颜色值的指针
- * 出口参数:返回0表示指定地址超出缓冲区范围
- * 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
- * RGB结构则R、G、B变量有效。
- ****************************************************************************/
- uint8 GUI_ReadPoint(uint16 x, uint8 y, TCOLOR *ret)
- {
- return 0;
- }
- /****************************************************************************
- * 名称:GUI_HLine()
- * 功能:画水平线。
- * 入口参数: x0 水平线起点所在列的位置
- * y0 水平线起点所在行的位置
- * x1 水平线终点所在列的位置
- * color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
- * 出口参数:无
- * 说明:对于单色、4级灰度的液晶,可通过修改此函数作图提高速度,如单色LCM,可以一次更
- * 新8个点,而不需要一个点一个点的写到LCM中。
- ****************************************************************************/
- void GUI_HLine(uint16 x0, uint8 y0, uint16 x1, TCOLOR color)
- {
- uint8 temp;
- if(x0>x1) // 对x0、x1大小进行排列,以便画图
- {
- temp = x1;
- x1 = x0;
- x0 = temp;
- }
- do
- {
- GUI_Point(x0, y0, color); // 逐点显示,描出垂直线
- x0++;
- }
- while(x1>=x0);
- }
- /****************************************************************************
- * 名称:GUI_RLine()
- * 功能:画垂直线。
- * 入口参数: x0 垂直线起点所在列的位置
- * y0 垂直线起点所在行的位置
- * y1 垂直线终点所在行的位置
- * color 显示颜色
- * 出口参数:无
- * 说明:对于单色、4级灰度的液晶,可通过修改此函数作图提高速度,如单色LCM,可以一次更
- * 新8个点,而不需要一个点一个点的写到LCM中。
- ****************************************************************************/
- void GUI_RLine(uint16 x0, uint8 y0, uint8 y1, TCOLOR color)
- {
- uint8 temp;
- if(y0>y1) // 对y0、y1大小进行排列,以便画图
- {
- temp = y1;
- y1 = y0;
- y0 = temp;
- }
- do
- {
- GUI_Point(x0, y0, color); // 逐点显示,描出垂直线
- y0++;
- }
- while(y1>=y0);
- }
- /****************************************************************************
- * 名称:GUI_Exec()
- * 功能:刷新屏幕
- *
- *
- *
- *
- *
- ****************************************************************************/
- void GUI_Exec(void)
- {
- LCD_Refresh_Gram();
- }
复制代码 H文件:
- /****************************************************************************
- * 文件名:LCMDRV.H
- * 功能:12864图形液晶模块驱动程序。
- * 用于ZLG/GUI用户图形界面。
- *
- * 作者:黄绍斌
- * 日期:2005/3/7
- ****************************************************************************/
- #ifndef LCMDRV_H
- #define LCMDRV_H
- /* 定义颜色数据类型(可以是数据结构) */
- #define TCOLOR uint8_t //自行修改,原来是 uint8_t
- /* 定义LCM像素数宏 */
- #define GUI_LCM_XMAX 84 //自行修改 /* 定义液晶x轴的像素数 */
- #define GUI_LCM_YMAX 48 //自行修改 /* 定义液晶y轴的像素数 */
- void GUI_Initialize(void);
- void GUI_FillSCR(TCOLOR dat);
- void GUI_ClearSCR(void);
- void GUI_Point(uint16_t x, uint8_t y, TCOLOR color);
- uint8_t GUI_ReadPoint(uint16_t x, uint8_t y, TCOLOR *ret);
- void GUI_HLine(uint16_t x0, uint8_t y0, uint16_t x1, TCOLOR color);
- void GUI_RLine(uint16_t x0, uint8_t y0, uint8_t y1, TCOLOR color);
- void GUI_Exec(void);
- /****************************************************************************
- * 名称:GUI_CmpColor()
- * 功能:判断颜色值是否一致。
- * 入口参数:color1 颜色值1
- * color2 颜色值2
- * 出口参数:返回1表示相同,返回0表示不相同。
- * 说明:由于颜色类型TCOLOR可以是结构类型,所以需要用户编写比较函数。
- ****************************************************************************/
- #define GUI_CmpColor(color1, color2) ( (color1&0x01) == (color2&0x01) )
- /****************************************************************************
- * 名称:GUI_CopyColor()
- * 功能:颜色值复制。
- * 入口参数:color1 目标颜色变量
- * color2 源颜色变量
- * 出口参数:无
- * 说明:由于颜色类型TCOLOR可以是结构类型,所以需要用户编写复制函数。
- ****************************************************************************/
- #define GUI_CopyColor(color1, color2) *color1 = color2
- #endif
复制代码
在任务中添加。显示GUI:
- //显示一个窗口
- Win_Dis(0,0,84,48,head,text);
- //显示菜单
- Mem_Dis();
- //显示菜单选择
- GUI_MMenuSelect(&mymenu,1);
- //显示按键
- GUI_Button_OK(20,24);
- GUI_Exec();
复制代码 WIN和MEm的显示和定义函数:
- //GUI
- u8 head[]={"Win_XP"};
- u8 text[]={"Please select!"};
- WINDOWS winxp;
- MMENU mymenu;
- /* USER CODE END Variables */
- /* Private function prototypes -----------------------------------------------*/
- /* USER CODE BEGIN FunctionPrototypes */
- void Win_Dis(u8 pos_x,u8 pos_y,u8 width,u8 high,u8 *headline,u8 *contain)
- {
- winxp.x=pos_x;
- winxp.y=pos_y;
- winxp.with=width;
- winxp.hight=high;
- winxp.title=headline;
- winxp.state=contain;
- GUI_WindowsDraw(&winxp);
- }
- void Mem_Dis(void)
- {
- mymenu.win=&winxp;
- mymenu.no=3;
- mymenu.str[0]="YES";
- mymenu.str[1]="NO";
- mymenu.str[2]="CHANCE";
- GUI_MMenuDraw(&mymenu);
- }
复制代码 编译,下载,查看:
zlg_gui包:
ZLG_GUI.rar
(34.44 KB, 下载次数: 14)
|
|