📄 lcd.c
字号:
/**************** (c) 2005 佛山菱电 *****************************************
PROJECT : 简易风盘控制器
COMPILER : AVR ICC for m48
MODULE : lcd.c
VERSION : 1.0.0
DATE : 2005/12/12
AUTHOR : 朱坤
DESCRIPTION : LCD 显示处理处理
MODIFICATIONS :
******************************************************************************/
#include <avr/io.h>
#include <avr/wdt.h>
#include "lib.h"
#include "version.h"
#include "ports.h"
#include "timer.h"
#include "main.h"
#include "fan.h"
#include "lcd.h"
#include "adc.h"
#include "i2c.h"
#include "scom.h"
#ifdef LEDDISP
//u8 DispDlyCnt; /* 模式确认延时 */
u8 FlashCntr; /* LED 显示错误码计时 */
u8 FlashErrNo; /* 错误显示序号 */
u8 FlashErrCnt; /* 错误显示循环时间 */
u8 LCDBuf[4]; /* LCD 显示缓冲区 */
u8 BkgLamp; /* 背光时间 */
u8 ShiftCnt;
u8 LeafCnt; /* */
u8 ChkLcdCnt;
u8 LCDState; /* 显示状态 */
u8 CanShuNoTm; /* 显示参数编号时间 - 为 0 时显示参数值,否则显示参数编号 */
u8 CanShuNo; /* 当前显示参数编号 */
u8 LCDTimeCount; /* 显示持续时间 */
const unsigned char TabSeg[]={ /* fgeh abcd| */
0x0AF, /* 1010 1111|0 */
0x06, /* 0000 0110|1 */
0x6D, /* 0111 1101|2 */
0x4F, /* 0100 1111|3 */
0x0C6, /* 1100 0110|4 */
0x0CB, /* 1100 1011|5 */
0x0EB, /* 1110 1011|6 */
0x0E, /* 0000 1110|7 */
0x0EF, /* 1110 111f|8 */
0x0CF, /* 1100 1111|9 */
0x0EE, /* 1110 1110|a */
0x0E3, /* 1110 1001|b */
0x0a9, /* 1010 1001|c */
0x67, /* 0110 0111|d */
0x0e9, /* 1110 1001|e */
0x0E8}; /* 1110 1000|f */
const u8 ErrNo[] = {58, /* fAmbientErr ((u8)0) 室温传感器 */
61, /* fTubeInErr ((u8)1) 盘管传感器 */
59, /* fTubeMidErr ((u8)2) */
62, /* fTubeOutErr ((u8)3) */
63, /* fRsAddrErr ((u8)4) 1: 内机地址冲突 */
65, /* fPGErr ((u8)5) 1: PG风机故障 */
56, /* fSComErr ((u8)6) 1: 内机与外机通信故障 */
66}; /* fLtdSwSt ((u8)7) 1: 房卡断开 */
/* 风速显示 */
const u8 LeafDly_Tab[] ={30,50,25,15}; /* 120mS, 200mS, 100mS, 60mS */
const u8 fl_Tab[] = {0x00,0x30,0x0f1,0x0ff}; /* 风机风速显示 */
/* 确认 CS 为低 */
void WrLCD(u8 Dat,u8 Bitn)
{
while (Bitn-- != 0){
ClrWR_HT1621();
if (ValBit(Dat,7)) {
SetDATA_HT1621();
} else {
ClrDATA_HT1621();
}
Dat <<= 1; /* MSB */
NOP();
SetWR_HT1621();
}
}
/* LED 显示, 每 4mS 执行一次 */
void LcdDisp_Sub(void)
{
u8 i;
/* LCD 显示定时 */
if (++FlashCntr >= 250) FlashCntr = 0;
if (ChkLcdCnt != 0){ /* 检查延时 */
/* 全部点亮3秒 */
LCDBuf[0] = 0x0FF;
LCDBuf[1] = 0x0FF;
LCDBuf[2] = 0x0FF;
LCDBuf[3] = 0x0FF;
} else {
/* 清除 */
LCDBuf[0] = 0x00;
LCDBuf[1] = 0x00;
LCDBuf[2] = 0x00;
LCDBuf[3] = 0x00;
if (LCDState == 1){ /* 显示设定温度 */
//if (ValBit(Sysflag,fContinue)){
// LCDBuf[2] = 0x40;
// LCDBuf[3] = 0x40; /* -- */
//} else {
//#ifndef DEBUG
i = (u8)(SetupTp - 0x80);
LCDBuf[3] = (u8)(TabSeg[(u8)(i / 10)]);
LCDBuf[2] = (u8)(TabSeg[(u8)(i % 10)]);
SetBit(LCDBuf[0],1); /* 温标 */
//#else /* DEBUG */
// LCDBuf[3] = (u8)(TabSeg[(u8)(SetupTp >> 4)]);
// LCDBuf[2] = (u8)(TabSeg[(u8)(SetupTp & 0x0f)]);
//#endif
//}
SetBit(LCDBuf[3],4); /* '设定温度' */
#ifdef MONITOR
} else if (LCDState == 2){ /* 显示参数: 先显示参数编号,再显示参数数值 */
if (CanShuNoTm-- != 0){ /* 显示参数编号,高位的 f 点亮指示地址 */
if (CanShuNo < 10){
LCDBuf[3] = (u8)0x80;
LCDBuf[2] = (u8)(TabSeg[CanShuNo]);
} else {
LCDBuf[3] = (u8)0x86;
LCDBuf[2] = (u8)(TabSeg[CanShuNo - 10]);
}
} else { /* 参数值用 16 进制显示 */
LCDBuf[3] = (u8)(TabSeg[(u8)(XianShiCanShu[CanShuNo] >> 4)]);
LCDBuf[2] = (u8)(TabSeg[(u8)(XianShiCanShu[CanShuNo] & 0x0f)]);
}
} else if (LCDState == 3){ /* 显示调整参数: 先显示参数编号,再显示参数数值 */
if (CanShuNoTm-- != 0){ /* 显示参数编号,高位的 e 点亮指示地址 */
if (CanShuNo < 10){
LCDBuf[3] = (u8)0x20;
LCDBuf[2] = (u8)(TabSeg[CanShuNo]);
} else {
LCDBuf[3] = (u8)0x26;
LCDBuf[2] = (u8)(TabSeg[CanShuNo - 10]);
}
} else { /* 参数值用 16 进制显示 */
LCDBuf[3] = (u8)(TabSeg[(u8)(WaiJiShuJu[CanShuNo] >> 4)]);
LCDBuf[2] = (u8)(TabSeg[(u8)(WaiJiShuJu[CanShuNo] & 0x0f)]);
}
#endif
} else {
if ((Errorflg|
OutSideErr) != 0){
if (FlashCntr >= 120){ /* 故障代码闪烁 */
if (FlashErrCnt == 0){
FlashErrCnt = 150; /* 3s On 20mS */
while (1){
if (++FlashErrNo >= 0x09) FlashErrNo = 0;
if (FlashErrNo < 0x08){
if ((u8)(Errorflg & BitMask[FlashErrNo]) != 0) break;
} else if (OutSideErr != 0) break;
}
}
i = ErrNo[FlashErrNo];
if (FlashErrNo == 0x08){
if ((i = OutSideErr) > 99) i = 99; /* 超过 99 的都显示为 99 */
}
LCDBuf[3] = TabSeg[(u8)(i / 10)];
LCDBuf[2] = TabSeg[(u8)(i % 10)];
}
} else {
if (AmbientTp >= 0x80){ /* 显示室温 Tr */
i = (u8)(AmbientTp - 0x80);
LCDBuf[3] = TabSeg[(u8)(i / 10)];
LCDBuf[2] = TabSeg[(u8)(i % 10)];
} else {
i = (u8)(0x80 - AmbientTp);
#if 1
if (i >= 9) i = 9;
LCDBuf[3] = 0x40; /* '-' */
LCDBuf[2] = TabSeg[i];
#else
if (i <= 9){
LCDBuf[3] = 0x40; /* '-' */
LCDBuf[2] = TabSeg[i];
} else if (i <= 19){
LCDBuf[3] = 0x46; /* '-1' */
LCDBuf[2] = TabSeg[(u8)(i-10)];
} else {
LCDBuf[3] = 0x46; /* '-19' */
LCDBuf[2] = 0x0CF;
}
#endif
}
SetBit((LCDBuf[2]),4); /* '房间温度' */
SetBit(LCDBuf[0],1); /* 温标 */
}
}
i = (u8)(RunMode & 0x03);
/* 显示模式,外机不允许时闪烁 */
if (ValBit(RunMode,fSysOnOff)||(SWTime != 0)){
SetBit((LCDBuf[0]),7); /* 运行 */
if (ValBit(OutDevStu,fRunEnable) ||
ValBit(SlpTmFlag,bb2s)){
if (i == 0x01){
SetBit((LCDBuf[0]),6); /* 制热 */
} else if (i > 0x01){
SetBit((LCDBuf[0]),4); /* 制冷 除湿*/
}
}
if (i == MODEHEAT){
/* 电加热 */
if (!ValBit(SysConfig,fDisHeat)) SetBit((LCDBuf[0]),5);
/* 化霜 */
if (ValBit(OutDevStu,fOutDeforst)) SetBit((LCDBuf[0]),3);
}
/* 设定风速 */
LCDBuf[1] = fl_Tab[FanStatus & 0x03];
/* 运行风速 */
if (ValBit(FanStatus,fFanCtrlBit)){
if (ShiftCnt-- == 0){
ShiftCnt = LeafDly_Tab[(u8)((FanStatus >> 4) & 0x03)];
++LeafCnt;
}
if ((LeafCnt & 0x01) == 0){
LCDBuf[0] |= 0x01;
} else {
LCDBuf[0] |= 0x04;
}
} else {
LCDBuf[0] |= 0x05;
}
}
}
//SetCS_HT1621();
//NOP();
//NOP();
//NOP();
//NOP();
ClrCS_HT1621();
WrLCD(0x80,3); /* 100 */
WrLCD(0x01,9); /* SYS EN */
WrLCD(0x18,9); /* RC 256K */
WrLCD(0x29,9); /* BIAS 1/3, 1/4 */
WrLCD(0x03,9); /* LCD ON */
//WrLCD(0x40,9); /* TONE 4K */
//if (BkgLamp != 0){
// WrLCD(0x09,9); /* TONE ON */
//} else {
// WrLCD(0x08,9); /* TONE OFF */
//}
SetCS_HT1621();
/* 背光处理 */
if (BkgLamp != 0){
LCD_BK_On();
} else {
LCD_BK_Off();
}
ClrCS_HT1621();
WrLCD(0x0A3,9); /* 101 000110 起始地址 */
for (i = 0; i < 4; i++){
WrLCD(LCDBuf[i],8); /* 输出数据 */
}
SetCS_HT1621();
}
#endif
/*** (c) 2005 佛山菱电 **************************** END OF FILE *************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -