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++]);
}
}