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

📄 s6b0108.c

📁 电表解决方案概要power_meter_r8c2g_source_code
💻 C
📖 第 1 页 / 共 2 页
字号:

#include "sfr_r82b.h"
#include "s6b0108.h"
#include "disp_definel.h"


void Delay(int);									/*  延时子程序  */
void Long_Delay(int);						/*  长延时子程序  */
void Write_0108_Reg(unsigned char);				/*  KS0108寄存器写入函数  */
void Write_0108_Data(unsigned char);				/*  KS0108显示数据写入函数  */
void Set_XY(unsigned char, unsigned char);		/*  设置地址,X方向以点为单位,Y方向以page为单位  */
void Init_0108();									/*  KS0108寄存器初始化函数  */
void Clr_Screen_0();								/*  清除KS0108显示存储器  */
void Clr_Screen_1();
void Clr_Screen_2();
void Set_Screen3();								/*  清除KS0108显示存储器  */

void Set_Screen(unsigned char, unsigned char far *);
void Comp_Set_Screen(unsigned char, unsigned char, unsigned char, unsigned char far *);
//void Set_Page(unsigned char, unsigned char, unsigned char *);
void Set_Caracter(unsigned char, unsigned char, unsigned char, unsigned char far *);
void Set_Char(unsigned char, unsigned char, unsigned char, unsigned char far *);
void FSH_Set_Two_Page(unsigned char, unsigned char, unsigned char far *);

unsigned char Read_0108_Data();				/*  读取KS0108显示数据函数  */
unsigned char Data_Convert(unsigned char);	/*  对数据按总线排列进行转换  */

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

union lcd_byte_def{

	unsigned char lcd_byte;

	struct{

	unsigned char lb0:1;
	unsigned char lb1:1;
	unsigned char lb2:1;
	unsigned char lb3:1;
	unsigned char lb4:1;
	unsigned char lb5:1;
	unsigned char lb6:1;
	unsigned char lb7:1;

	}lcd_bit;
};

union lcd_byte_def Lcd_Byte_0;
union lcd_byte_def Lcd_Byte_1;
union lcd_byte_def Lcd_Byte_2;

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

/****************************************************************
  延时子程序
****************************************************************/

void Delay(int t)
{
	while(--t);
}

/****************************************************************
  长延时子程序
****************************************************************/

void Long_Delay(int t)
{
	int n = 0xff;
	
	while(--t)
	{
		while(--n);
		n = 0xff;
	}
}

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

unsigned char Data_Convert(unsigned char lcd_data)

数据总线转换函数,根据硬件线路特点调整LCD显示输出数据

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

unsigned char Data_Convert(unsigned char lcd_data)
{
  Lcd_Data_0 = lcd_data;
  Lcd_Data_1 = lcd_data;
  
  Lcd_Data_0 &= 0x0f;
  Lcd_Data_1 &= 0xf0;
    
  Lcd_Bit_7 = Lcd_Bit_0;						/* LCD显示输出数据高低位调整 */
  Lcd_Bit_6 = Lcd_Bit_1;  
  Lcd_Bit_5 = Lcd_Bit_2;
  Lcd_Bit_4 = Lcd_Bit_3;
  
  Lcd_Data_0 &= 0xf0;
  
  Lcd_Data_0 = Lcd_Data_0 >> 4;	   
  Lcd_Data_2 = Lcd_Data_0 |  Lcd_Data_1;	 	/* 生成调整后的LCD显示输出数据 */

  return Lcd_Data_2;							/* 返回LCD输出数据 */
  
}

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

void Write_0108_Reg(unsigned char Reg_Code)

KS0108寄存器写入函数,用于控制对LCD的操作

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

void Write_0108_Reg(unsigned char Reg_Code)
{
	unsigned char bus_low;
	unsigned char bus_high;
	
	bus_low = bus_high = Data_Convert(Reg_Code);		/* 输出LCD控制命令:Reg_Code */
	
	bus_low &= 0x0f;				/* 调整数据位 */
	bus_high &= 0xf0;
	
	bus_high = bus_high >> 4;		
		
	DI = 0;							/* 控制命令输出 */
//	RW = 0;
	Lcd_Bus_L &= 0xf0;
	Lcd_Bus_H &= 0xf0;
	Lcd_Bus_L |= bus_low;
	Lcd_Bus_H |= bus_high;
	E = 1;
	E = 0;
}

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

void Write_0108_Data(unsigned char Bus_Data)

KS0108显示数据写入函数

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

void Write_0108_Data(unsigned char Bus_Data)
{
	unsigned char bus_low;
	unsigned char bus_high;
	
	bus_low = bus_high = Data_Convert(Bus_Data);		/* 输出LCD显示数据:Bus_Data */
	
	bus_low &= 0x0f;
	bus_high &= 0xf0;
	
	bus_high = bus_high >> 4;
			
	DI = 1;						/* 显示数据输出 */
//	E = 1;
//	RW = 0;
	Lcd_Bus_L &= 0xf0;
	Lcd_Bus_H &= 0xf0;
	Lcd_Bus_L |= bus_low;
	Lcd_Bus_H |= bus_high;
	E = 1;
//	asm("nop");
	E = 0;
}

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

unsigned char Read_0108_Data()

读取KS0108显示数据函数, 

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

unsigned char Read_0108_Data()
{
	unsigned char Bus_Data_0;
	unsigned char Bus_Data_1;
	
	DI = 1;
//	RW = 1;
	Lcd_Bus_L &= 0xf0;
	Lcd_Bus_H &= 0xf0;	
	E = 1;						/* 数据地址输出 */
	Bus_Data_1 = Lcd_Bus_H;
	Bus_Data_0 = Lcd_Bus_L;
	E = 0;						/* 显示数据读入 */
	
	Bus_Data_1 = Bus_Data_1 << 4;	
	Bus_Data_0 &= 	0xf0;
	Bus_Data_0 |= Bus_Data_1;
	
	return Bus_Data_0;
	
}

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

void Set_XY(unsigned char X_Column,  unsigned char Y_Page)

设置地址,X方向以点为单位,Y方向以page为单位
  
****************************************************************/

void Set_XY(unsigned char X_Column,  unsigned char Y_Page)
{
	Write_0108_Reg(Set_Page+Y_Page);
	Write_0108_Reg(Set_Column+X_Column);
}

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

void Init_0108()

KS0108寄存器初始化函数
  
****************************************************************/

void Init_0108()
{
	Delay(100);
	CSA=0;					/* 初始化显示屏0 */
	CSB=0;
	Delay(100);
	Write_0108_Reg(Set_Disp_Off);
	Write_0108_Reg(Set_Start_Line);
	Write_0108_Reg(Set_Page);
	Write_0108_Reg(Set_Column);
	Write_0108_Reg(Set_Disp_On);
	Delay(100);
	CSA=0;					/* 初始化显示屏1 */
	CSB=1;
	Delay(100);
	Write_0108_Reg(Set_Disp_Off);
	Write_0108_Reg(Set_Start_Line);
	Write_0108_Reg(Set_Page);
	Write_0108_Reg(Set_Column);
	Write_0108_Reg(Set_Disp_On);
	Delay(100);
	CSA=1;					/* 初始化显示屏2 */
	CSB=0;
	Delay(100);
	Write_0108_Reg(Set_Disp_Off);
	Write_0108_Reg(Set_Start_Line);
	Write_0108_Reg(Set_Page);
	Write_0108_Reg(Set_Column);
	Write_0108_Reg(Set_Disp_On);
		
}


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

void Clr_Screen_0()

清除KS0108显示屏 0 存储器
  
****************************************************************/
void Clr_Screen_0()
{
	unsigned char j, k;
	unsigned int n=0;

	CSA=0;
	CSB=0;
	Delay(100);
	for(k=0;k<8;k++)
	{
		Write_0108_Reg(Set_Page+k);				/* 设置起始页 */
		Write_0108_Reg(Set_Column);				/* 设置起始列 */
		Write_0108_Reg(Set_Start_Line_0);		/* 设置起始行 */
		
		for(j=0;j<64;j++) 
		{
			Write_0108_Data(0x00);				/* 清屏时,写入值为0 */
			n++;
		}
		
	}
}

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

void Clr_Screen_1()

清除KS0108显示屏 1 存储器
  
****************************************************************/

void Clr_Screen_1()
{
	unsigned char j, k;
	unsigned int n=0;

	CSA=0;
	CSB=1;
	Delay(100);
	for(k=0;k<8;k++)
	{
		Write_0108_Reg(Set_Page+k);
		Write_0108_Reg(Set_Column);
		Write_0108_Reg(Set_Start_Line_0);
		
		for(j=0;j<64;j++) 
		{
			Write_0108_Data(0x00);
			n++;
		}
		
	}
}

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

void Clr_Screen_2()

清除KS0108显示屏 2 存储器
  
****************************************************************/

void Clr_Screen_2()
{
	unsigned char j, k;
	unsigned int n=0;

	CSA=1;
	CSB=0;
	Delay(100);
	for(k=0;k<8;k++)
	{
		Write_0108_Reg(Set_Page+k);
		Write_0108_Reg(Set_Column);		
		Write_0108_Reg(Set_Start_Line_0);
		
		for(j=0;j<64;j++) 
		{
			Write_0108_Data(0x00);
			n++;
		}
		
	}
}

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

void Set_Char(unsigned char cs, unsigned char page, unsigned char num, unsigned char far * bitmap)

字符输入程序:

cs: 需要输入字符的液晶屏,CS1, CS2 或 CS3;

page: 需要输入字符的起始页

num: 输入字符前的空格数,单位为列

bitmap:点阵数据表地址
  
******************************************************************************************************/

void Set_Char(unsigned char cs, unsigned char page, unsigned char num, unsigned char far * bitmap)		// num = 0,7;
{
	unsigned char j, k;
	unsigned int n=0;
	unsigned int i;
	
	unsigned char a,b;
	
	if (cs == CS1)
	 {
		CSA=0;
		CSB=0;
	 }
	else if (cs == CS2)
	 {
		CSA=0;
		CSB=1;
	 }
	else if (cs == CS3)
	 {
		CSA=1;
		CSB=0;
	 }
	 
	Delay(100);	
	
	Write_0108_Reg(Set_Page + page);					/* 设起始页 */
	Write_0108_Reg(Set_Column + num);					/* 设起始列 */
	Write_0108_Reg(Set_Start_Line_0);					/* 设起始行 */
	
	if (page == 2)					/* 当需要显示的页为第2页时,由于需要保留菜单边框,需要将字符数据与 0x01 进行或运算 */
	 {
		for(j=0;j<8;j++) 
	 	 {
			 
			b = bitmap[n];
			a = b | 0x01;
			Write_0108_Data(a);					
			n++;
	 	 }
	 }
	else 
	 {
		for(j=0;j<8;j++) 
	 	 {
			Write_0108_Data(bitmap[n]);
			n++;
	 	 }		 
	 }
	
	page += 1;
	
	Write_0108_Reg(Set_Page + page);
	Write_0108_Reg(Set_Column + num);
	
	if (page == 7)					/* 当需要显示的页为第7页时,由于需要保留菜单边框,需要将字符数据与 0x08 进行或运算 */
	 {
		for(j=0;j<8;j++) 
	 	 {
			 
			b = bitmap[n];
			a = b | 0x80;
			Write_0108_Data(a);					
			n++;
	 	 }
	 }
	else 
	 {
		for(j=0;j<8;j++) 
	 	 {
			Write_0108_Data(bitmap[n]);
			n++;
	 	 }		 
	 }
	 
}


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

void Set_Caracter(unsigned char cs, unsigned char page, unsigned char num, unsigned char far * bitmap)

汉字显示程序:正常显示一个汉字

cs: 需要输入字符的液晶屏,CS1, CS2 或 CS3;

page: 需要输入字符的起始页

num: 输入字符前的空格数,单位为列

bitmap:点阵数据表地址

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

void Set_Caracter(unsigned char cs, unsigned char page, unsigned char num, unsigned char far * bitmap)
{
	unsigned char j, k;
	unsigned int n=0;
	unsigned int i;
	
	if (cs == CS1)
	 {
		CSA=0;
		CSB=0;
	 }
	else if (cs == CS2)
	 {
		CSA=0;
		CSB=1;
	 }
	else if (cs == CS3)
	 {
		CSA=1;
		CSB=0;
	 }
	 
	Delay(100);
	
	Write_0108_Reg(Set_Page + page);				/* 设起始页 */
	Write_0108_Reg(Set_Column + num * 8);			/* 设起始列 */
	Write_0108_Reg(Set_Start_Line_0);				/* 设起始行 */

	for(j=0;j<16;j++) 
	 {
		Write_0108_Data(bitmap[n]);
		n++;
	 }
	
	page += 1;
	
	Write_0108_Reg(Set_Page + page);				/* 设第二页 */
	Write_0108_Reg(Set_Column + num * 8);
	
	for(j=0;j<16;j++) 
	 {
		Write_0108_Data(bitmap[n]);
		n++;
	 }
	 
}

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

两页同时显示程序:一次显示两页内容

cs: 需要输入字符的液晶屏,CS1, CS2 或 CS3;

page: 需要输入字符的起始页

bitmap:点阵数据表地址
  
****************************************************************/

void Set_Two_Page(unsigned char cs, unsigned char page, unsigned char far * bitmap)
{
	unsigned char j, k;
	unsigned int n=0;
	unsigned int i;
	
	if (cs == CS1)
	 {
		CSA=0;
		CSB=0;
	 }
	else if (cs == CS2)
	 {
		CSA=0;
		CSB=1;
	 }
	else if (cs == CS3)
	 {
		CSA=1;
		CSB=0;
	 }
	 
	Delay(100);

	Write_0108_Reg(Set_Page + page);
	Write_0108_Reg(Set_Column);
	Write_0108_Reg(Set_Start_Line_0);

	for(j=0;j<64;j++) 
	{
		if (j<63)
		Write_0108_Data(bitmap[n]);
		else 
		Write_0108_Data(~bitmap[n]);		/* 当需要显示的行为第63行时,由于需要保留菜单边框 */
		
		n++;
	}
	
	page += 1;
	
	Write_0108_Reg(Set_Page + page);
	Write_0108_Reg(Set_Column);
	
	for(j=0;j<64;j++) 
	 {
		if (j<63)
		Write_0108_Data(bitmap[n]);
		else 
		Write_0108_Data(~bitmap[n]);		/* 当需要显示的行为第63行时,由于需要保留菜单边框 */		
		
		n++;
	 }
	 
}

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

两页闪烁显示程序:一次显示两个空白页

cs: 需要输入字符的液晶屏,CS1, CS2 或 CS3;

page: 需要输入字符的起始页

bitmap:点阵数据表地址

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

⌨️ 快捷键说明

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