可以畫點,畫直線,畫矩形
單片機源程序如下:
- /*系統(tǒng) includes */
- #include <stdint.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- //單片機頭文件
- #include "stm32f10x.h"
- //硬件驅(qū)動
- #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}; //保存的數(shù)據(jù)
- char clear_buff[1024] ={0x00}; //全部清空或者清黑
- char colour[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //畫點數(shù)據(jù)
- char table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //數(shù)字
- //
- 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);
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Expansion_init
- *
- * 函數(shù)功能: 擴展指令集初始化
- *
- * 入口參數(shù): 無
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- 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);
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Basic_init
- *
- * 函數(shù)功能: 基本指令集初始化
- *
- * 入口參數(shù): 無
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- void Basic_init(void) //基本指令集初始化
- {
- delay_nms(1);
- Send(0,0x30); /*功能設置:一次送8位數(shù)據(jù),基本指令集*/
- delay_nms(1);
- Send(0,0x30); /*功能設置:一次送8位數(shù)據(jù),基本指令集*/
- 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);
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Lcd_Init
- *
- * 函數(shù)功能: 初始化
- *
- * 入口參數(shù): 無
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- void Lcd12864_Init(void)
- {
- LcdGpioInit();
- delay_nms(10); /*延時等待電源穩(wěn)定*/
-
- SET_PSB_L;
- delay_nms(10);
- SET_RESET_L;
- delay_nms(10);
- SET_RESET_H;
- delay_nms(10);
- ClearLcd(); /*清屏*/
- // Expansion_init(); /*擴展指令集初始化*/
- // Basic_init(); /*基本指令集初始化*/
- }
- /*
- ************************************************************
- * 函數(shù)名稱: ClearLcd
- *
- * 函數(shù)功能: 清屏
- *
- * 入口參數(shù): 無
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- void ClearLcd(void) //清屏
- {
- Send(0,0x34); /*擴展功能集RE = 1:擴展指令*/
- delay_nms(10);
- Send(0,0x30); /*功能設置:一次送8位數(shù)據(jù),基本指令集*/
- delay_nms(10);
- Send(0,0x01); /*清屏,將DDRAM的位址計數(shù)器調(diào)整為“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的位址計數(shù)器調(diào)整為“00H”*/
- delay_nms(10);
- memset(clear_buff,0x00,sizeof(full_screen));
- Disp_TP_mcu(0,0,128,64,clear_buff,sizeof(clear_buff));
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Send
- *
- * 函數(shù)功能: 發(fā)送數(shù)據(jù)
- *
- * 入口參數(shù): type:類型(0:發(fā)送命令,1:發(fā)送數(shù)據(jù)),transdata:數(shù)據(jù)
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- void Send(unsigned char type,unsigned char transdata) //0-寫控制命令,1-寫數(shù)據(jù)
- {
- unsigned char firstbyte = 0xf8;
- unsigned char temp;
- unsigned char i,j = 3;
- if(type) //0-寫控制命令,1-寫數(shù)據(jù)
- 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);//三個字節(jié)之間一定要有足夠的延時,否則易出現(xiàn)時序問題
- j--;
- }
- SET_SID_L;
- delay_nus(1);
- SET_CS_L;
- delay_nus(1);
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Lcd_Loc
- *
- * 函數(shù)功能: 定位
- *
- * 入口參數(shù): x:橫軸的起點,y:豎軸的起點
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- 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);
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Disp_HZ
- *
- * 函數(shù)功能: 顯示漢字
- *
- * 入口參數(shù): x:橫軸的起點,y:豎軸的起點,*pt:漢字數(shù)據(jù)地址,num:漢字個數(shù)
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- void Disp_HZ(unsigned char x,unsigned char y,const char *pt,unsigned char num) //顯示漢字和漢字個數(shù)
- {
- unsigned char i;
- Lcd_Loc(x,y);
- for(i = 0;i < (num*2);i++)
- {
- Send(1,*(pt++));
- delay_nus(10);
- }
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Disp_SZ
- *
- * 函數(shù)功能: 顯示數(shù)字
- *
- * 入口參數(shù): x:橫軸的起點,y:豎軸的起點,shuzi:數(shù)字序號
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- void Disp_SZ(unsigned char x,unsigned char y,unsigned char shuzi) //顯示一個數(shù)字
- {
- Lcd_Loc(x,y);
- Send(1,table[shuzi]);
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Disp_TP_lcd
- *
- * 函數(shù)功能: 顯示圖片()
- *
- * 入口參數(shù): x:橫軸的起點,y:豎軸的起點,x_long:圖片橫軸的長度,y_long:圖片豎軸的長度,*p_image:圖片地址,len_image:圖片總的數(shù)據(jù)長度
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- 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);
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Disp_TP_mcu
- *
- * 函數(shù)功能: 顯示圖片
- *
- * 入口參數(shù): x:橫軸的起點,y:豎軸的起點,x_long:圖片橫軸的長度,y_long:圖片豎軸的長度,*p_image:圖片地址,len_image:圖片總的數(shù)據(jù)長度
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- 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);
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Disp_Dian_mcu
- *
- * 函數(shù)功能: 顯示點
- *
- * 入口參數(shù): x:橫軸的起點,y:豎軸的起點,colour_num:顏色
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- 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);
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Disp_Xian_mcu
- *
- * 函數(shù)功能: 顯示線
- *
- * 入口參數(shù): x:橫軸的起點,y:豎軸的起點,direction:方向,len:線的長度,colour_num:顏色
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- 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);
- }
- }
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Disp_JX_mcu
- *
- * 函數(shù)功能: 顯示矩形
- *
- * 入口參數(shù): x:橫軸的起點,y:豎軸的起點,x_len:橫軸的長度,y_len豎軸的長度,filling:填充
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- 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); //畫線
- }
- }
- }
- /*
- ************************************************************
- * 函數(shù)名稱: Disp_Refresh_Page
- *
- * 函數(shù)功能: 刷新頁面
- *
- * 入口參數(shù): 無
- *
- * 返回參數(shù): 無
- *
- * 說明:
- ************************************************************
- */
- 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, 下載次數(shù): 99)
2018-8-28 15:24 上傳
點擊文件名下載附件
|