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

📄 lcd.c

📁 C51对C6963C的驱动编程,包含具体的连接定义和汉字字库,我已经完全显示成功
💻 C
字号:
/*----------------------------------------------------------------------------------------*/
//240*128液晶显示驱动程序
//控制器件为:AT89S52 
//程序设计:卢印举
/*----------------------------------------------------------------------------------------*/

#include <AT89X51.H>
#include <math.h>
#include <absacc.h>
#include <string.h>

//以8*8字符计算,显示屏横向、纵向可以显示的字符个数
#define LineChar  16//共16行
#define ColumnChar 30 //总共30列

//信号管脚定义(全局变量)(注意:因为液晶数据口接P0,故为直接访问方式)
sbit cd=P2^0;
//sbit reset=P2^5;
sbit ce=P2^1;
sbit wr=P3^6;
sbit rd=P3^7;
unsigned char  code ASCII816[ ][16];  //西文字模
unsigned char code HZTable[ ][32];    //汉字字模

//const char string[15]={"HELLO WORD"};

//数据线定义
#define dataport P0          //P0为数据口
#define unchar unsigned char //定义unchar 
#define unint  unsigned int  //定义unint 

/*----------------------------------------------------------------------------------------*/
//延时函数
void Lcddelay(unsigned char MS)
{
  unsigned char us, usn;
  while(MS!=0)
   {
    usn = 4;
    while(usn!=0)
     {
      us=0xf0;
      while(us!=0)
	  {us--;}
      usn--;
     }
    MS--;
   }
}

/*---------------------------------------------------------------------------------------*/
//状态检查函数
//指令,数据读写状态检查
//1-准备好;0-没有准备好;
//数据的读写之前,必须对芯片进行状态检查

void RWCheck()
{
  unchar dat;
  do{
    dataport=0xff;
    cd=1;
    rd=0;
    dat=dataport;
    rd=1;
    dat=0x03&dat;//STA0,STA1分别是检查准备好
     }while(dat!=0x03);
}
//数据自动读状态检查
void AutoRCheck()
{
 unchar dat;
 ce=0;
    do{
        dataport=0xff;
        cd=1;
        rd=0;
        dat=dataport;
        rd=1;
        dat=0x04&dat;//STA2是否准备好
        }while(dat==0x00);
 }
 //数据自动写状态检查
void AutoWCheck()
{
 unchar dat;
    do{
        dataport=0xff;
        cd=1;
        rd=0;
        dat=dataport;
        rd=1;
        dat=0x08&dat;//STA3是否准备好
        }while(dat==0x00);
}


/*------------------------------------------------------------------------------------*/
//输入/出函数,与T6963C通讯
//读数据线上的数据
unchar InPortData()
{
 unchar dat;
 RWCheck();
 cd=0;
 dataport=0xff;
 rd=0;
 dat=dataport;
 rd=1;
 return(dat);
}

//向数据口发送Data
void OutPortData(dat){RWCheck();cd=0;wr=0;dataport=dat;wr=1;}

//写有 1 个参数命令:仅仅发送一个命令
void OutPortCom1(command) { RWCheck();cd=1;wr=0;dataport=command;wr=1;}

//写有 2 个参数命令:向数据端口发送一个数据(dat),然后发送一个命令
void OutPortCom2(dat, command) { OutPortData(dat); OutPortCom1(command); }

//写有 3 个参数命令:向数据端口发送两个数据(dat1和dat2),然后发送一个命令
void OutPortCom3(data1, data2, command) { OutPortData(data1); OutPortData(data2); OutPortCom1(command);}

/*-----------------------------------------------------------------------------------*/
//显示30*16字符(显示范围为:30列16行)(图形显示方式)
//lin:行位置,(范围:0-15)
//column: 列位置,(范围0-29)
//ch:被发送的字符代码(标准ASCII码)
void ShowChar(unchar lin,unchar column,unchar ch)
{
unchar i;
unchar dat;
unint StartAddr;//开始的地址

while(column>15)
{
     column=column-16;
     lin=lin+1;
   }
if (lin>3)  return;

//StartAddr=(lin<<8)+column; //定位起始行(要求文本区从0x0000开始)
StartAddr=lin*LineChar+column; //定位起始行(要求文本区从0x0000开始)

for(i=0;i<16;i++)
{
dat=ASCII816[ch][i];//后面定义
OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address(可行吗?)
OutPortCom2(dat, 0xc4);

StartAddr=StartAddr + ColumnChar;
}
}

/*----------------------------------------------------------------------------------------------*/
//显示一个汉字(汉字为:8*8点阵格式,显示范围为:240X128点阵) (图形方式显示)
//lin:行位置。(范围0-15)
//column: 列位置,(范围0-29)
//hzcode: 要发送的汉字代码(自定义的汉字字库)
void ShowHZ(unchar lin,unchar column,unint hzcode)
{
unsigned char i;
unsigned int StartAddr;

while(column>14)
{
     column=column-16;
     lin=lin+1;
   }
if (column<0) column=0;
if (lin>3)  return;

StartAddr=(lin<<8)+column; //定位起始行(括号中相当于lin*ColumnChar*16)

for(i=0;i<16;i++)
{
OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
OutPortCom2( HZTable[hzcode][i*2], 0xc0); //左半部 地址加一
OutPortCom2( HZTable[hzcode][i*2+1], 0xc4); //右半部 字模地址加一

StartAddr=StartAddr + ColumnChar;
}
}

/*-----------------------------------------------------------------------------------*/
//显示一行字符串(汉字,字母混排)
//lin:行位置。(范围0-15)
//column: 列位置,(范围0-29)
void ShowLine(unchar lin,unchar column,unchar *puts,unchar i)
 {
  unchar j,byte,k;
  while(column>15)
                {
                  column=column-16;
                  lin=lin+1;
                 }
                if (lin>3)  return;//看首行是否超出屏幕
                for (k=column,j=0;j<i;j++)
  {
  byte = puts[j];
   if (byte&0x80) //汉字  /*汉字从0x80开始,包括0x80*/
    {
     ShowHZ(lin,k,byte&0x7f);
     k=k+2;
    }
   else {ShowChar(lin,k,byte-0x20);k=k+1;}//字母  /*ascii码表从0x20开始*/

  }
 }

/*----------------------------------------------------------------------------------------------------*/
//反显一个字符
//lin:行位置。(范围0-15)
//column: 列位置,(范围0-29)
void ReverseShowChar(unchar lin,unchar column)
{
unsigned char i;
unsigned char dat;
unsigned int StartAddr;

StartAddr=(lin<<8) +column; //定位起始行

for(i=0;i<16;i++)
{
OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
OutPortCom1( 0xc5 ); //数据一次读,地址不变
dat=InPortData(); //读入数据
dat=~dat; //取反
OutPortCom2( dat, 0xc4); //送回

StartAddr=StartAddr+ ColumnChar;
}
}

/*----------------------------------------------------------------------------------------------------*/
//反显一个汉字
//lin:行位置。(范围0-15)
//column: 列位置,(范围0-29)
void ReverseShowHZ(unchar lin,unchar column)
{
ReverseShowChar(lin,column);
ReverseShowChar(lin,column+1);
}

/*----------------------------------------------------------------------------------------------------*/
//反显一行汉字
//lin:行位置。(范围0-15)
//column: 列位置,(范围0-29)
void ReverseShowLine(unchar lin)
{
unchar column;
if (lin>3)  return;
for(column=0; column< ColumnChar; column++) ReverseShowChar(lin,column);
}

/*---------------------------------------------------------------------------------------------------*/
//清屏
void ClearScreen()
{
unsigned int i;
///////// 清显示 RAM 区 0000h--2000h (8k)
OutPortCom3(0x00,0x00,0x24); //设置指针地址0000H

OutPortCom1(0xb0); //设置自动写状态
for(i=0;i<8200;i++) {AutoWCheck();OutPortData(0x00);} // data=0;
AutoWCheck();//是否需要??
OutPortCom1(0xb2); // 自动写结束
}

/*---------------------------------------------------------------------------------------------------*/
//初始化LCD
//需要手动设置
void InitLCD()
{
ce=0;
cd=1;
//wr=1;
//rd=1;
OutPortCom3( 0x00,0x00,0x42 ); //设置图形显示区域首地址GraphAddr
OutPortCom3( 0x10,0x00,0x43); //设置图形显示区域宽度:10H

OutPortCom1(0xa7); //设置光标形状 cursor size 8x8
OutPortCom1(0x80); //设置显示方式: CGROM方式 文本\图形 "或"
OutPortCom1(0x9c); //设置显示开关: 1001 1000 只开图形显示

ClearScreen();
}

/********************************/
/*  自己定义的中文字库  */
/********************************/

unchar code HZTable[ ][32]={
/*  电   0x00 --*/
        {0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,
         0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,
         0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,
         0x01,0x02,0x01,0x02,0x00,0xFE,0x00,0x00},
/*  压   0x01 --*/
        {0x00,0x00,0x3F,0xFE,0x20,0x00,0x20,0x80,
         0x20,0x80,0x20,0x88,0x2F,0xFC,0x20,0x80,
         0x20,0xA0,0x20,0x90,0x20,0x98,0x40,0x90,
         0x40,0x80,0xBF,0xFE,0x00,0x00,0x00,0x00},
/*  功   0x02 --*/
        {0x00,0x20,0x00,0x20,0x7F,0x20,0x08,0x20,
         0x0B,0xFC,0x08,0x24,0x08,0x24,0x08,0x44,
         0x09,0x44,0x0E,0x44,0xF0,0x84,0x40,0x84,
         0x01,0x04,0x02,0x78,0x04,0x10,0x00,0x00},
/*  率   0x03 --*/
        {0x02,0x00,0x01,0x00,0x7F,0xFE,0x41,0x00,
         0x22,0x28,0x17,0xD0,0x04,0x80,0x11,0x10,
         0x22,0x48,0x47,0xC4,0x01,0x20,0xFF,0xFE,
         0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00},
/*  有   0x04 --*/
        {0x01,0x00,0x01,0x00,0x7F,0xFE,0x02,0x00,
         0x04,0x00,0x0F,0xF0,0x18,0x10,0x28,0x10,
         0x4F,0xF0,0x88,0x10,0x08,0x10,0x0F,0xF0,
         0x08,0x10,0x08,0x90,0x08,0x70,0x08,0x20},
/*  效   0x05 --*/
        {0x10,0x20,0x08,0x30,0x08,0x20,0x7F,0x20,
         0x14,0x7E,0x12,0x44,0x21,0xC4,0x22,0x44,
         0x62,0x28,0x14,0x28,0x08,0x10,0x0C,0x10,
         0x12,0x28,0x20,0xCE,0xC3,0x04,0x00,0x00},
/*  值   0x06 --*/
        {0x10,0x40,0x18,0x60,0x17,0xFC,0x10,0x40,
         0x20,0x80,0x33,0xF8,0x62,0x08,0xA3,0xF8,
         0x22,0x08,0x23,0xF8,0x22,0x08,0x23,0xF8,
         0x22,0x08,0x22,0x08,0x2F,0xFE,0x20,0x00},
/*  三   0x07 --*/
        {0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,
         0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,
         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
         0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00},
/*  相   0x08 --*/
        {0x10,0x00,0x10,0xFC,0x10,0x84,0x10,0x84,
         0xFE,0x84,0x18,0xFC,0x34,0x84,0x32,0x84,
         0x52,0x84,0x50,0xFC,0x90,0x84,0x10,0x84,
         0x10,0x84,0x10,0x84,0x10,0xFC,0x10,0x84},
/*  流   0x09 --*/
        {0x20,0x80,0x10,0x40,0x17,0xFE,0x00,0x40,
         0x80,0x80,0x49,0x10,0x4B,0xF8,0x10,0x08,
         0x12,0x50,0x12,0x50,0xE2,0x50,0x22,0x50,
         0x24,0x52,0x24,0x52,0x28,0x4E,0x20,0x00},
/*  量   0x0a --*/
        {0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,
         0x1F,0xF0,0x00,0x00,0xFF,0xFE,0x11,0x10,
         0x1F,0xF0,0x11,0x10,0x1F,0xF0,0x01,0x00,
         0x1F,0xF8,0x01,0x00,0xFF,0xFE,0x00,0x00},
/*  因   0x0b --*/
        {0x00,0x00,0x7F,0xFC,0x41,0x04,0x41,0x04,
         0x41,0x04,0x5F,0xF4,0x41,0x04,0x43,0x04,
         0x42,0x84,0x46,0x44,0x44,0x24,0x48,0x34,
         0x50,0x24,0x40,0x04,0x7F,0xFC,0x40,0x04},
/*  数   0x0c --*/
        {0x08,0x20,0x49,0x30,0x2A,0x20,0x1C,0x20,
         0xFF,0x7E,0x1C,0x44,0x2B,0x44,0x48,0xC4,
         0x08,0x28,0xFF,0x28,0x12,0x10,0x34,0x10,
         0x0C,0x28,0x32,0x4E,0xC0,0x84,0x00,0x00}
};

/****************************************/
/* 边准的ASCII字库8列*16行  */
/****************************************/

unchar code ASCII816[ ][16]={
/*-文字: --0x20 */
 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
/*-文字:(--0x21 */
 {0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00},
/*-文字:)--0x22 */
 {0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00},
/*-文字:.--0x23 */
 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00},
/*-文字:0--0x24 */
 {0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00},
/*-文字:1--0x25 */
 {0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},
/*-文字:2--0x26 */
 {0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00},
/*-文字:3--0x27 */
 {0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00},
/*-文字:4--0x28 */
 {0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00},
/*-文字:5--0x29 */
 {0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00},
/*-文字:6--0x2a */
 {0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00},
/*-文字:7--0x2b */
 {0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00},
/*-文字:8--0x2c */
 {0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00},
/*-文字:9--0x2d */
 {0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00},
/*-文字:A--0x2e */
 {0x00,0x00,0x00,0x10,0x10,0x18,0x28,0x28,0x24,0x3C,0x44,0x42,0x42,0xE7,0x00,0x00},
/*-文字:B--0x2f */
 {0x00,0x00,0x00,0xF8,0x44,0x44,0x44,0x78,0x44,0x42,0x42,0x42,0x44,0xF8,0x00,0x00},
/*-文字:C--0x30 */
 {0x00,0x00,0x00,0x3E,0x42,0x42,0x80,0x80,0x80,0x80,0x80,0x42,0x44,0x38,0x00,0x00},
/*-文字:D--0x31 */
 {0x00,0x00,0x00,0xF8,0x44,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x44,0xF8,0x00,0x00},
/*-文字:H--0x32 */
 {0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},
/*-文字:I--0x33 */
 {0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},
/*-文字:T--0x34 */
 {0x00,0x00,0x00,0xFE,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00},
/*-文字:V--0x35 */
 {0x00,0x00,0x00,0xE7,0x42,0x42,0x44,0x24,0x24,0x28,0x28,0x18,0x10,0x10,0x00,0x00},
/*-文字:W--0x36 */
 {0x00,0x00,0x00,0xD6,0x92,0x92,0x92,0x92,0xAA,0xAA,0x6C,0x44,0x44,0x44,0x00,0x00},
};

/*---------------------------------------------------------------------------------------------------*/
//测试程序
void main(void)
{ 
//ce=0;
/*
unchar code STR1[]=
  {
  0x84,0x82,0x80,0x8a,
  0x21,0x36,0x22
  };
unchar code STR2[]=
  {
  0x2e
  };
unchar code STR3[]=
  {
  0x2f
  };
unchar code STR4[]=
  {
  0x30
  };*/

ES=0;
InitLCD();
P1_0=0;
ShowChar(0,0,17);
//ShowHZ(12,20,0x3);
P1_2=0;
//ShowChar(2,3,&string);
//ShowLine(0,2,&string,7);
//ShowLine(0,2,STR1,7);
//ShowLine(1,0,STR2,1);
//ShowLine(2,0,STR3,1);
//ShowLine(3,0,STR4,1);
//ReverseShowLine(0);
//while(1){};
} 

⌨️ 快捷键说明

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