⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shiyan.c

📁 刚做的89C51驱动12864液晶显示字符&汉字 刚做的89C51驱动12864液晶显示字符&汉字
💻 C
字号:
#include <reg51.h>
#include <intrins.h>

#define GDM12864ADataPort P1 //LCD数据线

sbit DI=P2^2; // 数据\指令 选择
sbit RW=P2^1; // 读\写 选择
sbit EN=P2^0; // 读\写使能
sbit cs1=P2^4; // 片选1
sbit cs2=P2^3; // 片选2

unsigned char i,j,t;

/*--------函数列表-------*/

/*----------------------------------------------------------------------------------------------------*/
//状态检查
void CheckState()
{
   unsigned char dat;
   DI=0;
   RW=1;
   do{
      GDM12864ADataPort=0x00;
      EN=1; 
	  dat=GDM12864ADataPort;
      EN=0;
      dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
      }while(!(dat==0x00));
     }
/*-----------------------------------------------------------------------------------------------------*/
//向LCD发送命令
//command :命令
SendCommandToLCD(unsigned char command)
{
   CheckState();
   RW=0;
   GDM12864ADataPort=command;
   EN=1; EN=0;
}
/*----------------------------------------------------------------------------------------------------*/
//写显示数据
//dat:显示数据
void WriteByte(unsigned char dat)
{
   CheckState();
   DI=1; RW=0;
   GDM12864ADataPort=dat;
   EN=1; EN=0;
  }
/*----------------------------------------------------------------------------------------------------*/
//读显示数据
unsigned char ReadByte()
{
   unsigned char dat;
   CheckState();
   DI=1; RW=1;
   GDM12864ADataPort=0xff;
   EN=1; dat=GDM12864ADataPort; EN=0;
   return(dat);
  }
/*----------------------------------------------------------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(unsigned char line)
{
  line=line & 0x07; // 0<=line<=7
  line=line|0xb8; //1011 1xxx
  SendCommandToLCD(line);
}
/*----------------------------------------------------------------------------------------------------*/
//设定列地址--Y 0-63
void SetColumn(unsigned char column)
{
  column=column &0x3f; // 0=<column<=63
  column=column | 0x40; //01xx xxxx
  SendCommandToLCD(column);
}
/*----------------------------------------------------------------------------------------------------*/
//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--63
{
  startline=startline & 0x07;
  startline=startline|0xc0; //1100 0000
  SendCommandToLCD(startline);
 }
/*----------------------------------------------------------------------------------------------------*/
//开关显示
void SetOnOff(unsigned char onoff)
{
onoff=0x3e | onoff; //0011 111x
SendCommandToLCD(onoff);
}
/*---------------------------------------------------------------------------------------------------*/
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(unsigned char screen)
{ //cs1: 1--左; cs2: 1--右
   switch(screen)
   { case 0: cs1=0;//全屏
             _nop_(); _nop_(); _nop_(); 
             cs2=0; 
             _nop_(); _nop_(); _nop_(); 
             break; 
     case 1: cs1=0;//左屏
             _nop_(); _nop_(); _nop_(); 
             cs2=1;
             _nop_(); _nop_(); _nop_(); 
             break;
     case 2: cs1=1;//右屏
             _nop_(); _nop_(); _nop_(); 
             cs2=0;
             _nop_(); _nop_(); _nop_(); 
             break;
   }
}
/*---------------------------------------------------------------------------------------------------*/
//延时
GDM12864delay()
   {
    unsigned int i=500;
    while(i--) {;}
    }

/*---------------------------------------------------------------------------------------------------*/
//清屏
//screen: 0-全屏,1-左屏,2-右
void ClearScreen(unsigned char screen)
   { unsigned char i,j;
     SelectScreen(screen);
     for(i=0;i<8;i++){
	        SetLine(i);
              for(j=0;j<128;j++){
                          WriteByte(0x00);
                           }
                     }
					 
    }
/*---------------------------------------------------------------------------------------------------*/
//初始化LCD
void InitLCD() 
{ unsigned char i=250; //延时
while(i--);

SelectScreen(0);
SetOnOff(0); //关显示

ClearScreen(0);//清屏

SelectScreen(0);
SetOnOff(1); //开显示
SelectScreen(0);
SetStartLine(0); //开始行:0
}
/*----------------------------------------------------------------------------------------------------*/



/*----------------------------------------------------------------------------------------------*/
unsigned char code ASC[]={
/*.--0x2E	*/
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,

/*'/'--0x2F	  */
     0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x00,
     0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,

/*0--0x30	*/
	 0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00,
     0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,

/*1--0x31	*/
	 0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,
     0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,

/*2--0x32	*/
	 0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00,
     0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,

/*3--0x33	*/
	 0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,
     0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,

/*4--0x34	*/
	 0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00,
     0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,

/*5--0x35	*/
	 0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00,
     0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,

/*6--0x36	*/
	 0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00,
     0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,

/*7--0x37	*/
	 0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00,
     0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,

/*8--0x38	*/
	 0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,
     0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,

/*9--0x39	*/
	 0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00,
     0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00
};
/*----------------------------------------------------------------------------------------------*/
#define  CB6AB  0x0000    /*东  */
#define  CC4CF  CB6AB+32  /*南  */
unsigned char code Hztable[]={
/*东  CB6AB	0	*/
     0x00,0x04,0x04,0xC4,0xB4,0x8C,0x87,0x84,
     0xF4,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
     0x00,0x00,0x20,0x18,0x0E,0x04,0x20,0x40,
     0xFF,0x00,0x02,0x04,0x18,0x30,0x00,0x00,
/*南 CC4CF	1	*/
	 0x04,0x04,0xE4,0x24,0x24,0x64,0xB4,0x2F,
     0x24,0xA4,0x64,0x24,0x24,0xE6,0x04,0x00,
     0x00,0x00,0x7F,0x04,0x05,0x05,0x05,0x7F,
     0x05,0x05,0x05,0x25,0x44,0x3F,0x00,0x00,
/*大        2   */
     0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,
	 0xA0,0x20,0x20,0x20,0x20,0x30,0x20,0x00,
     0x00,0x40,0x40,0x20,0x10,0x0C,0x03,0x00,
	 0x01,0x06,0x08,0x10,0x20,0x60,0x20,0x00,
/*学        3   */
     0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,
	 0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,
     0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,
	 0x06,0x05,0x04,0x04,0x04,0x06,0x04,0x00,
/*信        4   */
     0x80,0x40,0x20,0xF8,0x07,0x24,0x24,0x24,
	 0x25,0x26,0x24,0x24,0xB4,0x26,0x04,0x00,
     0x00,0x00,0x00,0xFF,0x00,0x01,0xFD,0x45,
	 0x45,0x45,0x45,0x45,0xFD,0x01,0x00,0x00,
/*息        5   */
     0x00,0x00,0x00,0xFC,0xA4,0xA6,0xA5,0xA4,
	 0xA4,0xA4,0xA4,0xFE,0x04,0x00,0x00,0x00,
     0x40,0x30,0x00,0x77,0x84,0x84,0x8C,0x94,
	 0xB4,0x84,0x84,0xE7,0x00,0x10,0x60,0x00,

     0x24,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00,
	 0x24,0x48,0x00,0xFF,0x00,0x80,0x00,0x00,
     0x10,0x08,0x06,0x01,0xFF,0x00,0x01,0x02,
	 0x02,0x02,0x02,0xFF,0x01,0x01,0x01,0x00,

     0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,
	 0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,
     0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,
	 0x06,0x05,0x04,0x04,0x04,0x06,0x04,0x00,

/*工        6   */
     0x00,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,
	 0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,
     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,
	 0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,
/*程        7   */
     0x24,0x24,0xA4,0xFE,0xA3,0x22,0x20,0x7E,
	 0x42,0x42,0x42,0x42,0x42,0x7F,0x02,0x00,
     0x08,0x06,0x01,0xFF,0x00,0x43,0x41,0x49,
	 0x49,0x49,0x7F,0x49,0x4D,0x69,0x41,0x00,
/*学        8   */
     0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,
	 0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,
     0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,
	 0x06,0x05,0x04,0x04,0x04,0x06,0x04,0x00,
/*院        9   */
     0x00,0xFE,0x22,0x5A,0x96,0x0C,0x24,0x24,
	 0x25,0x26,0x24,0x34,0xA4,0x14,0x0C,0x00,
     0x00,0xFF,0x04,0x08,0x87,0x81,0x41,0x31,
	 0x0F,0x01,0x3F,0x41,0x41,0x41,0x70,0x00,
/*张        10   */
	 0x02,0xE2,0x22,0x22,0x3F,0x82,0x80,0xFF,
	 0x80,0xA0,0x90,0x88,0x86,0xC0,0x80,0x00,
     0x00,0x43,0x82,0x42,0x3E,0x00,0x00,0xFF,
	 0x40,0x23,0x0C,0x10,0x20,0x60,0x20,0x00,
/*彬        11   */
     0x10,0x10,0xD0,0xFF,0x90,0x10,0x10,0xD0,
	 0xFF,0x90,0x10,0x20,0x10,0x08,0xC6,0x00,
     0x04,0x03,0x00,0xFF,0x00,0x04,0x03,0x00,
	 0xFF,0x00,0x81,0x44,0x22,0x11,0x0C,0x00
	 };

/*--------------------------------------------------------------------------------------------------*/
//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址
void Show88(unsigned char lin,unsigned char column,unsigned int address)
{ unsigned char i;
  if(column>16) {return;}
  if(column<8) SelectScreen(1); //如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上
  else {
  SelectScreen(2); //否则 (8,9,10,11,12,13,14,15)写在第二屏上
  column=column & 0x07; //防止越界
 }
  SetLine(lin);
  SetColumn(column<<3);
  for(i=0;i<8;i++) WriteByte(ASC[address+i]);
}

void Show88hz(unsigned char lin,unsigned char column,unsigned int address)
{ unsigned char i;
  if(column>16) {return;}
  if(column<8) SelectScreen(1); //如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上
  else {
  SelectScreen(2); //否则 (8,9,10,11,12,13,14,15)写在第二屏上
  column=column & 0x07; //防止越界
 }
  SetLine(lin);
  SetColumn(column<<3);
  for(i=0;i<8;i++) WriteByte(Hztable[address+i]);
}
/*------------------------------------------------------------------------------------------------*/
//显示8*16字符
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//character:字符代码(标准ASCII码)
void ShowChar(unsigned char lin,unsigned char column,unsigned char character)
{ lin=lin<<1;//一个字符占两页
Show88(lin ,column, character*16 );
Show88(lin+1,column,character*16+8 );
}
/*----------------------------------------------------------------------------------------------*/
//显示一个汉字
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-7)
//hzcode: 汉字代码(自定义的)
//uchar code HZtable
void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)
{
lin=lin<<1; //lin*2,一个汉字占两页

Show88hz(lin,column,hzcode*32);
Show88hz(lin,column+1,hzcode*32+8);
Show88hz(lin+1,column,hzcode*32+16);
Show88hz(lin+1,column+1,hzcode*32+24);
}

/*----------------------------------------------------------------------------------------------*/
//演示主程序
void main()
{
   GDM12864delay();//等待设备准备
   InitLCD();//初始化LCD
   SetLine(0);
   SetColumn(0);
   SetStartLine(0);
   
   for(t=0;t<4;t++){
   ShowHZ(0,t<<1,t);   //显示 东南大学
   }
   for(t=4;t<12;t++){
   ShowHZ(1,(t-4)<<1,t);//显示 信息科学工程学院
   }
   for(t=12;t<14;t++){  
   ShowHZ(2,(t-12)<<1,t);//显示 张彬
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -