刚学液晶操作,写个了程序,目的是在屏幕左上角写“A”“B”两个字符。 但意向不到的情况出现了,下面是代码,图片是运行结果 请各位帮看看,到底是哪里写错了?才出现这种情况 #include <reg52.h> #include <stdlib.h> #include <intrins.h> #include <stdio.h> #include <math.h> #define uchar unsigned char #define uint unsigned int /********************引脚定义********************/ #define DataPort P1 //LCD128*64 I/O 信号管脚 sbit CS1=P2^0; //左片选 sbit CS2=P2^1; // 右片选 sbit RS=P2^2; //数据指令 sbit RW=P2^3; //读写 sbit E=P2^4; //使能 //uchar Page; //页 地址 //uchar Col; //列 地址 unsigned char code ASC_5x7[] ={ 0x32, 0x49, 0x79, 0x41, 0x3E, //@ 0x7E, 0x11, 0x11, 0x11, 0x7E, //A 0x41, 0x7F, 0x49, 0x49, 0x36, //B 0x3E, 0x41, 0x41, 0x41, 0x22, //C 0x41, 0x7F, 0x41, 0x41, 0x3E, //D 0x7F, 0x49, 0x49, 0x49, 0x49, //E 0x7F, 0x09, 0x09, 0x09, 0x01, //F 0x3E, 0x41, 0x41, 0x49, 0x7A, //G 0x7F, 0x08, 0x08, 0x08, 0x7F, //H 0x00, 0x41, 0x7F, 0x41, 0x00, //I 0x20, 0x40, 0x41, 0x3F, 0x01, //J 0x7F, 0x08, 0x14, 0x22, 0x41, //K 0x7F, 0x40, 0x40, 0x40, 0x40, //L 0x7F, 0x02, 0x0C, 0x02, 0x7F, //M 0x7F, 0x06, 0x08, 0x30, 0x7F, //N 0x3E, 0x41, 0x41, 0x41, 0x3E, //O };
/********************函数定义*******************/ void Delay(uint ms); //延时 void Locatexy(void); //将屏幕横向0-12纵向0-7转换成左、右屏的的X、Y void WriteCommand( uchar CommandByte ); //写指令 void WriteData( uchar DataByte ); //写数据 void LcmClear( void ); //清屏 void LcmInit( void ); //初始化
/***************************/ /* 写指令 */ /***************************/ void WriteCommand( uchar CommandByte ) { E = 0; CS1=0; //设置片选
RS = 0; //指令 RW = 0; DataPort = CommandByte; E = 1; Delay(2);
E = 0;
Delay(2); CS1=1; //设置片选 }
/***************************/ /* 写数据 */ /***************************/ void WriteData( uchar DataByte ) { E = 0; CS1=0; //设置片选 RS = 1; /*数据输出*/ RW = 0; /*写输出 */ DataPort = DataByte; /*数据输出到数据口 */ E = 1; /*写入到LCM*/ Delay(2); E = 0; Delay(2);
CS1=1; //设置片选
} /***************************/ /* 清屏 */ /***************************/ void LcmClear( void ) { uchar Page;uchar Col; Page = 0; Col = 0; for(Page=0;Page<8;Page++) { for(Col=0;Col<64;Col++) { WriteData(0x00); }
WriteCommand(0x0B8+Page); //设置页X,DataByte=1011,1???(?为X地址) } }
/***************************/ /* 初始化 */ /***************************/ void LcmInit( void ) {
WriteCommand(0x3f); //开显示 WriteCommand(0x0C0); //设置起始地址行DataByte=11??,???? (?为起始行0-63) WriteCommand(0x40); //设置AddressY,DataByte=01??,???? (?为Y 地址) WriteCommand(0x0B8); //设置页X,DataByte=1011,1??? (?为X地址)
LcmClear(); } /***************************/ /* 延时 */ /***************************/ void Delay(uint MS) { uchar us,usn; while(MS!=0) { usn = 2; //for 12M while(usn!=0) { us=0xf6; while (us!=0){us--;}; usn--; } MS--; } } /***************************/ /* 写一个字符 */ /***************************/ void PutAsc( uchar asc ) { uchar j; uint x; x = 5*(asc-32);//asc为字模的位置,32.Means从@、A、B、C、D…O、……开始取字模 for(j=0;j<5;j++) //每个字模是5列数 { WriteData(ASC_5x7[x]);//x为字模数组中的位置 x++; } }
void Main( void ) { LcmInit(); PutAsc(33);//显示A PutAsc(34);//显示B while(1); } |