|
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include "scancodes.h"
#include "LCD1602.h"
sbit Key_Data = P3^0 ; //定義Keyboard引腳
sbit Key_CLK =P3^2; //使用中斷
bit BF;
bit Shift; //定義上檔鍵標志
bit Key_UP; //定義通碼斷碼標志
unsigned char KeyV;
unsigned char IntNum;
unsigned char DisNum;
/******************************************************************/
/* 函數聲明 */
/******************************************************************/
void Decode(unsigned char ScanCode); //解碼子程序
/******************************************************************/
/* 主函數 */
/******************************************************************/
void main()
{
IT1 = 0; //設外部中斷1為低電平觸發
EA = 1; //外部中斷開
EX0 = 1; //開中斷
InitLcd(); //初始化1602液晶屏
do
{
if (BF)
Decode(KeyV);
else
EA = 1; //開中斷
}
while(1);
}
/******************************************************************/
/* 外部中斷讀入信息 */
/******************************************************************/
void Keyboard_out(void) interrupt 0
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //因鍵盤數據是低>>高,結合上一句所以右移一位
if (Key_Data)
KeyV = KeyV | 0x80; //當鍵盤數據線為1時到最高位
}
IntNum++;
while (!Key_CLK); //等待PS/2CLK拉高
if (IntNum > 10)
{
IntNum = 0; //當中斷11次后表示一幀數據收完,清變量準備下一次接收
BF = 1; //標識有字符輸入完了
EA = 0; //關中斷等顯示完后再開中斷
}
}
/******************************************************************/
/* 解碼信息 */
/******************************************************************/
void Decode(unsigned char ScanCode) //注意:如SHIFT+G為12H 34H F0H 34H F0H 12H,也就是說shift的通碼+G的通碼+shift的斷碼+G的斷碼
{
unsigned char TempCyc;
if (!Key_UP) //當鍵盤按下時
{
switch (ScanCode)
{
case 0xF0 : // 當收到0xF0,Key_UP置1表示斷碼開始
Key_UP = 1;
break;
case 0x12 : // 左 SHIFT
Shift = 1;
break;
case 0x59 : // 右 SHIFT
Shift = 1;
break;
default:
if(!Shift) //如果SHIFT沒按下
{
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表顯示
if (UnShifted[TempCyc][0] == ScanCode)
{
ShowChar(DisNum,UnShifted[TempCyc][1]);
DisNum++;
if(DisNum==32)
{
WriteCommand(0x01);//清屏
DisNum=0;//重頭寫數據
}
}
}
else //按下SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表顯示
if (Shifted[TempCyc][0] == ScanCode)
{
ShowChar(DisNum,Shifted[TempCyc][1]);
DisNum++;
if(DisNum==32)
{
WriteCommand(0x01);//清屏
DisNum=0;//重頭寫數據
}
}
}
break;
}
}
else
{
Key_UP = 0;
switch (ScanCode) //當鍵松開時不處理判碼,如G 34H F0H 34H 那么第二個34H不會被處理
{
case 0x12 : // 左 SHIFT
Shift = 0;
break;
case 0x59 : // 右 SHIFT
Shift = 0;
break;
}
}
BF = 0; //標識字符處理完了
}

|
-
-
93-1602液晶動態顯示.rar
2019-6-10 11:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
22.6 KB, 下載次數: 8, 下載積分: 黑幣 -5
|