?? lcd.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 + -