可以画点,画直线,画矩形
单片机源程序如下:
- /*系统 includes */
- #include <stdint.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- //单片机头文件
- #include "stm32f10x.h"
- //硬件驱动
- #include "delay.h"
- #include "lcd12864.h"
- #include "lv_conf.h"
- #include "lv_vdb.h"
- #include "lv_hal.h"
- //接口配置(串行通信)
- #define SET_CS_H GPIO_SetBits(GPIOA,GPIO_Pin_0);
- #define SET_CS_L GPIO_ResetBits(GPIOA,GPIO_Pin_0);
- #define SET_SID_H GPIO_SetBits(GPIOA,GPIO_Pin_1);
- #define SET_SID_L GPIO_ResetBits(GPIOA,GPIO_Pin_1);
- #define SET_CLK_H GPIO_SetBits(GPIOA,GPIO_Pin_2);
- #define SET_CLK_L GPIO_ResetBits(GPIOA,GPIO_Pin_2);
- #define SET_PSB_H GPIO_SetBits(GPIOA,GPIO_Pin_3);
- #define SET_PSB_L GPIO_ResetBits(GPIOA,GPIO_Pin_3);
- #define SET_RESET_H GPIO_SetBits(GPIOA,GPIO_Pin_4);
- #define SET_RESET_L GPIO_ResetBits(GPIOA,GPIO_Pin_4);
- char full_screen[1024] ={0x00}; //保存的数据
- char clear_buff[1024] ={0x00}; //全部清空或者清黑
- char colour[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //画点数据
- char table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //数字
- //
- const char pic2[1024]=
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- …………
- …………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
- 0x00,0x07,0xF8,0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
- void Send(unsigned char type,unsigned char transdata);
- void delay_nus(unsigned int num)
- {
- DelayUs(num);
- }
-
- void delay_nms(unsigned int num)
- {
- DelayXms(num);
- }
- void LcdGpioInit(void)
- {
- GPIO_InitTypeDef gpio_initstruct;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- gpio_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;
- gpio_initstruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_3;
- gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &gpio_initstruct);
- }
- /*
- ************************************************************
- * 函数名称: Expansion_init
- *
- * 函数功能: 扩展指令集初始化
- *
- * 入口参数: 无
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Expansion_init(void) //扩展指令集初始化
- {
- delay_nms(1);
- Send(0,0x36); /*扩展功能集RE = 1:扩展指令*/
- delay_nms(1);
- Send(0,0x36); /*扩展功能集RE = 1:扩展指令*/
- delay_nms(1);
- Send(0,0x3E); /*绘制打开(DL=8BITS,RE=1,G=1)*/
- delay_nms(1);
- }
- /*
- ************************************************************
- * 函数名称: Basic_init
- *
- * 函数功能: 基本指令集初始化
- *
- * 入口参数: 无
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Basic_init(void) //基本指令集初始化
- {
- delay_nms(1);
- Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/
- delay_nms(1);
- Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/
- delay_nms(1);
- Send(0,0x08); /*在控制上显示*/
- delay_nms(1);
- Send(0,0x10); /*光标显示控制*/
- delay_nms(1);
- Send(0,0x02); /*DDRAM地址归位*/
- delay_nms(1);
- Send(0,0x0C); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
- delay_nms(1);
- Send(0,0x06); /*功能设置,点设定:显示字符/光标从右向左移位,DDRAM地址加1*/
- delay_nms(1);
- }
- /*
- ************************************************************
- * 函数名称: Lcd_Init
- *
- * 函数功能: 初始化
- *
- * 入口参数: 无
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Lcd12864_Init(void)
- {
- LcdGpioInit();
- delay_nms(10); /*延时等待电源稳定*/
-
- SET_PSB_L;
- delay_nms(10);
- SET_RESET_L;
- delay_nms(10);
- SET_RESET_H;
- delay_nms(10);
- ClearLcd(); /*清屏*/
- // Expansion_init(); /*扩展指令集初始化*/
- // Basic_init(); /*基本指令集初始化*/
- }
- /*
- ************************************************************
- * 函数名称: ClearLcd
- *
- * 函数功能: 清屏
- *
- * 入口参数: 无
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void ClearLcd(void) //清屏
- {
- Send(0,0x34); /*扩展功能集RE = 1:扩展指令*/
- delay_nms(10);
- Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/
- delay_nms(10);
- Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/
- delay_nms(10);
- Send(0,0x34); /*扩展功能集RE = 1:扩展指令*/
- delay_nms(10);
- Send(0,0x34); /*扩展功能集RE = 1:扩展指令*/
- delay_nms(10);
- Send(0,0x3C); /*绘制打开(DL=8BITS,RE=1,G=1)*/
- delay_nms(10);
- Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/
- delay_nms(10);
- memset(clear_buff,0x00,sizeof(full_screen));
- Disp_TP_mcu(0,0,128,64,clear_buff,sizeof(clear_buff));
- }
- /*
- ************************************************************
- * 函数名称: Send
- *
- * 函数功能: 发送数据
- *
- * 入口参数: type:类型(0:发送命令,1:发送数据),transdata:数据
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Send(unsigned char type,unsigned char transdata) //0-写控制命令,1-写数据
- {
- unsigned char firstbyte = 0xf8;
- unsigned char temp;
- unsigned char i,j = 3;
- if(type) //0-写控制命令,1-写数据
- firstbyte |= 0x02;
- delay_nus(1);
- SET_CS_H;
- delay_nus(1);
- SET_CLK_L;
- delay_nus(1);
- while(j > 0)
- {
- if(j == 3)
- {
- temp = firstbyte;
- // delay_nus(1);
- }
- else
- {
- if(j == 2)
- {
- temp = transdata&0xf0;
- // delay_nus(1);
- }
- else
- {
- temp = (transdata << 4) & 0xf0;
- // delay_nus(1);
- }
- }
- for(i = 8;i > 0;i--)
- {
- if(temp & 0x80)
- {
- SET_SID_H;
- delay_nus(1);
- }
- else
- {
- SET_SID_L;
- delay_nus(1);
- }
- SET_CLK_H;
- delay_nus(1);
- temp <<= 1;
- delay_nus(1);
- SET_CLK_L;
- delay_nus(1);
- }
- delay_nus(1);//三个字节之间一定要有足够的延时,否则易出现时序问题
- j--;
- }
- SET_SID_L;
- delay_nus(1);
- SET_CS_L;
- delay_nus(1);
- }
- /*
- ************************************************************
- * 函数名称: Lcd_Loc
- *
- * 函数功能: 定位
- *
- * 入口参数: x:横轴的起点,y:竖轴的起点
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Lcd_Loc(unsigned char x,unsigned char y) //定位x 为x轴坐标,y为 y轴坐标
- {
- unsigned char pos;
- switch(x)
- {
- case 1:pos=0x80;break;
- case 2:pos=0x90;break;
- case 3:pos=0x88;break;
- case 4:pos=0x98;break;
- default:pos=0x80;
- }
- delay_nus(10);
- pos += y;
- delay_nus(10);
- Send(0,pos);
- delay_nus(10);
- }
- /*
- ************************************************************
- * 函数名称: Disp_HZ
- *
- * 函数功能: 显示汉字
- *
- * 入口参数: x:横轴的起点,y:竖轴的起点,*pt:汉字数据地址,num:汉字个数
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Disp_HZ(unsigned char x,unsigned char y,const char *pt,unsigned char num) //显示汉字和汉字个数
- {
- unsigned char i;
- Lcd_Loc(x,y);
- for(i = 0;i < (num*2);i++)
- {
- Send(1,*(pt++));
- delay_nus(10);
- }
- }
- /*
- ************************************************************
- * 函数名称: Disp_SZ
- *
- * 函数功能: 显示数字
- *
- * 入口参数: x:横轴的起点,y:竖轴的起点,shuzi:数字序号
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Disp_SZ(unsigned char x,unsigned char y,unsigned char shuzi) //显示一个数字
- {
- Lcd_Loc(x,y);
- Send(1,table[shuzi]);
- }
- /*
- ************************************************************
- * 函数名称: Disp_TP_lcd
- *
- * 函数功能: 显示图片()
- *
- * 入口参数: x:横轴的起点,y:竖轴的起点,x_long:图片横轴的长度,y_long:图片竖轴的长度,*p_image:图片地址,len_image:图片总的数据长度
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Disp_TP_lcd(unsigned char x,unsigned char y,unsigned char x_long,unsigned char y_long,const char *p_image,unsigned int len_image) //显示图片,将图片下载到LCD的RAM中显示
- {
- int x_num = 0,y_num = 0;
- unsigned int num = 0;
- // Lcd_Loc(x,y);
- for(x_num=0;x_num<(x_long/4);x_num++)
- {
- Send(0,0x34);
- Send(0,(0x80 + x_num));
- Send(0,0x80);
- Send(0,0x30);
- for(y_num=0;y_num<(y_long/4);y_num++)
- {
- Send(1,*p_image);
- p_image++;
- if(num >= len_image)
- {
- Send(0,0x36);
- Send(0,0x30);
- return ;
- }
- }
- }
- if(y_long > 32)
- {
- for(x_num=0;x_num<(x_long/4);x_num++)
- {
- Send(0,0x34);
- Send(0,(0x80 + x_num));
- Send(0,0x88);
- Send(0,0x30);
- for(y_num=0;y_num<(y_long/4);y_num++)
- {
- Send(1,*p_image);
- p_image++;
- if(num >= len_image)
- {
- Send(0,0x36);
- Send(0,0x30);
- return ;
- }
- }
- }
- }
- Send(0,0x36);
- Send(0,0x30);
- }
- /*
- ************************************************************
- * 函数名称: Disp_TP_mcu
- *
- * 函数功能: 显示图片
- *
- * 入口参数: x:横轴的起点,y:竖轴的起点,x_long:图片横轴的长度,y_long:图片竖轴的长度,*p_image:图片地址,len_image:图片总的数据长度
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Disp_TP_mcu(unsigned char x,unsigned char y,unsigned char x_long,unsigned char y_long,const char *p_image,unsigned int len_image) //显示图片,MCU通过绘图的方式将图片绘制出来(图片越大绘制速度越慢)
- {
- unsigned int y_num = 0;
- unsigned int x_num = 0;
- unsigned int buff_num = 0;
- unsigned int data_num = 0;
- buff_num = ((128*(y-1))+x-1)/8;
-
- // Expansion_init();
- for(y_num=0;y_num<=(y_long);y_num++) /*上半屏显示*/
- {
- if(y_num >= 32)
- {
- break;
- }
- buff_num = (16*y_num+(x-1)/16);
- // Send(0,(0x80 + y_num)); //列地址
- // Send(0,0x80); //行地址
- for(x_num=0;x_num<(x_long/8);x_num++)
- {
- // Send(1,*p_image);
- full_screen[buff_num++] |= *p_image;
- p_image++;
- data_num++;
- if(data_num >= len_image)
- {
- // Send(0,0x36);
- // Send(0,0x30);
- return ;
- }
- }
- }
- if(y_long > 32)
- {
- for(y_num=0;y_num<=(y_long-32);y_num++) /*下半屏显示*/
- {
- buff_num = (16*y_num+x-1);
- // Send(0,(0x80 + y_num)); //列地址
- // Send(0,0x88); //行地址
- for(x_num=0;x_num<(x_long/8);x_num++)
- {
- // Send(1,*p_image);
- full_screen[buff_num++] |= *p_image;
- p_image++;
- data_num++;
- if(data_num >= len_image)
- {
- // Send(0,0x36);
- // Send(0,0x30);
- return ;
- }
- }
- }
- }
- // Send(0,0x36);
- // Send(0,0x30);
- }
- /*
- ************************************************************
- * 函数名称: Disp_Dian_mcu
- *
- * 函数功能: 显示点
- *
- * 入口参数: x:横轴的起点,y:竖轴的起点,colour_num:颜色
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Disp_Dian_mcu(unsigned char x,unsigned char y,unsigned char colour_num) //显示点,通过绘图方式
- {
- unsigned char pos,los,xos;
- int buff_num = 0,data3 = 0;
- unsigned char data = 0,data1 = 0,data2 = 0;
- if((x <= 0) | (x > 128) | (y <= 0) | (y > 64))
- {
- return ;
- }
- if((y >= 1) && (y <= 16))
- {
- pos=0x80 + ((x-1)/16);
- xos = (x-1)%16;
- los = y-1;
- }
- else
- if((y > 16) && (y <= 32))
- {
- pos=0x90 + ((x-1)/16);
- xos = (x-1)%16;
- los = y-1;
- }
- else
- if((y > 32) && (y <= 48))
- {
- pos=0x88 + ((x-1)/16);
- xos = (x-1)%16;
- los = y-33;
- }
- else
- if((y > 48) && (y <= 64))
- {
- pos=0x98 + ((x-1)/16);
- xos = (x-1)%16;
- los = y-33;
- }
- else
- {
- pos=0x80 + ((x-1)/16);
- xos = (x-1)%16;
- los = y-1;
- }
- // Expansion_init();
- // Send(0,(0x80 + los)); //列地址
- // Send(0,pos); //行地址
- if(colour_num <= 0) //白点
- {
- if(xos < 8)
- {
- data1 = ~colour[xos];
- buff_num = ((128*(y-1))+x-1)/8;
- data2 = full_screen[buff_num];
- data = data1 & data2;
- // Send(1,data);
- full_screen[buff_num] |= data;
- }
- else
- {
- data1 = ~colour[xos-8];
- buff_num = ((128*(y-1))+x-1)/8;
- data2 = full_screen[buff_num];
- data = data1 & data2;
- // data3 = data | ((full_screen[buff_num-1] & 0x00FF)<<8);
- // Send(1,data3>>8);
- // Send(1,data3);
- full_screen[buff_num] |= data;
- }
- }
- else
- {
- if(colour_num >= 1) //黑点
- {
- if(xos < 8)
- {
- data1 = colour[xos];
- buff_num = ((128*(y-1))+x-1)/8;
- data2 = full_screen[buff_num];
- data = data1 | data2;
- // Send(1,data);
- full_screen[buff_num] |= data;
- }
- else
- {
- data1 = colour[xos-8];
- buff_num = ((128*(y-1))+x-1)/8;
- data2 = full_screen[buff_num];
- data = data1 | data2;
- // data3 = data | ((full_screen[buff_num-1] & 0x00FF)<<8);
- // Send(1,data3>>8);
- // Send(1,data3);
- full_screen[buff_num] |= data;
- }
- }
- }
- // Send(0,0x36);
- // Send(0,0x30);
- }
- /*
- ************************************************************
- * 函数名称: Disp_Xian_mcu
- *
- * 函数功能: 显示线
- *
- * 入口参数: x:横轴的起点,y:竖轴的起点,direction:方向,len:线的长度,colour_num:颜色
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Disp_Xian_mcu(unsigned char x,unsigned char y,unsigned char direction,unsigned char len,unsigned char colour_num) //显示线,通过绘图方式
- {
- unsigned char i;
- if((x <= 0) | (x > 128) | (y <= 0) | (y > 64))
- {
- return ;
- }
- if(direction == 0) //水平划线
- {
- for(i = 0;i<len;i++)
- {
- Disp_Dian_mcu(x+i,y,colour_num);
- }
- }
- else
- if(direction == 1) //垂直划线
- {
- for(i = 0;i<len;i++)
- {
- Disp_Dian_mcu(x,y+i,colour_num);
- }
- }
- }
- /*
- ************************************************************
- * 函数名称: Disp_JX_mcu
- *
- * 函数功能: 显示矩形
- *
- * 入口参数: x:横轴的起点,y:竖轴的起点,x_len:横轴的长度,y_len竖轴的长度,filling:填充
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Disp_JX_mcu(unsigned char x,unsigned char y,unsigned char x_len,unsigned char y_len,const char filling) //显示矩形,通过绘图方式
- {
- uint8_t i=0;
- if(filling == 0)
- {
- Disp_Xian_mcu(x,y,1,y_len,1); //画线
- Disp_Xian_mcu(x,y,0,x_len,1); //画线
- Disp_Xian_mcu(x+x_len,y,1,y_len+1,1); //画线
- Disp_Xian_mcu(x,y+y_len,0,x_len+1,1); //画线
- }
- else
- {
- for(i=0;i<y_len;i++)
- {
- Disp_Xian_mcu(x,y+i,0,x_len,1); //画线
- }
- }
- }
- /*
- ************************************************************
- * 函数名称: Disp_Refresh_Page
- *
- * 函数功能: 刷新页面
- *
- * 入口参数: 无
- *
- * 返回参数: 无
- *
- * 说明:
- ************************************************************
- */
- void Disp_Refresh_Page(void)
- {
- unsigned char x_long = 128;
- unsigned char y_long = 64;
- const char *p_image = full_screen;
- unsigned int len_image = 1024;
- unsigned int y_num = 0;
- unsigned int x_num = 0;
- unsigned int data_num = 0;
- unsigned int i=0,j=0,n=0;
- // while(n<128)
- // {
- // for(i=0;i<4;i++)
- // {
- // if(n<128)
- // {
- // full_screen[i+(j*16)]=pic4[n++];
- // }
- // }
- // j++;
- // }
- Expansion_init();
- for(y_num=0;y_num<=(y_long);y_num++) /*上半屏显示*/
- {
- if(y_num >= 32)
- {
- break;
- }
- Send(0,(0x80 + y_num)); //列地址
- Send(0,0x80); //行地址
- for(x_num=0;x_num<(x_long/8);x_num++)
- {
- Send(1,*p_image);
- p_image++;
- data_num++;
- if(data_num >= len_image)
- {
- Send(0,0x36);
- Send(0,0x30);
- return ;
- }
- }
- }
- if(y_long > 32)
- {
- for(y_num=0;y_num<=(y_long-32);y_num++) /*下半屏显示*/
- {
- Send(0,(0x80 + y_num)); //列地址
- Send(0,0x88); //行地址
- for(x_num=0;x_num<(x_long/8);x_num++)
- {
- Send(1,*p_image);
- p_image++;
- data_num++;
- if(data_num >= len_image)
- {
- Send(0,0x36);
- Send(0,0x30);
- return ;
- }
- }
- }
- }
- Send(0,0x36);
- Send(0,0x30);
- }
复制代码
所有资料51hei提供下载:
LCD12864画点程序.rar
(4.8 KB, 下载次数: 98)
|