正点原子显示取模汉字

本文章通过正点原子的视频改动LCD_ShowChar函数,通过PCtoLCD2002取模,实现显示任意大小字符。

下面以‘人’为例,通过PCtoLCD2002取模:

按照正点原子下的LCD例程设设置PCtoLCD2002

以16*16的‘人’进行取模

取的数组为(2字节*16==32字节)

uint8_t ren[32] = {0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0xC0,0x03,0x00,0xFC,0x00,0x03,0x00,0x00,0xC0,0x00,0x30,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x00};

 改装LCD_ShowChar(可以对比原来函数观察差异)

void LCD_ShowChinese(u16 x,u16 y,u8 *num,u8 size,u8 mode)
{  							  
   u8 temp,t1,t;
	u16 y0=y;
	u8 csize=(size/8+((size%8)?1:0))*(size);		//得到字体一个字符对应点阵集所占的字节数	
	for(t=0;t<csize;t++)
	{   
		temp=num[t];
		for(t1=0;t1<8;t1++)
		{			    
			if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
			else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);
			temp<<=1;
			y++;
			if(y>=lcddev.height)return;		//超区域了
			if((y-y0)==size)
			{
				y=y0;
				x++;
				if(x>=lcddev.width)return;	//超区域了
				break;
			}
		}  	 
	}  	    	   	 	  
}   

 使用LCD_ShowChinese函数(记得把数组放在同一.c下)

LCD_ShowChinese(30,150,ren,16,0);

实验现象:

 

 

 

要在LCD1602上显示字符串和汉字,需要先初始化LCD1602,然后将字符和汉字转换为相应的ASCII码并发送到LCD1602的数据端口。以下是一个简单的例子: ```c #include <reg51.h> //定义LCD1602的I/O端口 sbit RS=P2^0; sbit RW=P2^1; sbit EN=P2^2; //向LCD发送一个指令 void LcdWriteCmd(unsigned char cmd) { RS=0; //选择命令模式 RW=0; //选择写入模式 EN=1; //打开使能 P0=cmd; //发送指令 EN=0; //关闭使能 } //向LCD发送一个字符 void LcdWriteData(unsigned char dat) { RS=1; //选择数据模式 RW=0; //选择写入模式 EN=1; //打开使能 P0=dat; //发送数据 EN=0; //关闭使能 } //初始化LCD1602 void InitLcd() { LcdWriteCmd(0x38); //设置16*2显示,5*7点阵,8位数据接口 LcdWriteCmd(0x0c); //设置显示开,光标关,闪烁关 LcdWriteCmd(0x06); //设置文字在显示器上的移动方向,每次写入后光标加1,整屏不移动 LcdWriteCmd(0x01); //清屏 } //显示字符串 void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str) { unsigned char i; if(y==0) LcdWriteCmd(0x80+x); //在第一行显示 else LcdWriteCmd(0xc0+x); //在第二行显示 for (i=0;str[i]!=0;i++) //逐个发送字符 { LcdWriteData(str[i]); } } //显示汉字 void LcdShowChinese(unsigned char x, unsigned char y, unsigned char *str) { unsigned char i; if(y==0) LcdWriteCmd(0x80+x); //在第一行显示 else LcdWriteCmd(0xc0+x); //在第二行显示 for (i=0;str[i]!=0;i+=2) //逐个发送汉字 { LcdWriteData(str[i]); //发送高字节 LcdWriteData(str[i+1]); //发送低字节 } } void main() { InitLcd(); //初始化LCD1602 LcdShowStr(0, 0, "Hello, world!"); //显示字符串 LcdShowChinese(0, 1, "\xba\xba\xd7\xd6\xce\xf6\xb2\xe5\xd0\xde\xcf\xf1"); //显示汉字 while(1); } ``` 在上面的代码中,`\xba\xba\xd7\xd6\xce\xf6\xb2\xe5\xd0\xde\xcf\xf1` 是“你好世界”的ASCII码,需要先将其转换为相应的汉字再发送到LCD1602上。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值