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

📄 lcd_init.h

📁 用proteus仿真的万年历.rar
💻 H
字号:
/***************************************************
* 标题:LCD操作                                    *
* 作者:Wujieflash                                 *
* 日期:2008年1月12日                              *
* 说明:KS0108系列液晶不带字库                     *
***************************************************/
#include <pic.h>

#define E    RA0								//液晶使能端
#define RW   RA1								//读写控制端
#define DI   RA2								//数据/指令通道
#define CSA  RA5								//片选
#define CSB  RA3								//片选
#define nop() asm("nop")

////////////////////////基本子函数///////////////////////
//延时
void delay(char x,char y) 
{
  char z;
  do{
      z=y;
      do{;}while(--z);
     }while(--x);
 }
//其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。
//则是:14+(3*(Y-1)+7)*(X-1)。
/*----------------------------------------------------*/

//状态检查
void CheckState()
{
	unsigned int dat;
	RW=1;                             //读状态
	DI=0;
	TRISB=0xff;                       //设置口为输入
	while(1)
	{
		E=1;                          //高电平读数据
		dat=PORTB&0x90;               //当4、7位为0时为正常状态
		E=0;
		if(dat==0x00)break;
	}
	TRISB=0x00;                       //恢复口为输出
}
/*----------------------------------------------------*/

//写显示数据
//dat:显示数据
void WriteData(unsigned char dat)
{
	CheckState();
	DI=1;                            //写数据
	RW=0;
	PORTB=dat;
	E=1;
	E=0;
}
/*---------------------------------------------------*/

//写指令
//command:操作LCD的指令
void WriteCommand(unsigned char dat)
{
	CheckState();
	RW=0;                          //写指令
	PORTB=dat;
	E=1;
	E=0;
}
/*---------------------------------------------------*/

//设定页地址----X:0--7
void SetLine(unsigned char line)
{
	line=line&0x07;               //0<=line<=7	
	line=line|0xb8;
	WriteCommand(line);
}
/*---------------------------------------------------*/

//设定列地址----Y:0--63
void SetColumn(unsigned char column)
{
	column=column&0x3f;          //0<=column<=63
	column=column|0x40;
	WriteCommand(column);
}
/*--------------------------------------------------*/

//设定开始行
void SetStartLine(unsigned char startline)
{
	startline=startline&0x3f;   //0<=startline<=63
	startline=startline|0xc0;
	WriteCommand(startline);
}
/*--------------------------------------------------*/

//开关显示
//1:开显示  0:关显示
void SetOnOff(unsigned char state)
{
	state=state|0x3e;
	WriteCommand(state);
}
/*--------------------------------------------------*/

//选择屏幕
//screen: 1:左屏 2:右屏
void SlectScreen(unsigned char screen)
{
	switch(screen)
	{
		case 1: CSA=0;
		 		CSB=1;//左屏
		 		break;
		case 2: CSA=1;
				CSB=0;//右屏
				break;
	}
}
/*--------------------------------------------------*/

//清屏
//screen: 1:左屏 2:右屏
void ClearScreen(unsigned char screen)
{
	unsigned char i,j;
	SlectScreen(screen);
	for(i=0;i<8;i++)
	{
		SetLine(i);
		for(j=0;j<64;j++)
		{
			WriteData(0x00);
			WriteData(0x00);
		}
	}
}
/*---------------------------------------------------*/

//显示一个16X16的汉字
void Show16X16(unsigned char line,unsigned char column,const unsigned char *pt,uch mode)
{
	unsigned char i,column_temp;
	uch wei_1,wei_2;
	if(mode==0){wei_1=0x00;wei_2=0x00;}
	if(mode==1){wei_1=0x01;wei_2=0x00;}
	if(mode==2){wei_1=0x00;wei_2=0x80;}
	column_temp=column;
	SlectScreen(1);                      //选通左屏
	SetColumn(column);                   //设置起始列
	SetLine(line);                       //设置行
	for(i=0;i<16;i++)
	{
		if(column>=64)                   //如果列>=64,则选通右屏
		{
			SlectScreen(2);
			column=column%64;            //设置右屏起始列
			SetColumn(column);
			SetLine(line);
		}	
		WriteData(*pt|wei_1);                  //写数据
		*pt++;//
		column++;
	}
	SlectScreen(1);
	SetLine(line+1);                    //设置汉字下半部分显示页
	column=column_temp;
	SetColumn(column);
	for(i=0;i<16;i++)
	{
		if(column>=64)
		{
			SlectScreen(2);
			column=column%64;
			SetColumn(column);
			SetLine(line+1);
		}	
		WriteData(*pt|wei_2);
		*pt++;
		column++;
	}
}
/*-------------------------------------------------------*/

//显示一个8X16的字符
void Show8X16(unsigned char line,unsigned char column,const unsigned char *pt,uch mode)
{
	unsigned char i,column_temp;
	uch wei_1,wei_2;
	if(mode==0){wei_1=0x00;wei_2=0x00;}
	if(mode==1){wei_1=0x01;wei_2=0x00;}
	if(mode==2){wei_1=0x00;wei_2=0x80;}
	column_temp=column;
	SlectScreen(1);                          //选通左屏
	SetColumn(column);                       //设置起始列
	SetLine(line);                           //设置行
	for(i=0;i<8;i++)
	{
		if(column>=64)                       //如果列>=64,则选通右屏
		{
			SlectScreen(2);
			column=column%64;                //设置右屏起始列
			SetColumn(column);
			SetLine(line);
		}	
		WriteData(*pt|wei_1);                      //写数据
		*pt++;
		column++;
	}
	SlectScreen(1);
	SetLine(line+1);                         //设置汉字下半部分显示页
	column=column_temp;
	SetColumn(column);
	for(i=0;i<8;i++)
	{
		if(column>=64)
		{
			SlectScreen(2);
			column=column%64;
			SetColumn(column);
			SetLine(line+1);
		}	
		WriteData(*pt|wei_2);
		*pt++;
		column++;
	}
}
/*-------------------------------------------------------*/

//显示一个16X32的字符
void Show16X32(unsigned char line,unsigned char column,const unsigned char *pt)
{
	unsigned char i,column_temp1,column_temp2,column_temp3;
	column_temp1=column;
	column_temp2=column;
	column_temp3=column;
	SlectScreen(1);                         //选通左屏
	SetColumn(column);                      //设置起始列
	SetLine(line);                          //设置行
	for(i=0;i<16;i++)
	{
		if(column>=64)                      //如果列>=64,则选通右屏
		{
			SlectScreen(2);
			column=column%64;               //设置右屏起始列
			SetColumn(column);
			SetLine(line);
		}	
		WriteData(*pt);                     //写数据
		*pt++;
		column++;
	}
	SlectScreen(1);
	SetLine(line+1);
	column=column_temp1;
	SetColumn(column);
	for(i=0;i<16;i++)
	{
		if(column>=64)
		{
			SlectScreen(2);
			column=column%64;
			SetColumn(column);
			SetLine(line+1);
		}	
		WriteData(*pt);
		*pt++;
		column++;
	}
	SlectScreen(1);
	SetLine(line+2);
	column=column_temp2;
	SetColumn(column);
	for(i=0;i<16;i++)
	{
		if(column>=64)
		{
			SlectScreen(2);
			column=column%64;
			SetColumn(column);
			SetLine(line+2);
		}	
		WriteData(*pt);
		*pt++;
		column++;
	}
	SlectScreen(1);
	SetLine(line+3);
	column=column_temp3;
	SetColumn(column);
	for(i=0;i<16;i++)
	{
		if(column>=64)
		{
			SlectScreen(2);
			column=column%64;
			SetColumn(column);
			SetLine(line+3);
		}	
		WriteData(*pt);
		*pt++;
		column++;
	}
}
/*-------------------------------------------------------*/

//LCD初始化子程序
void LCDinit()
{
	ADCON1=0x06;
	TRISA=0x00;
	TRISB=0x00;
	PORTB=0x00;
	SetOnOff(1);
}
/*----------------------------------------------------------*/

//调用LCD显示子程序
void ChangeToLCD(uch line,uch column,uch data,uch mode)
{
	int D_ge,D_shi;
	
	D_ge=data%10;                           //取个位
	D_shi=data%100/10;                      //取十位
	
	switch(D_ge)
	{
		case 0:{Show8X16(line,column+8,s0,mode);break;}
		case 1:{Show8X16(line,column+8,s1,mode);break;}
		case 2:{Show8X16(line,column+8,s2,mode);break;}
		case 3:{Show8X16(line,column+8,s3,mode);break;}
		case 4:{Show8X16(line,column+8,s4,mode);break;}
		case 5:{Show8X16(line,column+8,s5,mode);break;}
		case 6:{Show8X16(line,column+8,s6,mode);break;}
		case 7:{Show8X16(line,column+8,s7,mode);break;}
		case 8:{Show8X16(line,column+8,s8,mode);break;}
		case 9:{Show8X16(line,column+8,s9,mode);break;}
	}
	switch(D_shi)
	{
		case 0:{Show8X16(line,column,s0,mode);break;}
		case 1:{Show8X16(line,column,s1,mode);break;}
		case 2:{Show8X16(line,column,s2,mode);break;}
		case 3:{Show8X16(line,column,s3,mode);break;}
		case 4:{Show8X16(line,column,s4,mode);break;}
		case 5:{Show8X16(line,column,s5,mode);break;}
		case 6:{Show8X16(line,column,s6,mode);break;}
		case 7:{Show8X16(line,column,s7,mode);break;}
		case 8:{Show8X16(line,column,s8,mode);break;}
		case 9:{Show8X16(line,column,s9,mode);break;}
	}	
}
/*-----------------------------------------------------------------*/

void ChangeToLCD3(uch line,uch column,uch data)
{
	int D_ge,D_shi;
	
	D_ge=data%10;                           //取个位
	D_shi=data%100/10;                      //取十位
	
	switch(D_ge)
	{
		case 0:{Show16X32(line,column+16,ss0);break;}
		case 1:{Show16X32(line,column+16,ss1);break;}
		case 2:{Show16X32(line,column+16,ss2);break;}
		case 3:{Show16X32(line,column+16,ss3);break;}
		case 4:{Show16X32(line,column+16,ss4);break;}
		case 5:{Show16X32(line,column+16,ss5);break;}
		case 6:{Show16X32(line,column+16,ss6);break;}
		case 7:{Show16X32(line,column+16,ss7);break;}
		case 8:{Show16X32(line,column+16,ss8);break;}
		case 9:{Show16X32(line,column+16,ss9);break;}
	}
	switch(D_shi)
	{
		case 0:{Show16X32(line,column,ss0);break;}
		case 1:{Show16X32(line,column,ss1);break;}
		case 2:{Show16X32(line,column,ss2);break;}
		case 3:{Show16X32(line,column,ss3);break;}
		case 4:{Show16X32(line,column,ss4);break;}
		case 5:{Show16X32(line,column,ss5);break;}
		case 6:{Show16X32(line,column,ss6);break;}
		case 7:{Show16X32(line,column,ss7);break;}
		case 8:{Show16X32(line,column,ss8);break;}
		case 9:{Show16X32(line,column,ss9);break;}
	}	
}
/*-----------------------------------------------------------------*/

void ChangeToLCD4(uch line,uch column,uch data)//星期转换
{                     
	switch(data)
	{
		case 1:{Show16X16(line,column,ri,2);break;}
		case 2:{Show16X16(line,column,yi,2);break;}
		case 3:{Show16X16(line,column,er,2);break;}
		case 4:{Show16X16(line,column,san,2);break;}
		case 5:{Show16X16(line,column,si,2);break;}
		case 6:{Show16X16(line,column,wu,2);break;}
		case 7:{Show16X16(line,column,liu,2);break;}
	}	
}


void ChangeToLCD6(uch line,uch column,uch data)//阴历月转换
{   
	//data=data%12;                  
	switch(data)
	{
		case 1:{Show16X16(line,column,zheng,2) ;break;}
		case 2:{Show16X16(line,column,er,2)    ;break;}
		case 3:{Show16X16(line,column,san,2)   ;break;}
		case 4:{Show16X16(line,column,si,2)    ;break;}
		case 5:{Show16X16(line,column,wu,2)    ;break;}
		case 6:{Show16X16(line,column,liu,2)   ;break;}
		case 7:{Show16X16(line,column,qqi,2)   ;break;}
		case 8:{Show16X16(line,column,ba,2)    ;break;}
		case 9:{Show16X16(line,column,jiu,2)   ;break;}
		case 10:{Show16X16(line,column,shi,2)  ;break;}
		case 11:{Show16X16(line,column,shiyi,2);break;}
		case 0:{Show16X16(line,column,la,2)    ;break;}
	}	
}
/*-----------------------------------------------------------------*/

void ChangeToLCD7(uch line,uch column,uch data)//阴历日
{   
	uch D_ge,D_shi;
	D_shi=data/10;
	D_ge=data%10; 
	if(data==10)
	{
		D_shi=0;
		D_ge=0;
	}                 
	switch(D_ge)
	{
		case 0:{Show16X16(line,column+16,shi,2);break;}
		case 1:{Show16X16(line,column+16,yi,2) ;break;}
		case 2:{Show16X16(line,column+16,er,2) ;break;}
		case 3:{Show16X16(line,column+16,san,2);break;}
		case 4:{Show16X16(line,column+16,si,2) ;break;}
		case 5:{Show16X16(line,column+16,wu,2) ;break;}
		case 6:{Show16X16(line,column+16,liu,2);break;}
		case 7:{Show16X16(line,column+16,qqi,2);break;}
		case 8:{Show16X16(line,column+16,ba,2) ;break;}
		case 9:{Show16X16(line,column+16,jiu,2);break;}
	}
	switch(D_shi)
	{
		case 0:{Show16X16(line,column,chu,2);break;}
		case 1:{Show16X16(line,column,shi,2);break;}	
		case 2:{Show16X16(line,column,ershi,2);break;}
		case 3:{Show16X16(line,column,san,2);break;}
	}	
}
/*-----------------------------------------------------------------*/

⌨️ 快捷键说明

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