2019-07-26 20:45:49 weixin_38605619 阅读数 42
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3992 人正在学习 去看看 朱有鹏

单片机中常用字库进行oled进行显示。但是怎么显示自己想要的字库呢?
可以先下载http://www.pc6.com/softview/SoftView_101312.html添加链接描述
这个软件打开输入自己要的文字
在这里插入图片描述
点击取模格式有C51和A51格式,看自己需要的格式。
在这里插入图片描述
点击参数设计、其他选项、这里要看自己的显示屏如何设置,横向还是纵向、字写需不需要倒序。
在这里插入图片描述
点阵就生成咯,直接使用就可以了。

2014-04-01 17:25:27 xhy 阅读数 2122
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3992 人正在学习 去看看 朱有鹏
此词库被应用于微信点餐系统的打印机中。
打印输出结果

生成的字库优点

可以完全自定义创建自己的字库:
  • 可自由选择任何字体,宋体,楷体,黑体……
  • 可自定义字体的大小
  • 可自定义需要的字符编码(简体gb2312,gb18030,繁体,韩文,日文……)
  • UNICODE支持
  • 价格便宜,买 Flash ROM,自己写进 Flash ROM就可以了。

创建字体库需要的软件

Windows系统,安装 Python 2.7 和 PIL 库( Python Image Library),下载 Make ROM Font 工具
打开 Windows 命令行,进入取下的代码目录,执行: c:\Python27\python.exe make_font.py -s 23 -c
会在当前目录下产生 cn_font.bin 文件,将此文件烧录到 Flash ROM 中,安装下面的字库格式即可读取。
  • 如果要选择不同的字体,修改 make_chinese_font 中 font_file 指向对应的字体文件;
  • 如果要选择不同的字符编码,修改 make_chinese_font 中 get_glyph_set,添加新的编码;

字库格式

	The format of font.bin: [File Header][Glyphs Table][Glyphs Data]
	File Header: 	BF [2 bytes]
					VersionNumber [1 byte]
					FontHeight [ 1 byte]
					FontWidthMinimum [1 byte]
					FontWidthMaximum [1 byte]
					Glyph Count [2 bytes] 
	Glyphs Table: 	[ data position[2 bytes], width [1 byte] ] x Glyph Count
	Glyphs Data:	(Glyph data) x Actual Glyph count


	GlyphDataSize: (FontWidthMaximum + 7) / 8 x FontHeight / 8

字库使用

初始化字体

	/**
	 * The font info.
	 */
	struct FontInfo
	{
		u32			offset;
		u8			height;
		u8			width_min;
		u8			width_stride;
		u8			glyph_data_size;
		u16			glyph_count;
	};

	typedef unsigned short WCHAR;

	int init_font(struct FontInfo *fontInfo)
	{
		u32 offset = fontInfo->offset;

		// Not font format
		if (FLASH_read_byte(offset + 0) != 'B' && FLASH_read_byte(offset + 1) != 'F')
			return 0;

		// Invalid font lib version.
		if (FLASH_read_byte(offset + FL_OFFSET_VERSION) != FONT_LIB_VERSION)
			return 0;
		fontInfo->height = FLASH_read_byte(offset + FL_OFFSET_HEIGHT);
		fontInfo->width_min = FLASH_read_byte(offset + FL_OFFSET_WIDTH_MIN);
		u8 width_max = FLASH_read_byte(offset + FL_OFFSET_WIDTH_MAX);
		fontInfo->width_stride = get_glyph_stride(width_max);
		fontInfo->glyph_data_size = (((width_max + 7) / 8) * fontInfo->height); //(fontInfo->width_stride + 7) / 8;
		fontInfo->glyph_count = FLASH_read_u16(offset + FL_OFFSET_GLYPH_COUNT);

		return 1;
	}

寻址读字体

在单片机程序中,通过下面的方式寻址读字体:
	/**
	 * Get the glyph by its UCS2 character encoding.
	 *
	 * If it does not exist, return a special glyph.
	 */
	void get_glyph(WCHAR ch, struct Glyph *glyph)
	{
		u32 pos = FL_OFFSET_GLYPH_TABLE + FONT_GLYPH_INFO_SIZE * (u32) ch;
		u16 posHigh = FLASH_read_byte(pos);
		u16 posLow = FLASH_read_byte(pos + 1);
		glyph->width = FLASH_read_byte(pos + 2);
		glyph->data_pos = (posHigh << 8) | posLow;
	}

	void get_glyph_data(struct FontInfo *fontInfo, struct Glyph *glyph, u8 offset, u8 data[MAX_GLYPH_STRIDE])
	{
		u32 FL_OFFSET_GLYPH_DATA = fontInfo->offset + FL_OFFSET_GLYPH_TABLE
				+ fontInfo->glyph_count * (u32) FONT_GLYPH_INFO_SIZE;
		u32 addr = FL_OFFSET_GLYPH_DATA + (u32) (glyph->data_pos) * fontInfo->glyph_data_size + offset;
		FLASH_fast_read(data, addr, get_glyph_stride(glyph->width));
	}


2019-08-10 09:34:38 delphigbg 阅读数 192
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3992 人正在学习 去看看 朱有鹏

1 引 言

  单片机控制的LED、LCD显示屏均涉及到各种字体的汉字显示。建立单片机汉字字库的传统方法有使用硬件字库或者使用UCDOS的点阵字库。这些字库均非矢量字库,大小固定,字体单一,有较大的局限性。且使用起来需要进行换算,比较麻烦。而Windows环境下提供了大量矢量字库,不但字的大小可任意改变,而且字体多种多样,非常丰富,添加新的字库也比较容易。目前越来越多的显示屏需要显示美观多样的文字,因而利用好 Windows环境下丰富的矢量字库资源具有很高的实用价值。但矢量字库不同于点阵字库,且Windows操作系统本身很复杂,对利用其矢量字库带来一些困难。本文介绍一种巧妙的方法,绕过对矢量字库的直接读取,将各种复杂的操作全部交由Windows操作系统自己解决,用户仅需少量程序代码就能轻松使用 Windows环境下所有矢量字库资源。

2 基本原理

  要使单片机能利用Windows的矢量字库,关键在于如何获得矢量字库的点阵信息。要在Windows环境下直接读取矢量字库获得其点阵信息,必须对Windows及矢量字库本身有深入的了解,操作起来较困难。但矢量字库最终仍是以点阵形式送给显示缓冲区,因而完全可以不直接读取字库,而从显示缓冲区中获得点阵信息,再通过一定的程序转化成单片机容易使用的点阵格式,从而达到目的。

3 VB编程实现

3.1 总体思路  

  利用CommonDialog控件,使用Windows环境下的标准字体选择对话框来选择字体。用一个TextBox控件来输入汉字,一个 PictureBox控件贮存屏幕上的汉字点阵信息。调用API函数BitBlt将TextBox中的汉字以位图形式重绘于PictureBox,再使用 Point函数得到其点阵信息,并将其转化成单片机容易使用的格式。

3.2 具体实现

  新建一个工程,加入一个CommonDialog控件,一个TextBox控件,一个PictureBox控件,两个CommandButton控件。
  添入以下代码:
'声明API函数BitBlt
Private Declare Function BitBlt Lib"gdi32"

(ByValhDestDC As Long,ByValx As Long,
ByValy As Long,ByValnWidth As Long,ByVal nHeight

As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,

ByValySrc As Long,ByValdwRop As Long)As Long'

'初始化

Private Sub Form_Load()

Text1.Top=0:Text1.Left=0

Text1.MaxLength=2:Text1.BorderStyle=0

End Sub

'修改字体

Private Sub Command1_Click()

'设置“取消”为True
CommonDialog1.CancelError=True

On Error GoTo ErrHandler

'设置Flags属性
CommonDialog1.Flags=cdlCFEffects or cdlCFBoth

'显示“字体”对话框  

CommonDialog1.ShowFont

Text1.Font.Name=CommonDialog1.FontName

Text1.Font.Size=CommonDialog1.FontSize

Text1.Font.Bold=CommonDialog1.FontBold

Text1.Font.Italic=CommonDialog1.FontItalic

Picture1.Font.Size=CommonDialog1.FontSize
Text1.Width=2*Picture1.TextWidth(Text1.Text)Text1.Height=Picture1.TextHeight(Text1.Text)

Exit Sub
ErrHandler:
'用户按了“取消”按钮[page]

Exit SubEnd Sub
'生成字模
Private Sub Command2_Click()

Dim Wp()As Byte
ReDim Wp(Picture1.TextWidth(Text1.Text)*

Picture1.TextWidth(Text1.Text))As Byte

Dim Nbyte,Q(7)As Integer

Dim Cy,Cx As Integer

Dim Dot As Integer

Dim ZAs Long
Dot=0:Nbyte=0

BrightV=16000000
Z=BitBlt(Picture1.hDC,0,0,300,300,Form1.hDC,1,1,&HCC0020)Picture1.Refresh
For Cy=Picture1.TextHeight(Text1.Text)To 0 Step-1For Cx=Picture1.TextWidth(Text1.Text)To 0 Step-1

Z=Picture1.Point(Cx,Cy)

'得到该点的颜色信息

If Z<BrightV Then 
    Q(Dot)=1'该点为黑

Else

    Q(Dot)=0 '该点为白 
 End If
If Dot=7 Then

   '将8个点的信息存入一个字节中 
  Wp(Nbyte)=Q(7)*128+Q(6)*64+Q(5)*32+Q(4)

*16+Q(3)*8+Q(2)*4+Q(1)*2+Q(0)*1 

    Nbyte=Nbyte+1   

End If 

    Dot=Dot+1 

  If Dot=8 Then Dot=0 
 Next Cx

Next CyEnd Sub

  本程序一次得到两个汉字的点阵信息,存于字节数组WP中。

  由于大多数LED、LCD均为黑白二进制显示形式,没有灰度等级,而Windows环境,特别是Windows 2000的某些字库显示时有灰度变化,因而必须合理选择BrightV的值,才能使生成的点阵信息与屏幕所见的基本一致。本程序采用从右至左,从下到上的扫描方式生成字模,符合一般LED、LCD的显示扫描方式,有利于单片机的编程。

4 结束语

  实践证明本文所介绍的方法能方便地得到Windows环境下矢量字库的字模,满足了单片机显示系统的需要。这种方法不但可以用来生成汉字字模,还可以用来生成各种图形点阵信息。只需将各种图片输入PictureBox即可,从而使单片机可以利用Windows中众多的图形制作软件,显示更加丰富多彩的图形画面。

参考文献

1 李玉东,李罡,李雷.VisualBasic 6.0中文版控件大全.北京:电子工业出版社,2000

2 寿建霞.建立单片机系统汉字字库的一种通用方法.微型电脑应用,1999

2019-03-05 16:19:42 geek_monkey 阅读数 5852
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3992 人正在学习 去看看 朱有鹏

  本文介绍如何把字库文件写入单片机的flash中,然后无需再提取字模,即可实现单片机显示中文字符的功能。

下载字库到单片机flash中的指定位置

  在上一篇博客中,最后留了一个想法,让单片机自带字库。现在就来实现这个想法。
我把用到的编译过的字符放在这里
  我们借助J-Flash软件把bin文件放在单片机flash中的指定位置。
  首先要新建工程,然后根据自己的板子选择型号
在这里插入图片描述
在这里插入图片描述
  然后打开数据文件,找到刚刚下载的bin文件
在这里插入图片描述
在这里插入图片描述
  根据自己单片机的flash大小输入地址,注意这个地址要与代码中的“基地址”一致
在这里插入图片描述
  设置好以后按下快捷键F7
在这里插入图片描述在这里插入图片描述
  成功烧录以后,代码不可以在使用此区域。——一般情况下,你的工程代码也不会大到可以覆盖这个区域。

编写字库显示函数

  函数编写过程就不讲述了,原理都在代码里。有需要的可以自行研究。有一些没有提到的函数,可以参考上一篇博客。
  这是显示字符串的函数

/**
  * @brief 输出12*12的汉字或6*12的字符,函数可以自动识别是中文字符还是ASCII
  * @param 第一个字符的坐标,汉字颜色,背景颜色,需要显示的字符串。背景颜色为0表示不画背景
  * @Note  汉字字模来自于字库,字库是编译好的bin文件,在_DEF_FONT_CH字库的基地址中
  * @retval None
  */
void LCD_DrawFont_GBK12(u16 x, u16 y, u16 fc, u16 bc, char *pStr)
{
	unsigned char xNow,temp_width;
	const u8 *FontModel;
	char ch[2];
	xNow = x;
	while(*pStr)
	{
		ch[0] = *pStr;
		pStr++;
		ch[1] = *pStr;
		if(ch[0] == 10)
		{
			x = xNow;
			y += 12;
		}
		else if(ch[0] < 128)
		{
			temp_width = Get_Model(ch,&FontModel);
			if(x < 128)
				DrawFontModel(x,y,temp_width,FontModel,fc,bc);
			x += temp_width;//下一个字符的横坐标
		}
		else if((ch[0] > 160) && (ch[1] > 160))	//中文
		{
			ch[1] = *pStr;
			temp_width = Get_Model(ch,&FontModel);
			if(x < 128)
				DrawFontModel(x,y,temp_width,FontModel,fc,bc);
				x += temp_width;//下一个字符的横坐标
				pStr++;
		}
	}
}

  这个函数用于显示单个字符

/**
  * @brief 根据传入的参数显示一个字符,可以自动识别是中文还是英文
  * @param 第一个字符的坐标,字符的宽度(中文12英文6),颜色,背景颜色,需要显示的字符串。背景颜色为0表示不画背景
  * @Note  汉字字模来自于字库,字库是编译好的bin文件,在_DEF_FONT_CH字库的基地址中
  *         返回值并不是字库的地址,字库地址是通过指针传递的,也就是说,参数FontModel本身也是返回值
  * @retval None
  */
static void DrawFontModel(u8 xNow,u8 yNow,u8 width,const u8 *FontModel,u16 fc, u16 bc )
{
	u8 bit = 0;
	u8 m = 0xff;
	if(FontModel)//字母为空处理
		m = *FontModel;
	for (u8 y = yNow; y < yNow + 12; y++)//竖着显示,先判断y坐标。
	{
		for(u8 x = xNow; x < xNow + width; x++)//再判断横坐标
		{
			if(x < 128)
			{
				if((m&0x01) == 0x01)
				{
					LCD_DrawPoint(x,y,fc);
				}
				else
				{
					if ((bc!=0)&&(fc!=bc)) LCD_DrawPoint(x,y,bc);
				}
			}
			bit++;
			m >>= 1;//字符循环右移
			if(bit == 8)//一个字节显示完毕,则显示下一个字节
			{
				bit = 0;
				if(FontModel)//空字模处理
				{
					FontModel ++;
          m = *FontModel;
				}
				else
				{
					m = 0xff;
				}
			}
		}
		
	}
}

  这是根据字符的标号,从flash中找到对应字符数组的 函数

/**
  * @brief 获取字模数组的 地址
  * @param 第一个字符的坐标,字符的宽度(中文12英文6),颜色,背景颜色,需要显示的字符串。背景颜色为0表示不画背景
  * @Note  汉字字模来自于字库,字库是编译好的bin文件,在_DEF_FONT_CH字库的基地址中
  * @retval 字模的宽度
  */
static char Get_Model(const char *ch,const u8 **FontModel)
{
	if((ch[0] > 0xA0) && (ch[1] > 0xA0))//中文
	{
		*FontModel = _DEF_FONT_CH + 18 * ((ch[0] - 161) * 94 + ch[1] - 161);//获取此字模的地址
		return 12;
	}
	
	if(*ch >= 0x20)//英文
	{
		*FontModel = _DEF_FONT_EN + 9 * (ch[0] - 0x20);
		return 6;
	}
	*FontModel = _DEF_FONT_EN;//无法匹配,显示空白
		return 0;
}

  GB2312的字符计算是怎么算的?GB2312的编号可以帮助我们找到字符,简单来说,就是GB2312规定对收录的每个字符采用两个字节表示,第一个字节为“高字节”,对应94个区;第二个字节为“低字节”,对应94个位。所以它的区位码范围是:0101-9494。区号和位号分别加上0xA0就是GB2312编码。例如最后一个码位是9494,区号和位号分别转换成十六进制是5E5E,0x5E+0xA0=0xFE,所以该码位的GB2312编码是FEFE。
  这也就是为什么我们的代码中要乘以94了。
  关于GB2312的详细资料可以参考这篇博客
  在主函数中我调用了显示函数:

	ST7735S_CPT144_Initial();
	LCD_BG_Color(GREEN);

	LCD_DrawFont_GBK12(0,0,BLACK,GREEN,"来自geekYatao的博客");
	LCD_DrawFont_GBK12(0,12,BLACK,GREEN,"ABCabc123,.?《》");
	LCD_DrawFont_GBK12(0,24,BLACK,GREEN,"犇鱻羴显示不出来");

  另外我还定义了汉字字符的基地址,与英文字符的数组

extern const u8 _FontLibEn612[];
#define _DEF_FONT_CH     (const u8*)(0x080DC000)  //字库的基地址
#define _DEF_FONT_EN            _FontLibEn612

extern const u8 _FontLibEn612[] = { 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,	// 0x20  
                        0x0,0x40,0x10,0x4,0x41,0x10,0x0,0x1,0x0,	// 0x21 !
                        0x0,0xA5,0x28,0x0,0x0,0x0,0x0,0x0,0x0,	// 0x22 "
                        0x0,0x40,0x51,0x3F,0xA5,0xFC,0x8A,0x2,0x0,	// 0x23 #
                        0x0,0xE1,0x55,0x85,0xC1,0x50,0xD5,0x43,0x0,	// 0x24 $
                        0x0,0x20,0x55,0x8D,0x42,0xB1,0xAA,0x4,0x0,	// 0x25 %
                        0x0,0x40,0x28,0x8A,0x57,0x55,0x89,0xD,0x0,	// 0x26 &
                        0x80,0x20,0x4,0x0,0x0,0x0,0x0,0x0,0x0,	// 0x27 '
                        0x0,0x8,0x21,0x8,0x82,0x20,0x8,0x4,0x2,	// 0x28 (
                        0x80,0x40,0x20,0x8,0x82,0x20,0x8,0x21,0x0,	// 0x29 )
                        0x0,0x0,0x10,0x95,0xE3,0x54,0x4,0x0,0x0,	// 0x2A *
                        0x0,0x40,0x10,0xC4,0x47,0x10,0x4,0x0,0x0,	// 0x2B +
                        0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x20,0x4,	// 0x2C ,
                        0x0,0x0,0x0,0xC0,0x7,0x0,0x0,0x0,0x0,	// 0x2D -
                        0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x0,0x0,	// 0x2E .
                        0x0,0x84,0x20,0x8,0x41,0x8,0x82,0x10,0x0,	// 0x2F /
                        0x0,0xE0,0x44,0x51,0x14,0x45,0x91,0x3,0x0,	// 0x30 0
                        0x0,0x40,0x18,0x4,0x41,0x10,0x84,0x3,0x0,	// 0x31 1
                        0x0,0xE0,0x44,0x11,0x42,0x8,0xC1,0x7,0x0,	// 0x32 2
                        0x0,0xE0,0x44,0x10,0x3,0x41,0x91,0x3,0x0,	// 0x33 3
                        0x0,0x80,0x30,0x8A,0x92,0x78,0x8,0x6,0x0,	// 0x34 4
                        0x0,0xF0,0x5,0xC1,0x3,0x41,0x91,0x3,0x0,	// 0x35 5
                        0x0,0xE0,0x24,0xC1,0x13,0x45,0x91,0x3,0x0,	// 0x36 6
                        0x0,0xF0,0x25,0x8,0x41,0x10,0x4,0x1,0x0,	// 0x37 7
                        0x0,0xE0,0x44,0x91,0x13,0x45,0x91,0x3,0x0,	// 0x38 8
                        0x0,0xE0,0x44,0x51,0xE4,0x41,0x92,0x3,0x0,	// 0x39 9
                        0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x1,0x0,	// 0x3A :
                        0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x41,0x0,	// 0x3B ;
                        0x0,0x8,0x21,0x84,0x40,0x20,0x10,0x8,0x0,	// 0x3C <
                        0x0,0x0,0x0,0x1F,0x0,0x7C,0x0,0x0,0x0,	// 0x3D =
                        0x80,0x40,0x20,0x10,0x8,0x21,0x84,0x0,0x0,	// 0x3E >
                        0x0,0xE0,0x44,0x11,0x42,0x10,0x0,0x1,0x0,	// 0x3F ?
                        0x0,0xE0,0x44,0x59,0x55,0x75,0x81,0x7,0x0,	// 0x40 @
                        0x0,0x40,0x10,0x8C,0xA2,0x78,0xD2,0xC,0x0,	// 0x41 A
                        0x0,0xF0,0x48,0x92,0x23,0x49,0xD2,0x3,0x0,	// 0x42 B
                        0x0,0xE0,0x45,0x41,0x10,0x4,0x91,0x3,0x0,	// 0x43 C
                        0x0,0xF0,0x48,0x92,0x24,0x49,0xD2,0x3,0x0,	// 0x44 D
                        0x0,0xF0,0x49,0x8A,0xA3,0x8,0xD2,0x7,0x0,	// 0x45 E
                        0x0,0xF0,0x49,0x8A,0xA3,0x8,0xC2,0x1,0x0,	// 0x46 F
                        0x0,0xC0,0x49,0x41,0x90,0x47,0x12,0x3,0x0,	// 0x47 G
                        0x0,0x30,0x4B,0x92,0x27,0x49,0xD2,0xC,0x0,	// 0x48 H
                        0x0,0xF0,0x11,0x4,0x41,0x10,0xC4,0x7,0x0,	// 0x49 I
                        0x0,0xE0,0x23,0x8,0x82,0x20,0x48,0x72,0x0,	// 0x4A J
                        0x0,0x70,0x4B,0x8A,0xA1,0x28,0xD2,0xD,0x0,	// 0x4B K
                        0x0,0x70,0x8,0x82,0x20,0x8,0xE2,0xF,0x0,	// 0x4C L
                        0x0,0xB0,0x6D,0xDB,0x56,0x55,0x55,0x5,0x0,	// 0x4D M
                        0x0,0xB0,0x4B,0x96,0xA5,0x69,0xD2,0x5,0x0,	// 0x4E N
                        0x0,0xE0,0x44,0x51,0x14,0x45,0x91,0x3,0x0,	// 0x4F O
                        0x0,0xF0,0x48,0x92,0x23,0x8,0xC2,0x1,0x0,	// 0x50 P
                        0x0,0xE0,0x44,0x51,0x14,0x5D,0x99,0x83,0x1,	// 0x51 Q
                        0x0,0xF0,0x48,0x92,0xA3,0x48,0xD2,0xD,0x0,	// 0x52 R
                        0x0,0xE0,0x45,0x81,0x81,0x40,0xD1,0x3,0x0,	// 0x53 S
                        0x0,0xF0,0x55,0x4,0x41,0x10,0x84,0x3,0x0,	// 0x54 T
                        0x0,0x30,0x4B,0x92,0x24,0x49,0x12,0x3,0x0,	// 0x55 U
                        0x0,0x30,0x4B,0x92,0xA2,0x30,0x4,0x1,0x0,	// 0x56 V
                        0x0,0x50,0x55,0x95,0xA3,0x28,0x8A,0x2,0x0,	// 0x57 W
                        0x0,0xB0,0x29,0xA,0x41,0x28,0xCA,0x6,0x0,	// 0x58 X
                        0x0,0xB0,0x29,0xA,0x41,0x10,0x84,0x3,0x0,	// 0x59 Y
                        0x0,0xF0,0x25,0x8,0x41,0x8,0xD2,0x7,0x0,	// 0x5A Z
                        0x0,0x47,0x10,0x4,0x41,0x10,0x4,0xC1,0x1,	// 0x5B [
                        0x80,0x20,0x8,0x4,0x81,0x20,0x8,0x4,0x0,	// 0x5C '\'
                        0x80,0x83,0x20,0x8,0x82,0x20,0x8,0xE2,0x0,	// 0x5D ]
                        0x0,0xA1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,	// 0x5E ^
                        0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xFC,	// 0x5F _
                        0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,	// 0x60 `
                        0x0,0x0,0x0,0x0,0x23,0x71,0x12,0xF,0x0,	// 0x61 a
                        0x0,0x30,0x8,0x82,0x23,0x49,0x92,0x3,0x0,	// 0x62 b
                        0x0,0x0,0x0,0x0,0x27,0x9,0x2,0x7,0x0,	// 0x63 c
                        0x0,0x80,0x41,0x10,0x27,0x49,0x12,0xF,0x0,	// 0x64 d
                        0x0,0x0,0x0,0x0,0x23,0x79,0x2,0x7,0x0,	// 0x65 e
                        0x0,0x80,0x13,0x84,0x47,0x10,0x84,0x7,0x0,	// 0x66 f
                        0x0,0x0,0x0,0x0,0x2F,0x31,0x82,0x27,0x72,	// 0x67 g
                        0x0,0x30,0x8,0x82,0x23,0x49,0xD2,0xD,0x0,	// 0x68 h
                        0x0,0x40,0x0,0x80,0x41,0x10,0x84,0x3,0x0,	// 0x69 i
                        0x0,0x80,0x0,0x0,0x83,0x20,0x8,0x82,0x1C,	// 0x6A j
                        0x0,0x30,0x8,0x82,0xAE,0x38,0xD2,0xD,0x0,	// 0x6B k
                        0x0,0x70,0x10,0x4,0x41,0x10,0xC4,0x7,0x0,	// 0x6C l
                        0x0,0x0,0x0,0xC0,0x53,0x55,0x55,0x5,0x0,	// 0x6D m
                        0x0,0x0,0x0,0xC0,0x23,0x49,0xD2,0xD,0x0,	// 0x6E n
                        0x0,0x0,0x0,0x0,0x23,0x49,0x12,0x3,0x0,	// 0x6F o
                        0x0,0x0,0x0,0xC0,0x23,0x49,0x92,0x23,0x1C,	// 0x70 p
                        0x0,0x0,0x0,0x0,0x27,0x49,0x12,0x7,0xE1,	// 0x71 q
                        0x0,0x0,0x0,0xC0,0x66,0x8,0xC2,0x1,0x0,	// 0x72 r
                        0x0,0x0,0x0,0x80,0x27,0x30,0x90,0x7,0x0,	// 0x73 s
                        0x0,0x0,0x10,0x84,0x43,0x10,0x4,0x6,0x0,	// 0x74 t
                        0x0,0x0,0x0,0xC0,0x26,0x49,0x12,0xF,0x0,	// 0x75 u
                        0x0,0x0,0x0,0xC0,0x2D,0x29,0xC,0x1,0x0,	// 0x76 v
                        0x0,0x0,0x0,0x40,0x55,0x39,0x8A,0x2,0x0,	// 0x77 w
                        0x0,0x0,0x0,0xC0,0xA6,0x10,0xCA,0x6,0x0,	// 0x78 x
                        0x0,0x0,0x0,0xC0,0x2D,0x29,0xC,0x41,0xC,	// 0x79 y
                        0x0,0x0,0x0,0x80,0x87,0x10,0x84,0x7,0x0,	// 0x7A z
                        0x0,0x86,0x20,0x8,0x81,0x20,0x8,0x82,0x1,	// 0x7B {
                        0x8,0x82,0x20,0x8,0x82,0x20,0x8,0x82,0x20,	// 0x7C |
                        0x80,0x41,0x10,0x4,0x42,0x10,0x4,0x61,0x0,	// 0x7D }
                        0x42,0x89,0x1,0x0,0x0,0x0,0x0,0x0,0x0,	// 0x7E ~
                        0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0	// 0x20  
                        };

效果

  GB2312包含的字符也不是特别多,还有一些生僻字,如犇鱻羴,显示不出来,这个乱码为啥还没时间考虑。以后有兴趣了,可以搞个GBK的编码。想显示一些常用中文字符就不用费劲取字模了。
在这里插入图片描述

2019-08-17 19:31:15 weixin_41534481 阅读数 187
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3992 人正在学习 去看看 朱有鹏

 

假期参加电赛崩了。。。  闲的无聊,准备做一些底层的代码分享一下,也算是给自己磨炼一下吧。

这次做的是Stm32F407ZGT6 驱动LCD12864 的代码 测试的时候使用的是正点原子的探索者 STM32F4开发板、 LCD 插在 清翔的51单片机开发板上  注意 我是用的是 带有中文字库的版本       代码的下载地址在这里

这里注意  驱动LCD  需要给模块一个参考电压  也就是上图的VO  否则LCD 显示会出异常(颜色过深或者过浅) 我也是因为这个

所以才使用了成品开发板的电路

程序是从51单片机的程序上迁移过来的,咱们不做深究,只是注重一些迁移的细节。

以上是三个控制引脚的设置,其实还有几个是 PSB  需要设置,这个是一直拉高  我就没用IO了 就直接接到VCC了

在51中 IO的输入输出是由 C语言的读取和写入决定的, P0 = 0xff  是输出  data = P0是 读取

但是在STM32F407 中确不是这样的,STM32 有自己的输入数出模式, 不同的时刻需要对输入输出的寄存器进行配置。

我的实现过程大概是这样的:

输出和输入分别使用一个函数来实现,函数中有切换 IO输入输出模式的操作 也有 读取和写入的操作

实现了这两个函数以后剩下的代码几乎就可以全部迁移过去了,只要注意一下 函数名称就可以了

 

以上就实现了对LCD12864 的驱动, 我测试用的 LCD是带有中文字库的,显示汉字很方便,至于绘图, 描点、反白、显示数字等等的暂时还没有实现,看心情吧。如果有更新的话后期大家应该可以看得到。

 

更新的代码来了,  我编写了一些常用的显示代码,

大概是这样的  显示int(带符号)  double 还有hex 和bin 

这是显示int 的实现方法(自己写的可能会有bug   我这边测试暂时没有发现问题)

这是显示string的方法,  可以直接显示汉字!

double 的显示比较长。。。。 而且这个代码存在一定的精度的误差 比如你要显示123456.654321  可能实现的不是这个数字!!!

其实 显示 double和 hex  bin 都是先合成一个string  然后在现实string   主要的难点就是合成string了

以上就是显示的过程了

这是显示的效果图  对应于 main中

显示bin的话  LCD的长度不是很够 看着就是比较难受

这是显示 字符串和 int

看起来还凑合  ,  注意使用的时候长度要有一定的富余

 

 

代码大概是这样的,我会上传, 写的比较匆忙 错误支持在做难免,希望您的不吝赐教!

 

代码下载地址

单片机字库建立

阅读数 6506

单片机生成中文PDF

博文 来自: m87260032
没有更多推荐了,返回首页