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

📄 lcd.c

📁 T6963C液晶240*128点阵单片机程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//                        240128液晶显示模块
//***************************************************************************
//*  Create by :LAUKING   2007/11/06       KeilC V7.0                       *
//***************************************************************************
//连线表:  CPU=89s52                                                        *
//C/D=P1.3          /CE=P2.7 2.6         /WR=/WR   /RD=/R                   *
//FOSC=22.1184MHz                         D0-D7=P0.0-P0.7                   *
//***************************************************************************

#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#include <KEY.h>
#include <IAP.h>

#define uint  unsigned int
#define uchar unsigned char
#define Graphic        1
#define TXT            0
#define LcmLengthDots     240
#define LcmWidthDots      128

#define para     1 //parameter参数
#define coor     0 //coordinate坐标

char xdata LcmPort _at_ 0x8000;
sbit CD=  P1^3;          //High is code, low is data

uchar code hz[];
uchar code hz_t[];
////////////////////////////////////////////////////////////////////////////////////
//函数声明
extern void CheckRWCD(void);
extern void CheckAutoWrite(void);
extern void CheckScreen(void);
extern void LcmWriteData(uchar uData);
extern uchar LcmReadData( void );
extern void LcmWriteCommand(uchar Command);
extern void LcmWriteCommandWith1Par(uchar Parameter,uchar Command);
extern void LcmWriteCommandWith2Par(uchar Parameter1,uchar Parameter2,uchar Command);
extern void LcmInit( bit Mode_Choose );            //文本法初始化函数
//extern void LcmInit_t( void );          //图形法初始化函数 
extern void LcmClear( uchar FillByte );
extern void LocateXY(uchar x,uchar y,uchar mode);
extern void PutChar(uchar x,uchar y,uchar CharByte);
extern void write_hz(unsigned char x_hz,unsigned char y_hz,unsigned char code_hz);
extern void CGRAM (unsigned char q);
extern void write_cghz(unsigned char x_cghz,unsigned char y_cghz,unsigned char num_cghz);
extern void write_cgzf(unsigned char x_cgzf,unsigned char y_cgzf,unsigned char num_cgzf);
extern void cghz_char(unsigned char x_char,unsigned char y_char,unsigned char hz_char);
extern void cgzf_char(unsigned char x_char,unsigned char y_char,unsigned char zf_char);

extern void Init_Display(void);
extern void Chief_Display(void);

extern void Delay(uint MS);
/////////////////////////////////////////////////

//指令&数据读写状态
void CheckRWCD(void)
{
    CD=1;  //code
	while((LcmPort & 0x03) != 0x03);   //低电平忙
	
}
//数据自动写状态
void CheckAutoWrite(void)
{
    CD=1;  //code
	while((LcmPort & 0x08) == 0);      //低电平忙
}
//屏读/屏考贝出错状态
void CheckScreen(void)
{      
    CD=1;  //code
	while(LcmPort & 0x40);              //1出错,0正确
}
//一个数据子写入函数
void LcmWriteData(uchar uData)                        
{
    CD=0; //data 
	LcmPort = uData;
}
//一个数据读出函数
uchar LcmReadData( void )
{
     uchar uData;
	 CD=0; //data
     uData = LcmPort;
     return uData;
}
//无参数指令写入函数
void LcmWriteCommand(uchar Command)                  
{
     CheckRWCD();                        //检测指令读写状态
	 LcmPort = Command;
}
//单参数指令写入函数
void LcmWriteCommandWith1Par(uchar Parameter,uchar Command)
{
     CheckRWCD();                        //检测指令读写状态
     CD=0; //data
	 LcmPort = Parameter;
     CheckRWCD();
	 LcmPort = Command;
}
//双参数指令写入函数
void LcmWriteCommandWith2Par(uchar Parameter1,uchar Parameter2,uchar Command)
{
     CheckRWCD();                        //检测指令读写状态
     CD=0;
	 LcmPort = Parameter1;
     CheckRWCD();
	 CD=0;
     LcmPort = Parameter2;
     CheckRWCD();
	 LcmPort = Command;
}
//LCM显示初始化函数
void LcmInit( bit Mode_Choose )
{
    LcmWriteCommandWith2Par(0x00,0x00,0x40);            //设置文本显示区首地址
    LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x41); //设置文本显示区宽度
	LcmWriteCommandWith2Par(0x00,0x10,0x42);            //设置图形显示区首地址0x1000
    LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x43); //设置图形显示区宽度
    LcmWriteCommand(0xA7);                              //设置光标形状 8x8方块
    LcmWriteCommand(0x81);                              //显示方式设置 文本xor图形(异或)
    LcmWriteCommand(0x9D);                              //显示开关设置 文本开,图形开,光标闪烁开
    if(Mode_Choose==0) //如果是文本方式
	{
		LcmWriteCommand(0x84); //显示方式:文本特征
		LcmWriteCommandWith2Par(0x03,0x00,0x22);            //设置CGRAM偏址
	}
}

//延时函数
void Delay(uint MS)
{
     uchar us,usn;
     while(MS!=0)                        //22.1184M Crystal
     { 
           usn = 4;
           while(usn!=0)
           {
                 us=0xf2;
                 while (us!=0){us--;};
                 usn--;
           }
           MS--;
     }
}

//清显示存储器函数
void LcmClear( uchar FillByte )
{
     uint i = 8192;    //此处仅清8K RAM,如果您32K RAM都使用,请修改i=32768(后面也要改)
	 if(FillByte)      //注意如果填充ff时,如果RAM仅使用了8K,那么8192次会写入到文本区
     {                 //会形成乱码.(24064出厂时候默认将R7断开,即默认使用8KRAM)
           i -= 2*1024;//所以如果填入ff时候要扣除2K的文本区
             LcmWriteCommandWith2Par(0x00,0x08,0x24);      //填充0xff时候要在图形区
     }
     else
           LcmWriteCommandWith2Par(0x00,0x00,0x24);
     LcmWriteCommand(0xB0);                  //进入自动写
     while(i--)
     {
           CheckAutoWrite();
           LcmWriteData( FillByte );
     }
     LcmWriteCommand(0xB2);                  //退出自动写
}
//设定显示地址函数
void LocateXY(uchar x,uchar y,uchar mode)
{
     uint  temp;
     temp= LcmLengthDots/8*y + x;
     if(mode)                        //mode=1为Graphic
     {                              //如果图形模式要加上图形区首地址0x0800
           temp+=0x1000;
     }
     LcmWriteCommandWith2Par(temp&0xff,temp/256,0x24);
}

//显示一个ASCII码函数
//  0 1 2 3 4 5 6 7 8 9 a b c d e f
//0   ! " # $ % & ' ( ) * + , - . /
//1 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
//2   A B C D E F G H I J K L M N O
//3 P Q R S T U V W X Y Z [ \ ] ^ _
//4 ' a b c d e f g h i j k l m n o
//5 p q r s t u v w x y z { | } ~ 
void PutChar(uchar x,uchar y,uchar CharByte)
{
     LocateXY(x,y,TXT);
     LcmWriteCommandWith1Par(CharByte,0xC4);// 0xc4 数据一次写,地址不变
}


//汉字写入函数
//x_hz:0~29;  y_hz:0~127
//address为显示缓冲区的地址,在图形显示方式下直接对应点阵状态
//addr_hz即为在单片机FLASH中所建的字模的地址
void write_hz(unsigned char x_hz,unsigned char y_hz,unsigned char code_hz)
{
  unsigned char i_hz;
  unsigned int addr_hz;
  //address=y_hz*30u+x_hz+0x1000;         //计算显示存储器地址
  addr_hz=code_hz*32u;                    //计算汉字字模地址(cctab的下标)
  for(i_hz=0;i_hz<16;i_hz++)              //计数值16
  {
    LocateXY(x_hz,y_hz,1);  //设置显示存储器地址
    LcmWriteCommandWith1Par(hz_t[addr_hz],0xC0);  //写入汉字字模左部
    LcmWriteCommandWith1Par((hz_t[addr_hz+1]),0xC0);  //写入汉字字模右部
    addr_hz+=2;
    //address+=30;  //修改显示存储器地址,显示下一列(共16列)
	y_hz+=1;
  }
}


//CGRAM字模写入函数
//注意,只是用了CGRAM的后1K,前1K留给映射CGROM了
//在连续的32个存储单元里是一个汉字的字模,排列顺序是前16个单元是汉字的左半部(左上、左下),后
//16个存储单元是汉字的右半部
//根据所要写入汉字的个数,只要修改q的取值即可
   void CGRAM (unsigned char q)
    {
        unsigned char m,n,p;
         LcmWriteCommandWith2Par(0x00,0x1C,0x24); //设置CGRAM的高1K地址
         for(p=0;p<q;p++)
          { for(m=0;m<16;m++)
            {
             LcmWriteCommandWith1Par(hz[m*2u+p*32u], 0xC0 );
            }
            for(n=0;n<16;n++)
            {
             LcmWriteCommandWith1Par(hz[(n*2u+1)+p*32u], 0xC0 );
            }
          }
    }

//CGRAM汉字显示函数
//x_cghz为0~29,y_cghz为0~15
void write_cghz(unsigned char x_cghz,unsigned char y_cghz,unsigned char num_cghz)
{
  unsigned int address; //int为16位
  unsigned char code_cghz;
  code_cghz=4*num_cghz+0x80;

  //写入左上部
  address=y_cghz*30u+x_cghz; //显示缓冲区存储单元地址
  LcmWriteCommandWith2Par( (unsigned char)(address),(unsigned char)(address>>8),0x24);  //设置显示存储器地址
  LcmWriteCommandWith1Par( code_cghz, 0xC4 );  //装入字符代码,写入数据,地址不变
  //写入右上部
  LcmWriteCommandWith2Par( (unsigned char)(address+1),(unsigned char)((address+1)>>8),0x24);
  LcmWriteCommandWith1Par( code_cghz+2, 0xC4 ); 
  //写入左下部
  LcmWriteCommandWith2Par( (unsigned char)(address+30u),(unsigned char)((address+30u)>>8),0x24);
  LcmWriteCommandWith1Par( code_cghz+1, 0xC4 );  
  //写入右下部
  LcmWriteCommandWith2Par( (unsigned char)(address+31u),(unsigned char)((address+31u)>>8),0x24); 
  LcmWriteCommandWith1Par( code_cghz+3, 0xC4 ); 
}


//CGRAM字符写入函数
//x_cgzf为0~29,y_cgzf为0~15
void write_cgzf(unsigned char x_cgzf,unsigned char y_cgzf,unsigned char num_cgzf)
{
  unsigned int address; //int为16位
  unsigned char code_cgzf;
  code_cgzf=4*num_cgzf+0x80;

  //写入
  address=y_cgzf*30u+x_cgzf; //显示缓冲区存储单元地址
  LcmWriteCommandWith2Par( (unsigned char)(address),(unsigned char)(address>>8),0x24);  //设置显示存储器地址

⌨️ 快捷键说明

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