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

📄 lcd.c

📁 符合645规范的单相485液晶普通电子式电能表
💻 C
字号:
#pragma sfr
#pragma di
#pragma ei

#include"main.h"
#include"WRE2PROM.h"
#include"serialRC.h"
#include"POWER_COUNT.h"
#include"LCD.h"

#define LCD_CLK0			
#define DELAY	_delay(3)
#define  LCD_WR1   (P2.0=1);DELAY
#define  LCD_WR0   (P2.0=0);DELAY

#define CS0	P13=0;_delay(20)
#define CS1	P13=1;P4.3=1;_delay(20)

#define DATAOUT_MODE PM2.2=0
#define DATAIN_MODE PM2.2=1

#define DATAOUT0 P2.2=0
#define DATAOUT1 P2.2=1

#define LCDDATAIN	(P2.2)


#define COMMAND	0x04
#define READ	0x06
#define WRITE	0x05

LCD_Display_s LCD_Show;


const unsigned char Show_number[16]=
{
    LCD_CODE_INFO_0,
    LCD_CODE_INFO_1,
    LCD_CODE_INFO_2,
    LCD_CODE_INFO_3,
    LCD_CODE_INFO_4,
    LCD_CODE_INFO_5,
    LCD_CODE_INFO_6,
    LCD_CODE_INFO_7,
    LCD_CODE_INFO_8,
    LCD_CODE_INFO_9,
    LCD_CODE_INFO_A,
    LCD_CODE_INFO_B,
    LCD_CODE_INFO_C,
    LCD_CODE_INFO_D,
    LCD_CODE_INFO_E,
    LCD_CODE_INFO_F
 };

/**********************************************************************
起动ht1621
**********************************************************************/
void Start_spi(void)
{

CS1;
DATAOUT_MODE;
LCD_WR1;
DATAOUT1;
DELAY;
	CS0;
LCD_WR0;
DELAY;
}


void Bit_Write(uchar data,uchar Len)
{
	data<<=(8-Len);
	while(Len--)
	{
		LCD_WR0;
		if(data&0x80)
		{
			DATAOUT1;
		}
		else
		{
			DATAOUT0;
		}
		_delay(1);
		LCD_WR1;
		data<<=1;
		_delay(1);
	}
}

void Write_Order(uchar Order)
{
	Start_spi();
	Bit_Write(COMMAND,3);
	Bit_Write(Order,8);
	Bit_Write(0xFF,1);
	CS1;
}


/******************************************************************************
函数名:	Updata_LCD()
功能:		显示函数,次数数据写到1261中,并设置显示时间,
                入口为1,关闭显示。入口为0,显示数据。
******************************************************************************/

void Update_LCD(uchar check_lcd)
{

	uchar ii;
	if(PROGR_ENABLE )//编程
	{
		LCD_Show.Lcd_Buffer[8]|=0x04;
	}

	if(TXE6 )//通讯
	{
        	LCD_Show.Lcd_Buffer[4]|=0x01;
	}else
	{
		LCD_Show.Lcd_Buffer[4]&=0xFE;
	}



	//继电器状态
	LCD_Show.Lcd_Buffer[5]|=LCD_Show.Relay_State;
	if (PEVERSE_PIN)
	{
		LCD_Show.Lcd_Buffer[0]|=REVERSE;
#ifndef NEED_IR	
		ALARM_LED_SET(0);
#endif	
	}
	else
	{
#ifndef NEED_IR	
		ALARM_LED_SET(1);
#endif	
	}
	

	
	Start_spi();
	Bit_Write(WRITE,3);
	Bit_Write(0x00,6);//写addr
	for(ii=0;ii<LEN_OF_LCD_DISPLAY;ii++)
	{
	       if(check_lcd)
	       {
		    LCD_Show.Lcd_Buffer[ii]=0xFF;
		 }
		  Bit_Write(LCD_Show.Lcd_Buffer[ii],8);//写数据
	}
	CS1;
}



void Load_Data(uchar *temp ,uchar item)
{
	uchar ii;
	for(ii=0;ii<item;ii++)
	{
		LCD_Show.Lcd_Buffer[7-ii*2]=Show_number[temp[ii]&0x0F];//取低位数据
		LCD_Show.Lcd_Buffer[6-ii*2]=Show_number[temp[ii]>>4];  //取高位数据
	}
}

void LCD_Show_Turn(void)
{
	if(LCD_Show.timer--==0)
	{
		uchar temp[4];
		MemSetTo0(LCD_Show.Lcd_Buffer,LEN_OF_LCD_DISPLAY);
		if(LCD_Show.Showing_ItemNO++)
		 {
		       if( 2 == LCD_Show.Showing_ItemNO)
		       {
				ReadString(temp,PowerMeterCode_address+3,3);//读表号
				LCD_Show.Lcd_Buffer[0]=LCD_CODE_INFO_H; //
			 }
			 else
			 {
				ReadString(temp,PowerMeterCode_address,3);//读表号
				LCD_Show.Lcd_Buffer[0]=LCD_CODE_INFO_L; //L
				LCD_Show.Showing_ItemNO=0;
			 }
			Load_Data(temp,3);
			LCD_Show.Lcd_Buffer[1]=LG; //-
			LCD_Show.Lcd_Buffer[9]|=0x40;//局号
		}else
		{
			Read_Degree(DEGREE_OF_ABCPHASIC_ACT,temp);
			Load_Data(temp,4);
			LCD_Show.Lcd_Buffer[8]|=0x41;//点“KW”,小数点
			LCD_Show.Lcd_Buffer[7]|=0x01;//点“h”
			LCD_Show.Lcd_Buffer[3]|=0x01;//点“电量”
			
			Write_Order(BIAS13);         //四个公共口1/3偏压先项
			Write_Order(XTAL32K);        //系统时钟源为晶振
			Write_Order(SYS_EN);         //打开系统时钟振荡器
			Write_Order(LCD_ON);         //打开LCD偏压发生器
			Write_Order(TIMER_DIS);      //时基输出失效
			Write_Order(WDT_DIS);        //WDT溢出标志输出失效
			Write_Order(TONE_OFF);       //关闭声音输出	
		}
		LCD_Show.timer=LCD_TURN_TIME;        //设置显示时间
		Update_LCD(0);

	}

}


⌨️ 快捷键说明

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