C51驱动QC12864b显示汉字

狂_野_战_车 2012-11-16 11:19:46
我最近刚刚学单片机,找人借了快QC12864b想显示汉字,但折腾了一天多还没弄出来,我查了资料,这个是带字库的,但不晓得怎样弄,使用说明也有,试了半天没反应,希望哪位高手教一下显示汉字的步骤,感谢了。
...全文
840 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
longzhishen 2015-03-10
  • 打赏
  • 举报
回复
关于无法显示中文,可能跟这个程序有关 void hzkdis(unsigned char *s) ---〉unsigned char 如果写成 char *s 就无法显示中文 { while(*s > 0) { write_data(*s); s++; delay_ms(50); } }
扁扁1010 2013-07-24
  • 打赏
  • 举报
回复
请问你这LCD 显示汉字的问题解决没有。我现在也是用的跟你一样的LCD 你能把你的程序和硬件连接告诉我吗?谢谢了
doyouknowm 2012-11-22
  • 打赏
  • 举报
回复
#include<reg52.h>
#define uchar unsigned char
sfr WDT_CONTR=0x0C1;
/***********************端口定义*************************/
#define DAT P1					
sbit RS=P3^5;
sbit RW=P3^4;
sbit E=P3^3;

int inBUF=0;  //接收标志,用以显示工作状态
int newBUF=0;	//初始化为1,用于显示开机
int newflag=1;  //用于检测开机时发出的第一个字符,延时用

/***********************函数声明*************************/
void busy();
void write(bit,uchar);
void INIT_LCD();
void display(bit ,uchar *dat);	 //参考帮助文档 c235 error 
void displayzt(uchar *dat);

/*UART接收,使用中断方式*/
void inteReceive (void) interrupt 4 using 1
{
	if(RI == 1)
	{
		RI = 0;	
		inBUF=SBUF;
		newBUF=1;	
	}
}
//单字符发送
void sendChar(unsigned char ch)
{
	SBUF = ch;
	while(TI == 0);
	TI = 0;
}

/*22.1184MHZ下精确延时1ms*/
void delayms(unsigned int n) 
{
	 unsigned int i,j;
	 for(i=0;i<n;i++)
	 	for(j=0;j<2000;j++)
		{
		WDT_CONTR=0x3F;
		}
}

/*void delay10us(unsigned int n) 
{
	 unsigned int i,j;
	 for(i=0;i<n;i++)
	 	for(j=0;j<11;j++)
		{
		}
}
 */
/***********************主函数****************************/
void main()
{
	int timeus=0;   //计时标志
	int times=0;    //
	WDT_CONTR=0x3F;

	SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
	TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
//	PCON = 0x00; //SMOD=0;
	TH1 = 0xfd; //Baud:19200 fosc=22.1184MHz
	IE = 0x90; //interrupt enable
	TR1 = 1; //Run

	INIT_LCD();
	display(0,"XXXXXXXX");
	display(1,"XXXX:XX..");	 

	while(inBUF!=170);
	{
	  WDT_CONTR=0x3F;  //清看门狗
	}

	while(1)
	{
	  WDT_CONTR=0x3F;  //清看门狗

	///////////////用于计时/////////////////////////
	  timeus++;
	  if(timeus>2001)
	  {
	  	times++;
		timeus=0;
		if(times>10000)  //计时约30秒,显示异常
	  	{
			newBUF=1;
			inBUF=85;
			times=0;	
	  	}
	  }
	 ///////////////用于计时///////////////////////// 


	  if(newBUF)
	  {
	  	  if(newflag)
		  {
		  	delayms(8000);
			newflag=0;
		  }
		  switch(inBUF)
		  {
		  	
			case 102:  //0x66
		  		displayzt("缺纸..");
				delayms(10000);
				newBUF=0;
				times=0;
				break;
			case 119:  //0x77
		  		displayzt("卡纸..");
				delayms(10000);
				newBUF=0;
				times=0;
				break;
			case 136:  //0x88
		  		displayzt("缺墨..");
				delayms(10000);
				newBUF=0;
				times=0;
				break;
			case 153:  //0x99
		  		displayzt("打印错");
				delayms(10000);
				newBUF=0;
				times=0;
				break;
			default:
				//displayzt("指令错");
				break;
		   } //switch
	  } //new 
	}//while
}


/*********************检测忙信号************************/
void busy()
{
	unsigned char read;
        do{
         DAT=0xff;
         RS=0;
         RW=1;
         E=1;
         read=DAT;
	     E=0;
        }while((read&0x80)!=0);
} 
/**************写数据(1)与命令函数(0)****************/
void write(bit data_comm,uchar content)
{
	busy();
	if(data_comm) RS=1;
	else RS=0;
	RW=0;
	E=1;
	delayms(1);
	DAT=content;
	delayms(1);
	E=0;
}
/*******************初始化函数**************************/
void INIT_LCD()
{
//	delayms(100);
	write(0,0x30);
//	delayms(1);
	write(0,0x30);
//	delayms(1);
	write(0,0x0c);
//	delayms(1);
	write(0,0x01);
//	delayms(1);
	write(0,0x06);		
}
/**************显示(汉字)函数(用指针)**************/
void display(bit hang,uchar *dat)
{
	uchar i=0;
	if(hang) write(0,0x90);		//第二行显示 hang(1)
	else write(0,0x80);			//第一行显示 hang(0)
	while(dat[i]!=0)
	{
	  write(1,dat[i++]);
	} 

}

void displayzt(uchar *dat)
{
	uchar i=0;
	write(0,0x95);		//第二行显示 hang(1)
	while(dat[i]!=0)
	{
	  write(1,dat[i++]);
	} 

}
woshi_ziyu 2012-11-18
  • 打赏
  • 举报
回复
首先看看该模块的说明文档 再看例程代码就能懂了
狂_野_战_车 2012-11-18
  • 打赏
  • 举报
回复
谢谢大家的建议,我来试试。
zhenghn2010 2012-11-16
  • 打赏
  • 举报
回复
字库一般都是个文件 按照你要显示汉字的编码索引(可能不同方式) 找到相应的数据位置,根据汉字大小读取里面的数据,然后按照点阵的方式发到屏幕上就可以了。 可以自己写函数,如果有现成的 可以直接用,但要明白原理,这样遇到问题也好解决。
yhgfriend 2012-11-16
  • 打赏
  • 举报
回复
找液晶厂家要例程,或者上厂家的网站上,一般都有相应的例程下载的
wudianjun2001 2012-11-16
  • 打赏
  • 举报
回复
网上找例程,先尝试点亮几个点,画条线什么的,然后再开始显示数字,汉字,

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧