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

📄 lcd.c

📁 万年历系统
💻 C
字号:
/**********************************************************************
  LCD.C file
  类型定义
  作者:
  建立日期:
  修改日期:
  版本:V1.0
  版权所有,盗版必究。
  Copyright(C) 
  All rights reserved
**********************************************************************/
#include <reg51.h>
#include <lcd.h>
#include <HzCode.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define LCD12864DataPort P1
/******************************LCD I/O define*************************/
sbit DI=P2^0;		//data or command select
sbit RW=P2^2;		//read or write select 
sbit EN=P2^1 ;       //enable read or write
sbit CS1=P2^3 ;		// 0  
sbit CS2=P2^4;		// 0


/*******************************函数*********************************/
void nop()
{
 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}

/******************************************************************/
void CheckState(void)
{
//  uchar dat;
  DI=0;
  RW=1;
  /*do{
     P1=0xFF;
	 EN=1;
	 dat=P1;
	 EN=0;
	 dat=dat&0x80;	//status read DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0  DB7=0时表示已经准备好 
	 }while(dat);  */  //           busy 0  on/off  Rest 0    0    0    0
}
/******************************************************************/
void WriteByte(uchar dat)
{
 CheckState();
 DI=1;
 RW=0;
 LCD12864DataPort=dat;
 EN=1;
 EN=0;
}
/*****************************************************************/
void SendComToLcd(uchar command)
{
 CheckState();
 DI=0;
 RW=0;
 LCD12864DataPort=command;
 EN=1;
 EN=0;
}
/****************************************************************/
//设定行地址(页)--X 0-7
void SetLine(uchar line)
{
 line=line&0x07;
 line=line|0xB8;
 SendComToLcd(line);
}
//设定列地址--Y 0-63
void SetColumn(uchar column)
{
 column=column&0x3f;
 column=column|0x40;
 SendComToLcd(column);
}
//设定显示开始行--XX
void SetStartLine(uchar startline)
{
 startline=startline|0xC0;
 SendComToLcd(startline);
}
//开关显示
void SetOnOFF(uchar OnOff)
{
 OnOff=OnOff|0x3E;
 SendComToLcd(OnOff);
}
/*******************************************************************/
//选择屏幕
//0 全屏 1 左屏 2 右屏
void SelectScreen(uchar Screen)
{
  switch(Screen)
  {
   case 0:
   		  CS1=0;
		  nop();
		  CS1=0;
		  nop();
		  break;
	case 1:
		  CS1=1;
		  nop();
		  CS2=0;
		  nop();
		  break;
	case 2:
	      CS1=0;
		  nop();
		  CS2=1;
		  nop();
		  break;
	default:
		  break;
         
  }
}
/****************************************************************************/
// clear screen
void ClearScreen(uchar screen)
{
 uchar i,j;
 SelectScreen(screen);
 for(i=0;i<8;i++)
 {   SetLine(i);
     for(j=0;j<64;j++)
	 {
	  WriteByte(0x00);
	  }
  }
}
/***************************************************************************/
//show 8*8 
//lin(0--7) col(0--127)
//address 字模首地址
void Show8X8(uchar lin,uchar column,uchar *address)
{
 uchar i;
 if(column<64)
 { 
  SelectScreen(1);
  SetLine(lin);
  SetColumn(column);
  for(i=0;i<8;i++)
   {
      if((column+i)<64)
	  {
	   WriteByte(*(address+i));
	  }
	  else
	  {
	   SelectScreen(2);
	   SetLine(lin);
	   SetColumn(column-64+i);
	   WriteByte(*(address+i));
	  }

   }
  }
  else
  {
   SelectScreen(2);
   column=column-64;
   SetLine(lin);
   SetColumn(column);
   for(i=0;i<8;i++)
   {
    if(i+column<64)
	 {
	  WriteByte(*(address+i));
	 }
	else
	 {
	  SelectScreen(1);
	  SetLine(lin);
	  SetColumn(column-64+i);
	  WriteByte(*(address+i));
	 }
   }
  }
}
/*******************************************************************************/
//显示数字8*16
//入口参数:lin 行值;column  列值;num 码表中的位置
void ShowNumber(uchar lin,uchar column,uchar num)
{
 uchar *address;
 address=&NumCode[num][0];
 Show8X8(lin,column,address);
 Show8X8(lin+1,column,address+8);
}
/******************************************************************************/
//显示汉字16*16
//入口参数:lin 行值;column  列值;num 码表中的位置
void ShowChina(uchar lin,uchar column,uchar num) 
{
 uchar *address;
 address=&HzCode[num][0];
 Show8X8(lin,column,address);
 Show8X8(lin,column+8,address+8);
 Show8X8(lin+1,column,address+16);
 Show8X8(lin+1,column+8,address+24);
}

/*****************************************************************************/
void InitLCD()
{
 uchar i=2000;
 while(i--);
 SetOnOFF(1);
 ClearScreen(1);
 ClearScreen(2);
 SetStartLine(0);
}
/*************************************************************************/

void r_show8x8(uchar lin,uchar column,uchar *address)
{ 
	uchar i,r_data;
	if(column<64)
	{
		SelectScreen(1); //如果列数<64则从第一屏上开始写
		SetLine(lin);
		SetColumn(column);
		for(i=0;i<8;i++)
		{
			if(column+i<64)
			{
				r_data = ~(*(address+i));
				WriteByte(r_data);
			}
			else
			{
				SelectScreen(2);
				SetLine(lin);
				SetColumn(column-64+i);
				r_data = ~(*(address+i));
				WriteByte(r_data);
			}
		}
	}
	else 
	{
		SelectScreen(2); //否则从第二屏上开始写
		column-=64; //防止越界
		SetLine(lin);
		SetColumn(column);
		for(i=0;i<8;i++)
		{
			if(column+i<64)
			{
				r_data = ~(*(address+i));
				WriteByte(r_data);
			}
			else
			{
				SelectScreen(1);
				SetLine(lin);
				SetColumn(column-64+i);
				r_data = ~(*(address+i));
				WriteByte(r_data);
			}
		}
	}
}

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

void r_ShowNumber(uchar lin,uchar column,uchar num)
{
	uchar *address;
	address=&NumCode[num][0];
	r_show8x8(lin,column,address);
   	r_show8x8(lin+1,column,address+8);
}

void r_ShowChina(uchar lin,uchar column,uchar num) 
{
 uchar *address;
 address=&HzCode[num][0];
 r_show8x8(lin,column,address);
 r_show8x8(lin,column+8,address+8);
 r_show8x8(lin+1,column,address+16);
 r_show8x8(lin+1,column+8,address+24);
}

⌨️ 快捷键说明

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