📄 lcd.c
字号:
memcpy(&DispBuffer[0][1], "请输入卡号: ", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
}
memcpy(&DispBuffer[1][1], &BlankLine, DISP_BUF_LENGTH);
for (i=1; i<=KeyBuffer[0]; i++)
{
DispBuffer[1][DISP_BUF_LENGTH-KeyBuffer[0]+i] = KeyBuffer[i]+0x30;
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_SetupAddTempCardDoor: // 输入该卡持卡人所在的房间号
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "输入持卡人房号:", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
}
memcpy(&DispBuffer[1][1], " __栋__单元", DISP_BUF_LENGTH);
for (i=1; i<=KeyBuffer[0]; i++)
{
DispBuffer[1][SetupAddTempCardDoorDispOrder[i]] = KeyBuffer[i]+0x30;
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_SetupAddTempCardEndTime: // 输入该临时卡的使用期限
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "设定该卡使用期限", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
}
memcpy(&DispBuffer[1][1], "20__-__-__ __:__", DISP_BUF_LENGTH);
for (i=1; i<=KeyBuffer[0]; i++)
{
DispBuffer[1][SetupTimeDispOrder[i]] = KeyBuffer[i] + 0x30;
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_SetupDoubleClickTime:
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "设定按键双击时间", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
}
memcpy(&DispBuffer[1][1], "__0ms -> __0ms", DISP_BUF_LENGTH);
DispBuffer[1][1] = (DoubleKeyPressTimer / 10) | 0x30;
DispBuffer[1][2] = (DoubleKeyPressTimer % 10) | 0x30;
if (DispBuffer[1][1] == '0')
{
DispBuffer[1][1] = ' ';
}
for (i=1; i<=KeyBuffer[0]; i++)
{
DispBuffer[1][12] = DispBuffer[1][13];
DispBuffer[1][13] = KeyBuffer[i] + 0x30;
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_Alarming_F: // 分机正在报警报警
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "紧急报警: ", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
}
memcpy(&DispBuffer[1][1], "来自__栋____房间", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
break;
}
case Status_Alarming_M: // 门口机报警
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "门口机故障报警:", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
}
memcpy(&DispBuffer[1][1], " 来自__栋__单元", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
break;
}
case Status_FindMenu:
{
break;
}
case Status_FindAlarmRecord: // 查询报警记录
{
if (AlarmRecord.Addr[3] == 0x00)// 如果报警地址是从门口机过来的,则
{
memcpy(&DispBuffer[0][1], "___. __栋__单元", DISP_BUF_LENGTH);
DispBuffer[0][7] = (AlarmRecord.Addr[1] >> 4) | 0x30;
DispBuffer[0][8] = (AlarmRecord.Addr[1]&0x0F) | 0x30;
DispBuffer[0][11] = (AlarmRecord.Addr[2] / 10) | 0x30;
DispBuffer[0][12] = (AlarmRecord.Addr[2] % 10) | 0x30;
DispBuffer[0][0] = 0x01;
}
else // 如果报警地址是从室内分机过来的,则
{
memcpy(&DispBuffer[0][1], "___. __栋____房", DISP_BUF_LENGTH);
DispBuffer[0][7] = (AlarmRecord.Addr[1] >> 4) | 0x30; // 楼栋
DispBuffer[0][8] = (AlarmRecord.Addr[1]&0x0F) | 0x30;
DispBuffer[0][11] = (AlarmRecord.Addr[2] / 10) | 0x30; // 楼层
DispBuffer[0][12] = (AlarmRecord.Addr[2] % 10) | 0x30;
DispBuffer[0][13] = (AlarmRecord.Addr[3] / 10) | 0x30; // 房号
DispBuffer[0][14] = (AlarmRecord.Addr[3] % 10) | 0x30;
DispBuffer[0][0] = 0x01;
}
if (AlarmRecord.Index > 512) // 超出范围
{
DispBuffer[0][1] = 'x';
DispBuffer[0][2] = 'x';
DispBuffer[0][3] = 'x';
}
else
{
DispBuffer[0][1] = (AlarmRecord.Index/100) | 0x30;
i = AlarmRecord.Index % 100;
DispBuffer[0][2] = (i/10) | 0x30;
DispBuffer[0][3] = (i%10) | 0x30;
}
DispBuffer[1][1] = 0x02+0x30;
DispBuffer[1][2] = 0x00+0x30;
DispBuffer[1][3] = (AlarmRecord.Time.Year >> 4) | 0x30;
DispBuffer[1][4] = (AlarmRecord.Time.Year&0x0F) | 0x30;
DispBuffer[1][5] = '/';
// 月份, 2位数
DispBuffer[1][6] = (AlarmRecord.Time.Month >> 4) | 0x30;
DispBuffer[1][7] = (AlarmRecord.Time.Month&0x0F) | 0x30;
DispBuffer[1][8] = '/';
// 日期, 2位数
DispBuffer[1][9] = (AlarmRecord.Time.Date >> 4) | 0x30;
DispBuffer[1][10] = (AlarmRecord.Time.Date&0x0F) | 0x30;
DispBuffer[1][11] = ' ';
// 小时, 2位数
DispBuffer[1][12] = (AlarmRecord.Time.Hour >> 4) | 0x30;
DispBuffer[1][13] = (AlarmRecord.Time.Hour&0x0F) | 0x30;
DispBuffer[1][14] = ':';
// 分钟, 2位数
DispBuffer[1][15] = (AlarmRecord.Time.Minute >> 4) | 0x30;
DispBuffer[1][16] = (AlarmRecord.Time.Minute&0x0F) | 0x30;
DispBuffer[1][0] = 0x01;
break;
}
case Status_DelAlarmRecordFirst: // 询问是否删除当前这项报警记录
{
memcpy(&DispBuffer[0][1], "是否删除这项记录", DISP_BUF_LENGTH);
memcpy(&DispBuffer[1][1], "1.删除 0.取消 ", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
DispBuffer[1][0] = 0x01;
break;
}
case Status_SetupCheckDoorIntervalTime: // 正在设置管理机轮检门口机的时间间隔
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "设定轮检时间 ", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
}
memcpy(&DispBuffer[1][1], " __0秒 -> __0秒", DISP_BUF_LENGTH);
DispBuffer[1][2] = (CheckDoorIntervalTimer / 10) | 0x30;
DispBuffer[1][3] = (CheckDoorIntervalTimer % 10) | 0x30;
if (DispBuffer[1][2] == '0')
{
DispBuffer[1][2] = ' ';
if (DispBuffer[1][3] == '0')
{
DispBuffer[1][3] = ' ';
}
}
for (i=1; i<=KeyBuffer[0]; i++)
{
DispBuffer[1][12] = DispBuffer[1][13];
DispBuffer[1][13] = KeyBuffer[i] + 0x30;
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_ShowingMessage: // 显示消息的时候不改变显示缓冲区的内容
{
break;
}
default: //
break;
}
//*/
}
//
// 更新显示
void UpdateDisp(BOOL bForce)
{
if (bForce || ((DispBuffer[0][0]&0x7F) != 0x00))
{
DispBuffer[0][0] &= 0x80;
LCD_WriteString(0x80, &DispBuffer[0][1], DISP_BUF_LENGTH);
}
if (bForce || ((DispBuffer[1][0]&0x7F) != 0x00))
{
DispBuffer[1][0] &= 0x80;
LCD_WriteString(0x90, &DispBuffer[1][1], DISP_BUF_LENGTH);
}
// 以下决定哪一行需要反白显示
if ((DispBuffer[0][0] & 0x80) == 0x00)
{
if (FirstLineReverseDisp == TRUE)
{
ReverseDisp(0x01);
FirstLineReverseDisp = FALSE;
}
}
if ((DispBuffer[1][0] & 0x80) == 0x00)
{
if (SecondLineReverseDisp == TRUE)
{
ReverseDisp(0x02);
SecondLineReverseDisp = FALSE;
}
}
if (DispBuffer[0][0] & 0x80) // 如果要求第一行反白显示
{
if (FirstLineReverseDisp == FALSE) // 而当前却是正常显示
{
ReverseDisp(0x01);
FirstLineReverseDisp = TRUE;
}
}
if (DispBuffer[1][0] & 0x80) // 如果要求第二行反白显示
{
if (SecondLineReverseDisp == FALSE) // 而当前却是正常显示
{
ReverseDisp(0x02);
SecondLineReverseDisp = TRUE;
}
}
}
// 写字符串程序
// Addr: 目标地址
// pData: 指向待写入的数据的指针
// nLength: 待写入的数据的长度(以字节表示)
void LCD_WriteString(BYTE Addr, const BYTE *pData, BYTE nLength)
{
LcdWriteControlData(Addr);
do {
LcdWriteRam(*pData++);
} while (--nLength);
}
//
// 反白显示,第一行反白sel+3=0x04, 第二行反白sel+3=0x05;
// 如果本来这一行是反白显示,再次调用这个函数则变为正常显示
void ReverseDisp(BYTE sel)
{
LcdWriteControlData(0x34); //使用扩展指令集
LcdWriteControlData(sel+3);
LcdWriteControlData(0x30); //恢复到普通指令集
}
// 写命令
void LcdWriteControlData(BYTE aData)
{
BYTE i;
BYTE temp;
LcdCS = 0; // CS输出低
LcdCLK = 0; // CLK输出低
LcdCS = 1; // CS输出高
// 1111,1000b
temp = 0xF8;
for (i=0; i<8; i++)
{
LcdSDI = (temp & 0x80);
temp <<= 1;
LcdCLK = 1; // CLK输出为高
LcdCLK = 0; // CLK输出低
}
// 数据
temp = (aData & 0xF0); // 先输出高4位外加4个0
for (i=0; i<8; i++)
{
LcdSDI = (temp & 0x80);
temp <<= 1;
LcdCLK = 1; // CLK输出为高
LcdCLK = 0; // CLK输出低
}
temp = (aData << 4); // 再输出低4位外加4个0
for (i=0; i<8; i++)
{
LcdSDI = temp & 0x80;
temp <<= 1;
LcdCLK = 1; // CLK输出为高
LcdCLK = 0; // CLK输出低
}
LcdCS = 0; // CS输出低
Delayus(75);
}
// 写ASIC码字符
void LcdWriteRam(BYTE aData)
{
BYTE i;
BYTE temp;
LcdCS = 0; // CS输出低
LcdCLK = 0; // CLK输出低
LcdCS = 1; // CS输出高
// 1111,1010
temp = 0xFA;
for (i=0; i<8; i++)
{
LcdSDI = (temp & 0x80);
temp <<= 1;
LcdCLK = 1; // CLK输出为高
LcdCLK = 0; // CLK输出低
}
// 数据
temp = (aData & 0xF0); // 先输出高4位外加4个0
for (i=0; i<8; i++)
{
LcdSDI = (temp & 0x80);
temp <<= 1;
LcdCLK = 1; // CLK输出为高
LcdCLK = 0; // CLK输出低
}
temp = (aData << 4); // 再输出低4位外加4个0
for (i=0; i<8; i++)
{
LcdSDI = temp & 0x80;
temp <<= 1;
LcdCLK = 1; // CLK输出为高
LcdCLK = 0; // CLK输出低
}
LcdCS = 0; // CS输出低
Delayus(75);
}
/*----------------------------------------------------------------------------+
| End of source file |
+----------------------------------------------------------------------------*/
/*------------------------ Nothing Below This Line --------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -