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

📄 t6963c-demo(ok060520).c

📁 我收集的SED1335液晶屏的各种资料集合 对初学者很有帮助
💻 C
📖 第 1 页 / 共 3 页
字号:
//CA24064B (T6963c)keilc51示例程序

//                    CA24064
//***************************************************************************
//*  Create by :Ssmart   2004/12/01       KeilC V7.0                           *
//***************************************************************************
//连线表:  CPU=89C52                                                        *
//C/D=P2.0           /CE=P2.7    FS=P3.5     /WR=/WR P3.6     /RD=/RD P3.7  *
//FOSC=12MHz         D0-D7=P0.0-P0.7     /RSET=/(CPU RSET)                  *
//***************************************************************************
#include "STC89C51RC_RD_PLUS.H" // <reg52.h>
#include <intrins.h>
#include <stdio.h>

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

#define LineChar 30 // 240/8=30

char xdata LcmDataPort _at_ 0x0000;
char xdata LcmCmdPort  _at_ 0x0100;
sbit FS = P3^5;
sbit Key= P3^4;

uchar code bmp1[];
uchar code str1[];
unsigned char code HZTable[][32];
unsigned char code CharTable[][16];

//指令&数据读写状态
void CheckRWCD(void)
{
  while((LcmCmdPort & 0x03) != 0x03);      //低电平忙
}
//数据自动写状态
void CheckAutoWrite(void)
{
     while((LcmCmdPort & 0x08) == 0);      //低电平忙
}
//屏读/屏考贝出错状态
void CheckScreen(void)
{      
     while(LcmCmdPort & 0x40);      //1出错,0正确
}
//一个数据子写入函数
void LcmWriteData(uchar uData)                        
{
     LcmDataPort = uData;
}
//一个数据读出函数
uchar LcmReadData( void )
{
     uchar uData;
     uData = LcmDataPort;
     return uData;
}
//无参数指令写入函数
void LcmWriteCommand(uchar Command)                  
{
     CheckRWCD();                        //检测指令读写状态
     LcmCmdPort = Command;
}
//单参数指令写入函数
void LcmWriteCommandWith1Par(uchar Parameter,uchar Command)
{
     CheckRWCD();                        //检测指令读写状态
     LcmDataPort = Parameter;
     CheckRWCD();
     LcmCmdPort = Command;
}
//双参数指令写入函数
void LcmWriteCommandWith2Par(uchar Parameter1,uchar Parameter2,uchar Command)
{
     CheckRWCD();                        //检测指令读写状态
     LcmDataPort = Parameter1;
     CheckRWCD();
     LcmDataPort = Parameter2;
     CheckRWCD();
     LcmCmdPort = Command;
}
//LCM初始化函数
void LcmInit( void )
{
     LcmWriteCommandWith2Par(0x00,0x00,0x40);      //设置文本显示区首地址
     LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x41);      //设置文本显示区宽度
     LcmWriteCommandWith2Par(0x00,0x08,0x42);      //设置图形显示区首地址0x0800
     LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x43);      //设置图形显示区宽度
     LcmWriteCommand(0xA7);                  //设置光标形状 8x8方块
     LcmWriteCommand(0x81);                  //显示方式设置 文本xor图形(异或)
     LcmWriteCommand(0x9C);                  //显示开关设置 文本开,图形开,光标闪烁关
}
//延时函数
void Delay(uint MS)
{
     uchar us,usn;
     while(MS!=0)                        //12M Crystal
     { 
           usn = 2;
           while(usn!=0)
           {
                 us=0xf2;
                 while (us!=0){us--;};
                 usn--;
           }
           MS--;
     }
}
//通过按键设定延时函数
void DelayKey(unsigned char HalfSecond)
{                              //Delay_key加入时间参数0.5秒一级
     unsigned int i;
     for(i=0;i<50*HalfSecond;i++)            //12M Crystal
     {
           if(Key==0)
           {
                 Delay(20);
                 while(Key==0) {Delay(20);}
                 break;
           }
           Delay(10);
     }
}
//清显示存储器函数
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+=0x0800;
     }
     LcmWriteCommandWith2Par(temp&0xff,temp/256,0x24);
}
//显示一个ASCII码函数
void PutChar(uchar x,uchar y,uchar CharByte)
{
     LocateXY(x,y,TXT);
     LcmWriteCommandWith1Par(CharByte,0xC4);
}
//显示一个字符串函数
void PutString(uchar x,uchar y,uchar *str)
{
     while(*str != 0)
     {
           if(x> 29)            //自动换行
           {
                 x=0;
                 y++;
           }
           PutChar(x,y,*str);
           ++x;
           ++str;
     }
}

void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)   //图形方式显示1个汉字 
{
unsigned char i;
unsigned int StartAddr;
StartAddr=0x800+lin*LineChar + column; //图形显示RAM区为0800开始
for(i=0;i<16;i++)
{
LcmWriteCommandWith2Par( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
LcmWriteCommandWith1Par( HZTable[hzcode][i*2], 0xc0); //数据写地址+1
LcmWriteCommandWith1Par( HZTable[hzcode][i*2+1], 0xc4); //数据写地址不变
StartAddr=StartAddr + LineChar;     
}
}

void ShowHZReverse(unsigned char lin,unsigned char column,unsigned int hzcode)   //图形方式反显 显示1个汉字 
{
unsigned char i;
unsigned int StartAddr;
StartAddr=0x800+lin*LineChar + column; //图形显示RAM区为0800开始
for(i=0;i<16;i++)
{
LcmWriteCommandWith2Par( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
LcmWriteCommandWith1Par(~HZTable[hzcode][i*2], 0xc0); //数据写地址+1
LcmWriteCommandWith1Par(~HZTable[hzcode][i*2+1], 0xc4); //数据写地址不变
StartAddr=StartAddr + LineChar;     
}
}
void ShowChar(unsigned char lin,unsigned char column,unsigned int hzcode)   //图形方式显示1个英文字符
{
unsigned char i;
unsigned int StartAddr;
StartAddr=0x800+lin*LineChar + column; //图形显示RAM区为0800开始
for(i=0;i<16;i++)
{
LcmWriteCommandWith2Par( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
LcmWriteCommandWith1Par( CharTable[hzcode][i], 0xc4); //数据写地址不变
StartAddr=StartAddr + LineChar;     
}
}

void ShowEmpty(unsigned char lin,unsigned char column)   //图形方式显示1个空字符
{
unsigned char i;
unsigned int StartAddr;
StartAddr=0x800+lin*LineChar + column; //图形显示RAM区为0800开始
for(i=0;i<16;i++)
{
LcmWriteCommandWith2Par( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
LcmWriteCommandWith1Par( 0x00, 0xc4); //数据写地址不变
StartAddr=StartAddr + LineChar;     
}
}

void line(unsigned char lin)   //图形方式画一条线
{
unsigned char i;
unsigned int StartAddr;
StartAddr=0x800+lin*LineChar; //图形显示RAM区为0800开始
LcmWriteCommandWith2Par( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
for(i=0;i<LineChar;i++)
{
LcmWriteCommandWith1Par( 0xFF, 0xc0); //数据写地址不变
}
}


//显示一副图片函数
void DisplayOneBmp(uchar *puts)
{
     uchar i,j;
     uint  X=0;
     LocateXY(0,0,Graphic);
     LcmWriteCommand(0xB0);                  //进入自动写
     for(i=0;i<30;i++)  //LcmWidthDots->30
     {
           for(j=0;j<LcmLengthDots/8;j++)
           {
                 CheckAutoWrite();
                 LcmWriteData(puts[X]);
                 X++;
           }
     }
     LcmWriteCommand(0xB2);                  //退出自动写
}
//反显一副图片函数
void ReverseOneBmp( void )
{                              //利用数据一次读写操作
     uchar i,j,X;            //只能对一段RAM取反
     LocateXY(0,0,Graphic);
     for(i=0;i<30;i++)   //LcmWidthDots ->30
     {
           for(j=0;j<LcmLengthDots/8;j++)
           {
                 LcmWriteCommand(0xC5);      //读数据,地址不变
                 CheckRWCD();

⌨️ 快捷键说明

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