⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 程序概述: 这是个具体产品程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -