私の5110画の図库--Nokia 5110液晶のスクリーンは点を描くことを実现して、線をかいて、矩形をかいて、円と図を描きます


久しぶりにオリジナルの投稿を書いて、今日は自分が書いた良いものを共有します.
最近多くの時間を費やしてやっと5110液晶パネルの絵図関数ライブラリを完成して、前のnios iiの工事の基礎の上でしたので、絵の基本関数を完備して、点を描いて、直線を描いて、折れ線を描いて、矩形を描いて、円とマップの基本的な機能を描きます.関数ライブラリには、バッファを使用する関数と、バッファを使用しない関数が用意されており、必要に応じて柔軟に使用できます.シングルチップマシンはstm 32を使用していますが、マクロ定義をしているので、他のシングルチップマシンに移植しやすく、具体的にはコード注釈で紹介すべき詳細があります(注釈は整理するのに時間がかかりましたよ).
絵を描くアルゴリズムでは、直線を描くのにBresenhamアルゴリズムを採用しました.円を描くには中点で円を描く方法を採用していますが、少し変更しました.浮動小数点数を使用していません.また、乗算計算でシフトを採用しています.この2点は絵を描くスピードを大幅に加速させました.
余計なことは言わないで,まず図を描きなさい.
私のヘッダファイルが提供している関数を見てみましょう(個人的には多いと思います):
  LCD5110.h
#ifndef _LCD5110_H_
#define _LCD5110_H_

/*--------     <5110        >            --------*/
/*------------                 LCD5110.c--------------*/
/*------------   LcdPortInit            ---------------*/
/*--------------5110 VCC 3V           ------------------*/
/*-------------------LCD5110.c LcdInit  -------------------------*/

#include "stm32f0xx.h"
#include "stm32f0xx_gpio.h"
#include "Delay.h"
#include "Font6_8.h"
#include "Icon10_8.h"
#include "Font8_16.h"
#include "Font16_16.h"
#include "Bitmap.h"


/*------          buf,        buf-----*/
#define USE_BUF
/*------          buf,        buf-----*/

#define u8 		unsigned char
#define u16 	unsigned short

typedef struct 
{
	u8 x;
	u8 y;
}point;

/*------5110          ------*/
#define DATA	1				//  
#define CMD 0					//  
#define LCD_X	84				//        
#define LCD_ROW LCD_X				//      
#define LCD_Y	48				//        
#define LCD_COLUMN LCD_Y / 8			//      
#define LCD_AREA LCD_X * LCD_Y			//     
#define LCD_AREA_BYTE LCD_COLUMN * LCD_ROW		//       

/*------    --------*/
#define BIT0 	0x00000001
#define BIT1 	0x00000002
#define BIT2 	0x00000004
#define BIT3 	0x00000008
#define BIT4 	0x00000010
#define BIT5 	0x00000020
#define BIT6 	0x00000040
#define BIT7 	0x00000080
#define BIT8 	0x00000100
#define BIT9 	0x00000200
#define BIT10 0x00000400
#define BIT11 0x00000800
#define BIT12 0x00001000
#define BIT13 0x00002000
#define BIT14 0x00004000
#define BIT15 0x00008000

/*------5110        --------*/

#define LCD5110_PORT 	GPIOB					//5110    
#define LCD_SCLK_BIT 	BIT3					//SCLK   
#define LCD_SDIN_BIT 	BIT4					//SDIN   
#define LCD_DC_BIT 	 	BIT5					//DC   
#define LCD_SCE_BIT		BIT6					//SCE   
#define LCD_REST_BIT 	BIT7					//REST   


/*------5110       -----------*/ 
#define LCD_SCLK_H	LCD5110_PORT->BSRR = LCD_SCLK_BIT		//SCLK 1	
#define LCD_SCLK_L  LCD5110_PORT->BRR  = LCD_SCLK_BIT		//SCLK 0

#define LCD_SDIN_H	LCD5110_PORT->BSRR = LCD_SDIN_BIT
#define LCD_SDIN_L  LCD5110_PORT->BRR  = LCD_SDIN_BIT

#define LCD_DC_H		LCD5110_PORT->BSRR = LCD_DC_BIT
#define LCD_DC_L  	LCD5110_PORT->BRR  = LCD_DC_BIT

#define LCD_SCE_H		LCD5110_PORT->BSRR = LCD_SCE_BIT
#define LCD_SCE_L  	LCD5110_PORT->BRR  = LCD_SCE_BIT

#define LCD_REST_H	LCD5110_PORT->BSRR = LCD_REST_BIT
#define LCD_REST_L  LCD5110_PORT->BRR  = LCD_REST_BIT

#define RCC_LCD5110_PORT 	RCC_AHBENR_GPIOAEN << (((uint32_t)LCD5110_PORT-(uint32_t)GPIOA) >> 10)			//5110 RCC  

/*--------------------------------------------------------------------------------------------------------------*/
/*-------      buf   buf,   buf  ,         ,  5110           ;----------*/
/*-------          8   ,             。  buf              -----------*/
/*-------    ,            ,              。  buf      ,  ------------*/
/*-------   buf  ,    tobuf,ofbuf,buf    PutChartoBuf、PutCircletoBuf、ClearBuf,   -----------*/
/*-------          Refresh、RefreshAll      buf      5110 ,   ,     -----------*/
/*-------            。     buf           5110 ,    buf  , BufPutChar-----*/
/*-------、BufPutHanzi ,          PutLine、PutRect 。----------------------------------------------*/

/////////////////////////////////////////////////////////////////////////////////////////////////////
/////*				                  				*//////
//*--------------------------------------------------------*//
/////////////////////////////////////////////////////////////////////////////////////////////////////


//*******				             				*****//

/*----------   5110-----------*/
void InitLcd(void);
/*-------    5110  --------*/
void LcdClearAll(void);
/*---  5110     ----*/
void SetXY(u8 row,u8 column);

//******				      8       				*******//
//**			  6*8      ,6*8  ,10*8  			  **//
//--every row contains 14 characters,there are 6 rows (font = 6 * 8)--//
		//-----------------   	row		  ---------------------//
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		column = 0
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		column = 1
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		column = 2
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		column = 3
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		column = 4
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		column = 5
//-------------------------------------------------------//

/*---     ASCII  (6*8) 5110(     ,         )---*/
void WriteChar(u8 value);
/*---     ASCII  (6*8) 5110---*/
void PutChar(u8 value,u8 column,u8 row);
/*---        (6*8) 5110(     ,         )---*/
void WriteStr(char * str);
/*--        (6*8) 5110--*/
void PutStr(char * str,u8 column,u8 row);
/*--- sign(6*8)(     ,         )---*/
void WriteSign(char * sign);
/*---- sign(6*8)----*/
void PutSign(char * sign,u8 column,u8 row);
/*--- Icon(10*8)(     ,         )---*/
void WriteIcon(char * icon);
/*-- Icon(10*8),row(0~74)--*/
void PutIcon(char * icon,u8 column,u8 row);

//********				      16       				*******//
//**		    	      8*16      ,16*16  		           **//
//--every row contains 10 characters,there are 3 rows (font = 8 * 16)--//
//-----------       row       ------------//
		//0 1 2 3 ... 81 82 83//	column = 0
		//0 1 2 3 ... 81 82 83//
		//0 1 2 3 ... 81 82 83//	column = 1
		//0 1 2 3 ... 81 82 83//
		//0 1 2 3 ... 81 82 83//	column = 2
		//0 1 2 3 ... 81 82 83//
//-----------------------------------------//

/*-----     ASCII  (8*16) 5110------*/
void PutWideChar(u8 value,u8 column,u8 row);
/*--        (6*8) 5110,    ,row(0~76)--*/
void PutWideStr(char * str,u8 column,u8 row);

//--every row contains 5 characters,there are 3 rows (font = 16 * 16)--//
//----------      row       --------------//
		//0 1 2 3 ... 81 82 83//	column = 0
		//0 1 2 3 ... 81 82 83//
		//0 1 2 3 ... 81 82 83//	column = 1
		//0 1 2 3 ... 81 82 83//
		//0 1 2 3 ... 81 82 83//	column = 2
		//0 1 2 3 ... 81 82 83//
//----------------------------------------//

/*-----       (16*16) 5110------*/
void PutHanzi(char Hanzi[],u8 column,u8 row);
/*--     (16*16),    ,row(0~58)--*/
void PutHanziStr(char Hanzi[],u8 column,u8 row,u8 num);

//********				            				*********//
//**		    	        84*48,   8      		       **//
//---------------   	x		  ----------------------//
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		y = 0
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		y = 1
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		y = 2
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		y = 3
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		y = 4
		//0 1 2 3 4 5 6 7 8 9 10 11 12 13//		y = 5
//-----------------------------------------------//

/*--- picture(84*48),  ---*/
void DrawPicture(char bitmap[]);
/*--- picture(     8   )---*/
void DrawBmp(char bitmap[],u8 x,u8 y,u8 width,u8 height);

#ifdef USE_BUF	/*USE_BUF*/

/////////////////////////////////////////////////////////////////////////////////////////////////////
/////*				                 				*//////
//*-------------         ----------------*//
/////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------   	x		  ------------------------//
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		y = 0
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		y = 1
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		y = 2
		//							.
		//							.
		//							.
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		y = 45
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		y = 46
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		y = 47
//--------------------------------------------------------//
//-------------------  	row		  ------------------------//
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		column = 0
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		column = 1
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		column = 2
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		column = 3
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		column = 4
		//0 1 2 3 4 5 ...78 79 80 81 82 83//		column = 5
//------------------------------------------------------//

///////*------------------------------------------*////////
//*********				     ,         			*********//
///////*------------------------------------------*////////

/*-----         -------*/
void SetBufPtr(u8 x,u8 y);
/*----         5110 -----*/
void RefreshAll(void);
/*-------           5110    -------*/
void Refresh(u8 x,u8 y,u8 width,u8 height);
/*------       -------*/
void ClearAllBuf(void);
/*------          5110------*/
void BufClearAll(void);
/*-------         -------*/
void ClearBuf(u8 x,u8 y,u8 width,u8 height);
/*-------            ------*/
void BufClear(u8 x,u8 y,u8 width,u8 height);

///////*------------------------------------------*////////
//*********				      ,    				*********//
///////*------------------------------------------*////////


//******                8              ******//

/*-------   ASCII  (6*8)    (     ,      )--------*/
void WriteChartoBuf(u8 value);
/*--------        ASCII  (6*8) 5110(     ,      )--------*/
void BufWriteChar(u8 value);
/*----   ASCII  (6*8)    -----*/
void PutChartoBuf(u8 value,u8 x,u8 y);
/*----        ASCII  (6*8) 5110-----*/
void BufPutChar(u8 value,u8 x,u8 y);
/*------      (  8)    (     ,      )-----*/
u8 WriteStrtoBuf(char * str);
/*----           (  8) 5110(     ,      )----*/
u8 BufWriteStr(char * str);
/*-----      (  8)    ------*/
u8 PutStrtoBuf(char * str,u8 x,u8 y);
/*------           (  8) 5110------*/
u8 BufPutStr(char * str,u8 x,u8 y);

//*******                  16          ********//

/*------   ASCII  (8*16)    ------*/
void PutWideChartoBuf(u8 value,u8 x,u8 y);
/*----        ASCII  (8*16) 5110------*/
void BufPutWideChar(u8 value,u8 x,u8 y);
/*-----      (  16)    ------*/
u8 PutWideStrtoBuf(char * str,u8 x,u8 y);
/*------         (  16) 5110------*/
u8 BufPutWideStr(char *str,u8 x,u8 y);
/*-----     (16*16)    ------*/
void PutHanzitoBuf(char Hanzi[],u8 x,u8 y);
/*-----          (16*16) 5110-------*/
void BufPutHanzi(char Hanzi[],u8 x,u8 y);
/*-------     (  16)    (num     )-------*/
u8 PutHanziStrtoBuf(char Hanzi[],u8 x,u8 y,u8 num);
/*-----          (  16) 5110(num     )------*/
u8 BufPutHanziStr(char Hanzi[],u8 x,u8 y,u8 num);

//*********         , ,  ,  , ,bmp          *********//

/*------        -------*/
void PutPointtoBuf(u8 x,u8 y);
/*------          5110------*/
void PutPoint(u8 x,u8 y);
/*------        --------*/		
void PutLinetoBuf(u8 x1,u8 y1,u8 x2,u8 y2);
/*-----          5110-------*/	
void PutLine(u8 x1,u8 y1,u8 x2,u8 y2);
/*--       (p       ,line_num        )--*/
void PutPolylinetoBuf(point *p,u8 line_num);
/*--         5110(p       ,line_num        )--*/
void PutPolyline(point *p,u8 line_num);
/*---------       --------*/
void PutRecttoBuf(u8 x,u8 y,u8 width,u8 height);
/*--------         5110--------*/
void PutRect(u8 x,u8 y,u8 width,u8 height);
/*--------      --------*/
void PutCircletoBuf(u8 center_x,u8 center_y,u8 r);
/*--------        5110--------*/
void PutCircle(u8 center_x,u8 center_y,u8 r);
/*----         -----*/
void DrawBmptoBuf(char bitmap[],u8 x,u8 y,u8 width,u8 height);
/*-----           5110------*/
void BufDrawBmp(char bitmap[],u8 x,u8 y,u8 width,u8 height);

#endif /*USE_BUF*/

#endif /*LCD5110_H*/                                                                           				

以下に、この4つの図を生成する主関数を示します.関数の使用方法は簡単にわかります.
#include "stm32f0xx.h"
#include "LCD5110.h"

extern u8 lcd_buf[LCD_X][LCD_Y];

int main(void)
{
	u16 i;
	point p[4];	
	
	p[0].x = 41;
	p[0].y = 1;
	p[1].x = 80;
	p[1].y = 30;
	p[2].x = 49;
	p[2].y = 40;
	p[3].x = 41;
	p[3].y = 1;
	
	InitLcd();

lab:
	
/*-------   buf     ,    ,   ----------------*/
	for(i = 0;i < 6;i++)
		PutIcon((char*)(icon + i),i,0);
	SetXY(13,0);
	for(i = 0;i < 7;i++)
		WriteIcon((char*)(icon + 15 + i));
	PutHanziStr((char*)Hanzi,2,15,4);
	PutStr("oh my god",2,3);
	
	Delayms(2000);
	BufClearAll();

/*--------  buf     (         ,    )----------*/
	BufDrawBmp((char *)girl,0,0,45,48);
	BufPutStr("hello",47,5);
	BufPutStr("ming",49,15);
	PutRect(42,3,40,22);
	BufPutHanzi((char *)(Hanzi+4*32),44,30);
	BufPutHanzi((char *)(Hanzi+4*32),60,30);
	BufPutWideChar('!',76,30);
		
	Delayms(2000);
	BufClearAll();
	
/*--------  buf     (            ,    )----------*/
	DrawBmptoBuf((char *)(icon+16),62,37,10,8);
	DrawBmptoBuf((char *)(icon+16),22,25,10,8);
	DrawBmptoBuf((char *)(icon+17),55,18,10,8);
	DrawBmptoBuf((char *)(icon+17),12,36,10,8);
	PutCircletoBuf(3,20,1);
	PutCircletoBuf(8,20,2);
	PutCircletoBuf(30,20,18);
	PutLinetoBuf(4,2,44,43);
	PutLinetoBuf(68,16,50,38);
	PutPolylinetoBuf(p,3);
	PutRecttoBuf(0,33,28,12);
	PutStrtoBuf("ming",0,8);
	RefreshAll();
		
	Delayms(2000);
	BufClearAll();
	
/*---------    buf     buf  ----------------*/
	BufDrawBmp((char*)SFEFlameBubble,0,0,84,48);
	PutStr("ming",2,1);
	BufClear(30,8,5,3);
	
	Delayms(2000);
	BufClearAll();
	
	goto lab;
}

ソースファイルについては、千行近くあるので、これを貼ることはできません.CSDNの私のリソースの下に置いておきました.ポイントなしでダウンロードしました.プロジェクト全体にあります.中には6*8、8*16のASCII文字ライブラリがあります.大量の記号とピクチャーライブラリがあります.リンクは:http://download.csdn.net/detail/ming1006/4637936Nokia 5110 LCD画点、画線、画矩形、画円