当前位置: 代码迷 >> 单片机 >> C51驱动QC12864b显示汉字,该怎么处理
  详细解决方案

C51驱动QC12864b显示汉字,该怎么处理

热度:241   发布时间:2016-04-28 14:45:50.0
C51驱动QC12864b显示汉字
我最近刚刚学单片机,找人借了快QC12864b想显示汉字,但折腾了一天多还没弄出来,我查了资料,这个是带字库的,但不晓得怎样弄,使用说明也有,试了半天没反应,希望哪位高手教一下显示汉字的步骤,感谢了。
------解决思路----------------------
找液晶厂家要例程,或者上厂家的网站上,一般都有相应的例程下载的
------解决思路----------------------
字库一般都是个文件 按照你要显示汉字的编码索引(可能不同方式) 找到相应的数据位置,根据汉字大小读取里面的数据,然后按照点阵的方式发到屏幕上就可以了。
可以自己写函数,如果有现成的 可以直接用,但要明白原理,这样遇到问题也好解决。
------解决思路----------------------
网上找例程,先尝试点亮几个点,画条线什么的,然后再开始显示数字,汉字,
------解决思路----------------------
首先看看该模块的说明文档 再看例程代码就能懂了
------解决思路----------------------
#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++]);


}
  相关解决方案