?? lcd.c
字號:
// Copyright (c)2005 - 2006 by Laser Electronics, All Rights Reserved.
/*----------------------------------------------------------------------------+
| File Name: LCD.c, v1.0.1 |
| Author: 安徽雷森電子有限公司合肥研發中心 |
| Date: 2005年08月01日 |
+-----------------------------------------------------------------------------+
| Description: 聯網型智能樓宇對講系統 -- 管理中心機LCD顯示屏驅動程序 |
| 器件選擇 -- STC89C58RD+, PQFP-44 |
| 時鐘頻率 -- 24.000 MHz |
+-----------------------------------------------------------------------------+
/*----------------------------------------------------------------------------+
| Include files |
+----------------------------------------------------------------------------*/
#include "Main.h"
#include "LCD.h"
#include "Timer.h"
#include "KeyProcess.h"
#include <stdio.h>
/*----------------------------------------------------------------------------+
| Type Definition & Macro |
+----------------------------------------------------------------------------*/
#define LcdCLK P1_2
#define LcdSDI P1_3
#define LcdCS P1_4
/*----------------------------------------------------------------------------+
| Global Variables |
+----------------------------------------------------------------------------*/
// 顯示緩沖,第一個字節最低位表示是否需要刷新顯示,最高位表示是否反白顯示
idata BYTE DispBuffer[2][DISP_BUF_LENGTH+1];
xdata BYTE MainLogo[DISP_BUF_LENGTH];
/*----------------------------------------------------------------------------+
| Internal Variables |
+----------------------------------------------------------------------------*/
bit FirstLineReverseDisp; // 第一行是否反白顯示
bit SecondLineReverseDisp; // 第二行是否反白顯示
code BYTE BlankLine[16] = " ";
// 設置菜單
code t_Menu SetupMenu[16] =
{
// Caption,NextMenu,Parent,Child,MenuFunction
// 通過父菜單來指示各個不級的菜單,使之能夠在同一級菜單中上下翻頁
// 數組的第一項菜單為總菜單,用來指示菜單項的第一行,實際上并不顯示
/* 0 */ " ", 0, 0, 1, NULL,
/* 1 */ "1.設置系統時間 ", 2, 0, 0, EnterSetupSystemTime,
/* 2 */ "2.設置管理員密碼", 3, 0, 0, EnterSetupSystemPassword,
/* 3 */ "3.增加刷卡用戶 >", 4, 0, 7, NULL,
/* 4 */ "4.刪除刷卡用戶 >", 5, 0, 9, NULL,
/* 5 */ "5.系統參數設置 >", 6, 0,12, NULL,
/* 6 */ "6.返回 ", 1, 0, 0, ReturnIdle,
// 增加刷卡用戶的子菜單
/* 7 */ "1.通過刷卡 ", 8, 3, 0, EnterAddTempCardByCard,
/* 8 */ "2.通過輸入卡號 ", 7, 3, 0, EnterAddTempCardByNum,
// 刪除刷卡用戶的子菜單
/* 9 */ "1.通過刷卡 ", 10, 4, 0, EnterDelTempCardByCard,
/*10 */ "2.通過輸入卡號 ", 11, 4, 0, EnterDelTempCardByNum,
/*11 */ "3.刪除所有過期卡", 9, 4, 0, EnterDelTimeoutCard,
// 系統參數設置
/*12 */ "1.設置雙擊間隔 ", 13, 5, 0, EnterSetupDoubleClickTime,
/*13 */ "2.設置輪詢時間 ", 14, 5, 0, EnterSetupCheckIntervalTime,
/*14 */ "3.與計算機同步 ", 12, 5, 0, NULL,
/*15 */ " ", 0, 0, 0, NULL,
};
/*----------------------------------------------------------------------------+
| General Subroutines |
+----------------------------------------------------------------------------*/
//
// 初始化LCD顯示器,配置相應的寄存器
void InitLCD(void)
{
FirstLineReverseDisp = FALSE;
SecondLineReverseDisp = FALSE;
LcdWriteControlData(0x30); // 功能設定為擴充指令集 0x30
LcdWriteControlData(0x06); // 設定光標移動方向
LcdWriteControlData(0x0D); // 顯示狀態開關, 不顯示光標
LcdWriteControlData(0x14); // 設定游標的移動與顯示的移位控制位元,右移
LcdWriteControlData(0x01); // 清除顯示
LcdWriteControlData(0x02); // 顯示位置清零
}
//
// 初始化顯示緩沖,根據當前不同的狀態而顯示不同的內容
// bForce: 是否需要更新第一行的內容
void InitDispBuffer(BOOL bForce)
{
BYTE i;
//*/
switch (SystemStatus.Status)
{
case Status_Init: // 系統正在初始化
{
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_Idle: // 平常情況
{
if (bForce)
{
DispBuffer[0][0] = 0x01;
memcpy(&DispBuffer[0][1], MainLogo, DISP_BUF_LENGTH); // 顯示公司標志
}
if (KeyBuffer[0] == 0x00) // 按鍵緩沖區為空,則顯示當前時間
{
// 顯示時間
UpdateTimeBuffer(&DispBuffer[1][1]);
DispBuffer[1][0] = 0x01;
}
else // 按鍵緩沖區非空,則顯示按鍵緩沖區的內容
{
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_ViewBefore: // 按下監視鍵之后的界面
{
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][ViewBeforeDispOrder[i]] = KeyBuffer[i]+0x30;
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_ViewSendingRequest:
{
memcpy(&DispBuffer[0][1], &DispBuffer[1][1], DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
memcpy(&DispBuffer[1][1], "等待對方應答... ", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
break;
}
case Status_Viewing:
{
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_CallBefore: // 按下"呼叫"鍵之后的界面
{
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][CallBeforeDispOrder[i]] = KeyBuffer[i]+0x30;
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_CallSendingRequest:
{
memcpy(&DispBuffer[0][1], &DispBuffer[1][1], DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
memcpy(&DispBuffer[1][1], "等待對方應答... ", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
break;
}
case Status_Talking: // 正在通話
{
if (bForce)
{
memcpy(&DispBuffer[0][1], "正在通話: ", DISP_BUF_LENGTH);
DispBuffer[0][0] = 0x01;
}
if (ConnectingAddr[3] == 0x00) // 正在和門口機進行通話
{
memcpy(&DispBuffer[1][1], " __棟__單元", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
}
else // 正在和室內分機進行通話
{
memcpy(&DispBuffer[1][1], " __棟____房", DISP_BUF_LENGTH);
DispBuffer[1][0] = 0x01;
}
break;
}
case Status_Calling: // 正在呼叫分機
{
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_bCallingIn_F: // 正在被室內機呼叫
{
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_bCallingIn_M: // 正在被門口機呼叫
{
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_SetupEnterPassword:
{
if (bForce)
{
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] = '*';
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_SetupMenu: // 設置菜單界面
{
if (SystemStatus.lParam == 0)
{
SystemStatus.lParam = SetupMenu[0].Child;
}
i = SystemStatus.lParam;
memcpy(&DispBuffer[0][1], SetupMenu[i].Caption, DISP_BUF_LENGTH);
i = SetupMenu[i].NextMenu;
memcpy(&DispBuffer[1][1], SetupMenu[i].Caption, DISP_BUF_LENGTH);
// 決定哪一行需要反白顯示
if (SystemStatus.wParam == 0x01) // 選中第一行
{
DispBuffer[0][0] = 0x81;
DispBuffer[1][0] = 0x01;
}
else if (SystemStatus.wParam == 0x02) // 選中第二行
{
DispBuffer[0][0] = 0x01;
DispBuffer[1][0] = 0x81;
}
else // 都沒有選中,意外情況
{
SystemStatus.wParam = 0x00;
DispBuffer[0][0] = 0x01;
DispBuffer[1][0] = 0x01;
}
break;
}
case Status_SetupTime: // 設置時間的界面
{
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_SetupPasswordBefore: // 設置密碼前面的輸入管理員密碼,正確之后才可以設置新的密碼
{
if (bForce)
{
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] = '*';
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_SetupPasswordFirst: // 設置密碼時第一次輸入的界面
{
if (bForce)
{
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] = '*';
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_SetupPasswordVerify: // 設置密碼時第二次輸入的界面
{
if (bForce)
{
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] = '*';
}
DispBuffer[1][0] = 0x01;
break;
}
case Status_SetupAddTempCardByCard: // 通過刷卡增加刷卡用戶
case Status_SetupDelTempCardByCard: // 通過刷卡刪除用戶/////////////////////////////////////////////////
{
if (bForce)
{
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_SetupAddTempCardByNum: // 通過輸入卡號增加刷卡用戶///////////////////////////////////
case Status_SetupDelTempCardByNum: // 通過輸入卡號刪除刷卡用戶
{
if (bForce)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -