天天看點

nios ii 之5110液晶屏(6*8、8*16 ASCII字元,16*16 漢字,常用圖示,圖案,超全字庫+函數代碼)

上一篇文章給出了5110液晶屏的驅動和基本操作函數,這裡把自己辛苦完成的顯示中英文字元,圖示和圖案的函數代碼和字庫提供出來。

其中字庫和圖案部分來自網上他人提供,還有很大部分是自己做的。網上的字庫并不完整,我将其擴增了,非常全。我的字庫包括:

1.全部 6*8 ASCII 碼字庫

2.22個 6*8 常用符号(sign),包括希臘字母,數學符号,實體機關,移動标志等

3.35個 10*8 常用圖示(icon),包括電池電量,時鐘,鑰匙,火車,樂符,實體符号,播放器按鍵符号等

4.全部 8*16 ASCII碼字庫

5.16*16 漢字,其實就提供了幾個,但是提供字模提取軟體,非常友善

6.12幅點陣位圖,高度為8的倍數

這裡貼出幾個圖,手機拍的,效果不是很好:

nios ii 之5110液晶屏(6*8、8*16 ASCII字元,16*16 漢字,常用圖示,圖案,超全字庫+函數代碼)
nios ii 之5110液晶屏(6*8、8*16 ASCII字元,16*16 漢字,常用圖示,圖案,超全字庫+函數代碼)
nios ii 之5110液晶屏(6*8、8*16 ASCII字元,16*16 漢字,常用圖示,圖案,超全字庫+函數代碼)
nios ii 之5110液晶屏(6*8、8*16 ASCII字元,16*16 漢字,常用圖示,圖案,超全字庫+函數代碼)
nios ii 之5110液晶屏(6*8、8*16 ASCII字元,16*16 漢字,常用圖示,圖案,超全字庫+函數代碼)

至于顯示函數,我提供了多種函數。有顯示6*8和8*16 ASCII碼的,顯示6*8符号,10*8圖示,顯示16*16漢字,顯示高度為8倍數的位圖。顯示函數提供了需要坐标和不需要坐标的兩種,這樣可以不需要自己計算要在哪顯示(即緊接着顯示),對于字元串和漢字句子可以自動換行。代碼比較多,不過我都注釋了,應該不難了解。廢話不多說,下面貼出代碼:

頭檔案:

#ifndef LCD_5110_SOLUTION_H_
#define LCD_5110_SOLUTION_H_

#define CMD		0x00
#define DATA	0x01
#define LCD_X	84
#define LCD_Y	48

#include<system.h>
#include<alt_types.h>
#include<altera_avalon_pio_regs.h>
#include<unistd.h>
#include"Font6_8.h"
#include"Icon10_8.h"
#include"Font8_16.h"
#include"Font16_16.h"
#include"Bitmap.h"
//write a byte
void LcdWrite(alt_u8 data,alt_u8 d_c);
//initial the 5110
void InitLcd();
//set the position of x axis and y axis
void SetXY(alt_u8 x,alt_u8 y);
//clear screen
void LcdClearAll();
//write a char(6*8),don't need coordinates
void WriteChar(alt_u8 value);
//write a char(6*8),need coordinates
void PutChar(alt_u8 value,alt_u8 x,alt_u8 y);
//write a string(6*8),don't need coordinates
void WriteStr(char * str);
//write a string(6*8),need coordinates,auto line breaks
void PutStr(char * str,alt_u8 x,alt_u8 y);
//draw a sign(6*8),don't need coordinates
void WriteSign(char * sign);
//draw a sign(6*8),need coordinates
void DrawSign(char * sign,alt_u8 x,alt_u8 y);
//draw a sign(10*8),don't need coordinates
void WriteIcon(char * icon);
//draw a sign(10*8),need coordinates,x is between 0 and 74
void DrawIcon(char * icon,alt_u8 x,alt_u8 y);
//write a char(8*16)
void WriteChar_8_16(alt_u8 value,alt_u8 x,alt_u8 y);
//write a string(8*16),auto line breaks,x is between 0 and 76
void WriteStr_8_16(char * str,alt_u8 x,alt_u8 y);
//write a Chinese character(16*16)
void WriteHanzi(char * Hanzi,alt_u8 x,alt_u8 y);
//write a Chinese sentence(16*16),auto line breaks,x is between 0 and 58
void WriteHanziStr(char * Hanzi,alt_u8 x,alt_u8 y,alt_u8 num);
//draw a picture(84*48),don't need coordinates
void DrawPicture(char bitmap[]);
//draw a picture(width*height(a multiple of 8)),need coordinates
void DrawBitmap(char bitmap[],alt_u8 x,alt_u8 y,alt_u8 width,alt_u8 height);

#endif /* LCD_5110_SOLUTION_H_ */
           

源檔案:

#include"lcd_5110_solution.h"

/*				以下是基本操作和初始化函數				*//
//write a byte
void LcdWrite(alt_u8 data,alt_u8 d_c)
{
	alt_u8 i;
	//chose the chip
	IOWR_ALTERA_AVALON_PIO_DATA(SCE_BASE, 0x00);
	//chose data mode or command mode
	IOWR_ALTERA_AVALON_PIO_DATA(D_C_BASE, d_c);
	//sent 8 bits
	for(i = 0;i < 8;i ++)
	{
		IOWR_ALTERA_AVALON_PIO_DATA(SCLK_BASE, 0x00);
		IOWR_ALTERA_AVALON_PIO_DATA(SDIN_BASE, data >> (7 - i));
		IOWR_ALTERA_AVALON_PIO_DATA(SCLK_BASE, 0x01);
	}
	//release the chip
	IOWR_ALTERA_AVALON_PIO_DATA(SCE_BASE, 0x01);
}
//initial the 5110
void InitLcd()
{
	usleep(1000);
	//sent a reset pulse(low) to reset all internal registers
	IOWR_ALTERA_AVALON_PIO_DATA(REST_BASE, 0x00);
	usleep(1);
	IOWR_ALTERA_AVALON_PIO_DATA(REST_BASE, 0x01);
	usleep(1);
	//chose the chip
	IOWR_ALTERA_AVALON_PIO_DATA(SCE_BASE, 0x00);
	usleep(1);
	//release the chip
	IOWR_ALTERA_AVALON_PIO_DATA(SCE_BASE, 0x01);
	usleep(1);
	//function set PD = 0 and V = 0, select extended instruction set(H = 1 mode)
	LcdWrite(0x21,CMD);
	//set VOP: VOP is set to a + 65 × b [V]
	LcdWrite(0xbf,CMD);
	//RECOMMENDED MUX RATE(1:24),you can chose other MUX RATE
	LcdWrite(0x15,CMD);
	//function set PD = 0 and V = 0, select normal instruction set(H = 0 mode)
	LcdWrite(0x20,CMD);
	//display control set normal mode (D=1andE=0)
	LcdWrite(0x0c,CMD);
	//clear screen
	LcdClearAll();
}
//set the x axis and y axis
void SetXY(alt_u8 x,alt_u8 y)
{
	if(x > 83) x = 0;
	if(y > 5) y = 0;
	//set y axis
	LcdWrite(0x40 | y,CMD);
	//set y axis
	LcdWrite(0x80 | x,CMD);
}
//clear all screen
void LcdClearAll()
{
	alt_u16 i;
	SetXY(0,0);
	//write space continually
	for(i = 0;i < LCD_X * LCD_Y / 8;i ++)
	{
		LcdWrite(0,DATA);
	}
}

/*				以下是高度為8的各種操作函數				*//
//*			包括6*8字元和字元串,6*8符号,10*8圖示			   *//
//every row contains 14 characters,there are 6 rows (font = 6 * 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
/
//write a character(6*8),don't need coordinates
void WriteChar(alt_u8 value)
{
	alt_u8 i;
	for(i = 0;i < 6;i ++)
	LcdWrite(ASCII_6_8[value - 0x20][i],DATA);
}
//write a char(6*8),need coordinates
void PutChar(alt_u8 value,alt_u8 x,alt_u8 y)
{
	if(x > 13) x = 0;
	SetXY(6 * x,y);
	WriteChar(value);
}
//write a string(6*8),don't need coordinates
void WriteStr(char * str)
{
	while(*str)
	{
		WriteChar(*str ++);
	}
}
//write a string(6*8),need coordinates,auto line breaks
void PutStr(char * str,alt_u8 x,alt_u8 y)
{
	if(x > 13) x = 0;
	SetXY(6 * x,y);
	WriteStr(str);
}
//draw a sign(6*8),don't need coordinates
void WriteSign(char * sign)
{
	alt_u8 i;
	for(i = 0;i < 6;i ++)
	LcdWrite(sign[i],DATA);
}
//draw a sign(6*8),need coordinates
void DrawSign(char * sign,alt_u8 x,alt_u8 y)
{
	SetXY(x,y);
	WriteSign(sign);
}
//draw a sign(10*8),don't need coordinates
void WriteIcon(char * icon)
{
	alt_u8 i;
	for(i = 0;i < 10;i ++)
	LcdWrite(icon[i],DATA);
}
//draw a sign(10*8),need coordinates,x is between 0 and 74
void DrawIcon(char * icon,alt_u8 x,alt_u8 y)
{
	//if need line breaks
	if(x > 74)
	{
		x = 0;
		y += 1;
	}
	SetXY(x,y);
	//draw a sign(10*8)
	WriteIcon(icon);
}

/*				以下是高度為16的各種操作函數				*//
//*		    	      包括8*16字元和字元串,16*16漢字		           *//
//every row contains 10 characters,there are 3 rows (font = 8 * 16)//
///
/       x       ///
		//0 1 2 3 ... 81 82 83//	y = 0
		//0 1 2 3 ... 81 82 83//
		//0 1 2 3 ... 81 82 83//	y = 1
		//0 1 2 3 ... 81 82 83//
		//0 1 2 3 ... 81 82 83//	y = 2
		//0 1 2 3 ... 81 82 83//
///
//write a char(8*16)
void WriteChar_8_16(alt_u8 value,alt_u8 x,alt_u8 y)
{
	alt_u8 i;
	//draw the first row
	SetXY(x,y * 2);
	for(i = 0;i < 8;i ++)
		LcdWrite(ASCII_8_16[value - 0x20][i],DATA);
	//draw the second row
	SetXY(x,y * 2 + 1);
	for(i = 8;i < 16;i ++)
		LcdWrite(ASCII_8_16[value - 0x20][i],DATA);
}
//write a string(8*16),auto line breaks,x is between 0 and 76
void WriteStr_8_16(char * str,alt_u8 x,alt_u8 y)
{
	alt_u8 i = 0;
	while(*str)
	{
		//if need line breaks
		if(x + (8 * i) > 76)
		{
			x = 0;
			i = 0;
			y += 2;
		}
		//write a char(8*16)
		WriteChar_8_16(*str,x + (8 * i),y);
		str ++;
		i ++;
	}
}
//every row contains 5 characters,there are 3 rows (font = 16 * 16)//
///
/       x       ///
		//0 1 2 3 ... 81 82 83//	y = 0
		//0 1 2 3 ... 81 82 83//
		//0 1 2 3 ... 81 82 83//	y = 1
		//0 1 2 3 ... 81 82 83//
		//0 1 2 3 ... 81 82 83//	y = 2
		//0 1 2 3 ... 81 82 83//
///
//write a Chinese character(16*16)
void WriteHanzi(char Hanzi[],alt_u8 x,alt_u8 y)
{
	alt_u8 i;
	//write the first row
	SetXY(x,y * 2);
	for(i = 0;i < 16;i ++)
	LcdWrite(Hanzi[i],DATA);
	//write the second row
	SetXY(x,2 * y + 1);
	for(i = 16;i < 32;i ++)
		LcdWrite(Hanzi[i],DATA);
}
//write a Chinese sentence(16*16),auto line breaks,x is between 0 and 58
void WriteHanziStr(char Hanzi[],alt_u8 x,alt_u8 y,alt_u8 num)
{
	alt_u8 num_i,i = 0;
	for(num_i = 0;num_i < num;num_i ++)
	{
		//if need line breaks
		if(x + (16 * num_i) > 58)
		{
			x = 0;
			i = 0;
			y += 1;
		}
		//write a Chinese character(16*16)
		WriteHanzi(Hanzi + 32 * num_i,x + (16 * i),y);
		i ++;
	}
}

/*				以下是畫圖的各種操作函數				*//
//*		    	      包括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
/
//draw a picture(84*48),don't need coordinates
void DrawPicture(char bitmap[])
{
	alt_u16 i;
	for(i = 0;i < LCD_X * LCD_Y / 8;i ++)
		LcdWrite(bitmap[i],DATA);
}
//draw a picture(width*height(a multiple of 8)),need coordinates
void DrawBitmap(char bitmap[],alt_u8 x,alt_u8 y,alt_u8 width,alt_u8 height)
{
	alt_u8 width_i,height_i;
	//draw the height_i row
	for(height_i = 0;height_i < height / 8;height_i ++)
	{
		SetXY(x,y + height_i);
		//draw a row(width column)
		for(width_i = 0;width_i < width;width_i ++)
		{
			LcdWrite(bitmap[width_i + height_i * width],DATA);
		}
	}
}
           

主函數:

#include"lcd_5110_solution.h"
#include<stdio.h>
int main()
{
	char i;
	int readdata;
	InitLcd();
	while(1)
	{
		scanf("%d",&readdata);
		switch(readdata)
		{
			case 1:	LcdClearAll();
					PutChar('+',0,1);
					WriteChar('1');
					PutStr("023456 {}[]|?`~@",0,2);
					break;
			case 2:	LcdClearAll();
					DrawSign(sign[1],1,3);
					break;
			case 3:	LcdClearAll();
					for(i = 0;i < 8;i ++)
					{
						DrawIcon(icon[i],70,0);
						usleep(250000);
					}
					break;
			case 4:	LcdClearAll();
					WriteHanziStr(Hanzi,10,0,4);
					WriteStr_8_16("ming1006",10,1);
					break;
			case 5: LcdClearAll();
					DrawBitmap(girl,20,0,45,48);
					break;
			case 6: LcdClearAll();
					DrawBitmap(apple,20,0,45,48);
					break;
			case 7:	LcdClearAll();
					for(i = 0;i < 22;i ++)
					{
						DrawSign(sign[i],15 * (i % 5),i / 5);
					}
					break;
			case 8:	LcdClearAll();
					for(i = 0;i < 35;i ++)
					{
						DrawIcon(icon[i],15 * (i % 6),i / 6);
					}
					break;
		}
	}
	return 0;
}
           

頭檔案中的字庫因為實在太多了,這個地方放不下,我放在我CSDN資源裡,大家可以免費去下,對了,我把整個工程也打包下,初學者可以參考下,嘿嘿,不過寫得不是很專業啦!還請多多指教啊!

CSDN資源網址:單要字庫這裡 http://download.csdn.net/detail/ming1006/4048090點選打開連結

完整工程再加字庫的這裡 http://download.csdn.net/detail/ming1006/4048142點選打開連結