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

📄 lcd.c

📁 128X64点阵LCD驱动电路及源程序。可完成点、线、圆、英文字符、汉字显示。液晶驱动芯片为12864B,开发环境为KEIL C uVersion2。
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
**********************************************************************
Definitions & Includes
**********************************************************************
*/
#include <math.h>     /* Header file */
#include<reg52.h>
// 引脚连接定义(8051X与图形液晶模块CFAG240128)
#define MaxHdots 128 // 每行最大点数
#define MaxVdots 64  // 每列最大点数


#define true 0xFF
#define false 0x00
#define uchar unsigned char
#define uint unsigned int

#define DCRYSTAL 1  /*默认使用24Mhz晶振*/
#define DBPS 0      /*默认BPS为9600bps*/

#define CMD_SOH 0x01  //串口命令头
#define CMD_ETX 0x03  //串口命令尾

#define FONT_SMALL 0x00  //字体宏定义
#define FONT_LARGE 0x01
#define FONT_MICRO 0x02
#define FONT_GIANT 0x03
#define FONT_FIXED 0x04
#define TYPE_NORMAL 0x01  //类型定义
#define TYPE_INVERSE 0x02
#define TYPE_UNDERLINE 0x04
#define TYPE_OUTLINE 0x08//目前未处理
#define JUSTY_LEFT 0x00  //对齐方式定义
#define JUSTY_CENTER 0x01
#define JUSTY_RIGHT 0x02
#define JUSTY_ABS 0x03
#define CHECK_PRINT 0         //print
#define UN_PRINT 1            //un_print
#define REC_ON   1            //CHECK ON
#define REC_OFF  0            //CHECK OFF

#define STARTADD 0x7800
#define WTCMD 0x0A0
#define RDCMD 0x0A1
#define DTIME 0x20      //延时时间

#define ASCIIDEL 0x30   //ASCII数字差0x30
#define ASCIIFDEL 0x37   //ASCII数字差0x30
#define HZIMOSIZE 16      /*默认字模高*/
#define WZIMOSIZE 8       /*默认字模宽*/
#define ASC_SPACE 32      //SPACE的ASCII码
#define MDEL 33           //查表时ASCII与数组下标差值
#define BPS19200  1
#define BPS4800  0       //默认BPS 4800
sbit RS = P1^0;	//H-Data/L-Instrution  PLCC
sbit RW = P1^1;	//H-Read/L-Write  sp51
sbit E = P1^2;	//Enable
sbit CSA = P1^3;	//Select KS0108A
sbit CSB = P1^4;	//Select KS0108BB
//RS---PIN4
//RW---PIN5
//E ---PIN6
//CSA--PIN15
//CSB--PIN16
sbit SCL = P1^5;   //PLCC 51
sbit SDA = P1^6;
sbit BKLIGHT = P2^7;
static bit Rec_flag;  //表事串口接收数据是否在命令接收过程中
static uint idata Cmd_counter; //接收命令数据计数器
static uint idata Cmd_Length;  //接收命令数据长度
static uchar idata ScreenNumber;//当前屏幕存储序号
static code uchar DBmask[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//低位在前掩码
static code uchar mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//高位在前掩码

void nop();
void ChangeAscii(uchar *AscII);
/*GLCD_API.C文件中包括的函数*/
extern void init_lcd();
extern void draw_pixel(uchar x,uchar y,bit color);
extern void full_display(bit color);
extern void backlight(uchar uchCtr);//背光控制                       (**缺**)
extern void write_data(bit CS1,bit CS2,uchar dat);
extern uchar read_data(bit CS1,bit CS2);
extern void write_command(bit CS1,bit CS2,uchar command);
extern void set_row(uchar row,uchar scol,uchar ecol,bit color);
/*GDRW_API.C文件中包括的函数*/
extern void B_DrawByte(uchar Px, uchar Py, uchar ValByte);
extern void B_DrawLine(uchar Sx, uchar Sy, uchar Ex, uchar Ey, bit Color);
extern void B_DrawRect(uchar Sx, uchar Sy, uchar Ex, uchar Ey, bit Style, bit Color);
extern void B_DrawCirc(uchar Cx, uchar Cy, uchar Radium, bit Style, bit Color);
static uchar B_DelVal(uchar A, uchar B);
static int B_DDARound(float TemVal);
/*GLCDZIMO.C文件中包括的函数*/
extern void B_DrawText(uchar idata *TxtBuf, uchar Len, uchar Sx, uchar Sy,
                       uchar Font, uchar Type, uchar Justy, bit UnPrint);
extern void B_Print_S0(uchar idata *TxtBuf, uchar Len,
       uchar Sx, uchar Sy, uchar Type, uchar Justy, bit UnPrint);
extern void B_Print_S1(uchar idata *TxtBuf, uchar Len,
       uchar Sx, uchar Sy, uchar Type, uchar Justy, bit UnPrint);
extern void B_Print_S2(uchar idata *TxtBuf, uchar Len,
       uchar Sx, uchar Sy, uchar Type, uchar Justy, bit UnPrint);
extern void B_Print_S3(uchar idata *TxtBuf, uchar Len,
       uchar Sx, uchar Sy, uchar Type, uchar Justy, bit UnPrint);
extern void B_Print_S4(uchar idata *TxtBuf, uchar Len,
       uchar Sx, uchar Sy, uchar Type, uchar Justy, bit UnPrint);
/*GROM_API.C EPROM控制函数*/
extern void Dyanshi(uchar xms);
extern void WriteByteInt(uint Add,uchar dt);
extern uchar ReadByteInt(uint Add);
extern void WI2CToLCD(bit cs1,bit cs2,uchar page,uchar column,uchar sdat);
extern void WriteToLCD(uchar page);
extern void WriteToI2C(uchar page);

static void start();	//设置开始
static void noack();
static void stop();
static void checkack();
static void WriteData(uchar wdat);
static void WriteByte(uchar HAdd, uchar LAdd, uchar dat);
static uchar ReadData();
static uchar ReadByte(uchar HAdd,uchar LAdd);
static uchar RLCDtoI2C(bit cs1,bit cs2,uchar page,uchar column);

/*GCOM_API.C串口相关函数*/
extern void BCOM_IniCom(bit Bps);
extern void BCOM_SendData(uchar senddata);
static void MsgLoopComP(uint TLen);
static void MsgLoopComH(uint TLen);
static void MsgLoopComU(uint TLen);
static void MsgLoopComC();
static void MsgLoopComG();
static void MsgLoopComB();
static void MsgLoopComX();
static void MsgLoopComL();
static void MsgLoopComLL();
extern void BCOM_MsgLoop(uint TLen);
/*GKEY_API.C外挂键盘驱动函数*/
extern void BKEY_Pro(uchar chKeyVal); //处理外部按键事件(串口返回数据线PC机)
extern uchar Get_Key();//根据跳线决定按键键值

void main()
{
   uchar chKey;
   uchar ch;
   Rec_flag=0;                   //表事串口接收数据是否在命令接收过程中
   Cmd_counter=0x00;             //接收命令数据长度
   ScreenNumber=0x00;
  
   Dyanshi(DTIME);   
   BCOM_IniCom(BPS4800);         //初始化串口  (12M 4800bps)
   Dyanshi(DTIME);                 //延时
   BCOM_SendData(0xbf);          //返回成功标识
   init_lcd();                   //初始化LCD
   Dyanshi(DTIME);                 //延时
   full_display(0);              //清屏
  
   Dyanshi(2*DTIME);                 //延时
   start();
   stop();
   Dyanshi(5*DTIME);                 //延时   
   ch=ReadByteInt(0X7FA4);   
   //处理开机次数      
   if(ch==0x00)
   {
      Dyanshi(10*DTIME);                 //延时 
      B_DrawLine(0, 63, 127, 0, 0);
      B_DrawLine(0, 0, 127, 63, 0);      
      Dyanshi(10*DTIME);                 //延时     
      WriteByteInt( 0X7FA4 , 0xff);   	     	
      Dyanshi(10*DTIME);                 //延时 
      B_DrawLine(0, 63, 127, 0, 0);
      B_DrawLine(0, 0, 127, 63, 0);      
      Dyanshi(10*DTIME);                 //延时     
      ch=ReadByteInt(0X7FA3);  
      if(ch==0x00)
      	 while(1);
      else
      {
   	     ch--;
         Dyanshi(10*DTIME);                 //延时 
         B_DrawLine(0, 63, 127, 0, 0);
         B_DrawLine(0, 0, 127, 63, 0);      
         Dyanshi(10*DTIME);                 //延时     
         WriteByteInt( 0X7FA3 , ch);   	  
       }       	 
   }
   else
   {
      ch--;
      Dyanshi(10*DTIME);                 //延时 
      B_DrawLine(0, 63, 127, 0, 0);
      B_DrawLine(0, 0, 127, 63, 0);      
      Dyanshi(10*DTIME);                 //延时     
      WriteByteInt( 0X7FA4 , ch);   	  
   }   
      //加载第0屏
     Dyanshi(10*DTIME);                 //延时
     B_DrawLine(0, 63, 127, 0, 0);
     B_DrawLine(0, 0, 127, 63, 0);    
     Dyanshi(10*DTIME);               //延时  
     WriteToLCD(ScreenNumber);

   RI=0;
   while(1)                      //进入消息处理循环
   {
     if(RI)
     {
          RI = 0;
          ch=SBUF;               //接收到一个字节数据
          if(Rec_flag==1)        //在命令接收状态
          {
          	if(ch==CMD_ETX)//如果为"命令尾"
          	{
                     Cmd_Length=Cmd_counter;
                     //BCOM_SendData(0xcc);
                     BCOM_MsgLoop(Cmd_Length);//处理命令
                     Rec_flag=0;  //并重新接收命令
          	}
          	else //将接收到的数据写入EPROM指令位置,计数值++
          	{
                    //BCOM_SendData(ch);
                    WriteByteInt( Cmd_counter+ STARTADD  , ch);
                    Cmd_counter++;  //在当前位置写入一个数据
          	}
          }
          else //不在命令接收状态
          {
          	if(ch==CMD_SOH)//如果为"命令头"
          	{
          	    Rec_flag=1;  //进入命令接收状态
                    Cmd_counter=0;
          	}
          	else
          	{
          	     //将写入EPROM位置指针置初值
          	     Cmd_counter=0;  //重新写入连续写入命令及地址
                     Cmd_Length=0;
                     Rec_flag=0;  //并重新接收命令
          	}
          }
     }
     else /*  注:如果程序影响了串口数据接收,则去掉些ELSE部分 */
     {
     	  //在此处处理键盘事件
          chKey=Get_Key();
          if(chKey!=0)//目前无键盘,但返回值为1(注)
             BKEY_Pro(chKey);//处理外部按键事件(串口返回数据线PC机)     
     }
   }
}

void nop()
{
	 ;
}
/*****************************
延时程序
******************************/
extern void Dyanshi(uchar xms)
{
    while(--xms);
}
void ChangeAscii(uchar *AscII)
{
	if(*AscII<0x40)
	  *AscII-=ASCIIDEL;
	else
	  *AscII-=ASCIIFDEL;
}
/*****************************
工作开始,当SCL=1时,SDA由高变低开始
******************************/
static void start()	//设置开始
{
	SDA = 1;
	nop();
	SCL = 1;
	nop();
	Dyanshi(DTIME);
	SDA = 0;
	Dyanshi(DTIME);
	SCL = 0;
	nop();
}

/*****************************
无应答
******************************/
static void noack()
{
	SDA = 1;
	Dyanshi(DTIME);
	SCL = 1;       //多发一个脉冲
	Dyanshi(DTIME);
	SCL = 0;
	Dyanshi(DTIME);
        SDA = 0;
}

/*****************************
工作停止,当SCL=1时,SDA由低变高开始
******************************/
static void stop()	//设置停止
{
	SDA = 0;
	Dyanshi(2*DTIME);
	SCL = 1;
	Dyanshi(2*DTIME);
	SDA = 1;
	Dyanshi(2*DTIME);
	SCL = 0;
}

/*****************************
检查ACK的返回值
******************************/
static void checkack()
{
	do
	{
		SDA = 1;
		Dyanshi(DTIME);
		SCL = 1;
		Dyanshi(DTIME);
		SCL = 0;
	}while(SDA);
}

/*****************************
向24LC256中写入数据
wdat-写入的数据值
******************************/
static void WriteData(uchar wdat)
{
	uchar ll;
	SCL = 0;
	for(ll=0;ll<8;ll++)
	{
		SDA = (wdat&0x80)>>7;	//数据由高到低位写入
		wdat = wdat << 1;
		SCL = 1;
		Dyanshi(2*DTIME);
		SCL = 0;
	}
	checkack();
}

/*****************************
向24LC256任意位置写入一个字节数据
HAdd-24LC256高7位地址
LAdd-24LC256低8位地址
dat-写入的字节数据
******************************/
static void WriteByte(uchar HAdd, uchar LAdd, uchar dat)
{
	start();
	nop();
	WriteData(WTCMD);
	nop();
	WriteData(HAdd);
	nop();
	WriteData(LAdd);
	nop();
	WriteData(dat);
	nop();
	stop();
}



/*****************************
从24LC256中读出数据
返回值为读出的数据值
******************************/
static uchar ReadData()
{
	uchar i,rdat;
	SDA = 1;
	for(i=0;i<8;i++)
	{
		if(i != 0)
			rdat = rdat<<1;
		SCL = 0;
		Dyanshi(DTIME);
		SCL = 1;
		rdat = rdat|SDA;
	}
	SCL = 0;
	return rdat;
}

/*****************************

⌨️ 快捷键说明

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