?? lcd.c
字號(hào):
memcpy(&DispBuffer[0][1], "請(qǐng)輸入卡號(hào): ", 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: // 輸入該卡持卡人所在的房間號(hào)
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "輸入持卡人房號(hào):", 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: // 輸入該臨時(shí)卡的使用期限
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "設(shè)定該卡使用期限", 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], "設(shè)定按鍵雙擊時(shí)間", 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: // 分機(jī)正在報(bào)警報(bào)警
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "緊急報(bào)警: ", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
}
memcpy(&DispBuffer[1][1], "來自__棟____房間", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
break;
}
case Status_Alarming_M: // 門口機(jī)報(bào)警
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "門口機(jī)故障報(bào)警:", 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: // 查詢報(bào)警記錄
{
if (AlarmRecord.Addr[3] == 0x00)// 如果報(bào)警地址是從門口機(jī)過來的,則
{
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 // 如果報(bào)警地址是從室內(nèi)分機(jī)過來的,則
{
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; // 房號(hào)
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位數(shù)
DispBuffer[1][6] = (AlarmRecord.Time.Month >> 4) | 0x30;
DispBuffer[1][7] = (AlarmRecord.Time.Month&0x0F) | 0x30;
DispBuffer[1][8] = '/';
// 日期, 2位數(shù)
DispBuffer[1][9] = (AlarmRecord.Time.Date >> 4) | 0x30;
DispBuffer[1][10] = (AlarmRecord.Time.Date&0x0F) | 0x30;
DispBuffer[1][11] = ' ';
// 小時(shí), 2位數(shù)
DispBuffer[1][12] = (AlarmRecord.Time.Hour >> 4) | 0x30;
DispBuffer[1][13] = (AlarmRecord.Time.Hour&0x0F) | 0x30;
DispBuffer[1][14] = ':';
// 分鐘, 2位數(shù)
DispBuffer[1][15] = (AlarmRecord.Time.Minute >> 4) | 0x30;
DispBuffer[1][16] = (AlarmRecord.Time.Minute&0x0F) | 0x30;
DispBuffer[1][0] = 0x01;
break;
}
case Status_DelAlarmRecordFirst: // 詢問是否刪除當(dāng)前這項(xiàng)報(bào)警記錄
{
memcpy(&DispBuffer[0][1], "是否刪除這項(xiàng)記錄", DISP_BUF_LENGTH);
memcpy(&DispBuffer[1][1], "1.刪除 0.取消 ", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
DispBuffer[1][0] = 0x01;
break;
}
case Status_SetupCheckDoorIntervalTime: // 正在設(shè)置管理機(jī)輪檢門口機(jī)的時(shí)間間隔
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "設(shè)定輪檢時(shí)間 ", 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: // 顯示消息的時(shí)候不改變顯示緩沖區(qū)的內(nèi)容
{
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) // 而當(dāng)前卻是正常顯示
{
ReverseDisp(0x01);
FirstLineReverseDisp = TRUE;
}
}
if (DispBuffer[1][0] & 0x80) // 如果要求第二行反白顯示
{
if (SecondLineReverseDisp == FALSE) // 而當(dāng)前卻是正常顯示
{
ReverseDisp(0x02);
SecondLineReverseDisp = TRUE;
}
}
}
// 寫字符串程序
// Addr: 目標(biāo)地址
// pData: 指向待寫入的數(shù)據(jù)的指針
// nLength: 待寫入的數(shù)據(jù)的長(zhǎng)度(以字節(jié)表示)
void LCD_WriteString(BYTE Addr, const BYTE *pData, BYTE nLength)
{
LcdWriteControlData(Addr);
do {
LcdWriteRam(*pData++);
} while (--nLength);
}
//
// 反白顯示,第一行反白sel+3=0x04, 第二行反白sel+3=0x05;
// 如果本來這一行是反白顯示,再次調(diào)用這個(gè)函數(shù)則變?yōu)檎o@示
void ReverseDisp(BYTE sel)
{
LcdWriteControlData(0x34); //使用擴(kuò)展指令集
LcdWriteControlData(sel+3);
LcdWriteControlData(0x30); //恢復(fù)到普通指令集
}
// 寫命令
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輸出低
}
// 數(shù)據(jù)
temp = (aData & 0xF0); // 先輸出高4位外加4個(gè)0
for (i=0; i<8; i++)
{
LcdSDI = (temp & 0x80);
temp <<= 1;
LcdCLK = 1; // CLK輸出為高
LcdCLK = 0; // CLK輸出低
}
temp = (aData << 4); // 再輸出低4位外加4個(gè)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輸出低
}
// 數(shù)據(jù)
temp = (aData & 0xF0); // 先輸出高4位外加4個(gè)0
for (i=0; i<8; i++)
{
LcdSDI = (temp & 0x80);
temp <<= 1;
LcdCLK = 1; // CLK輸出為高
LcdCLK = 0; // CLK輸出低
}
temp = (aData << 4); // 再輸出低4位外加4個(gè)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 --------------------------*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -