?? zifu.c
字號:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define Ese 0x76 //清屏指令
#define Bksp 0x66 //刪除一個指令
#define Cplk 0x58 //雙鍵值區分
sbit Clk=P3^2; //時鐘線接在P32
sbit Dat=P3^0; //數據線接在P30
uchar BUF =0; //中斷完成標志
uchar Degree =0; //中斷次數
uchar Data =0; //句路數據
uchar i =0; //采集到的數據在數組中的位置
uchar Update =0; //數據更新標志
uchar Caps_Lock =0; //雙鍵值區分標志位
char Key_Data[32] ; //得到的鍵盤輸入值數組
void Dispose(void);
void Get_Date(void);
/*=====================
中斷函數,負責采集數據
=======================*/
void Get_data(void) interrupt 0 using 1
{
if((Degree>11)&&(Degree<20))
{
Data=Data>>1;
if(Dat){Data|=0x80;};
} //只用采集到的中間11位的八位數據
Degree++;
if(Degree>=33) //32次后重新計數
{
Degree=0;
BUF = 1; //進行數據處理,只在中斷中得到數據,不用等待
}
}
/*=====================================
數據/指令處理函數,處理得到的數據/指令
======================================*/
void Dispose(void)
{
uchar temp ;
switch(Data) //判斷指令的輸入
{
case 0x76 :
//Write_ZL(0x01) ;
for(temp=0;temp<32;temp++) Key_Data[temp] = 0 ;
i=0;
P2=Ese ;
break ; //清屏,數組清0
case 0x66:
i-- ; Update=0;
Key_Data[i] = 0 ; //刪除剛輸入的數據
Update = 1; //數據更新標志
break ;
case 0x58 :
Caps_Lock^= 1 ; //雙鍵值區分標志位改變
break ;
default :Get_Date();
//處理得到的字符碼值
}
}
/*=================
處理得到的字符數據
==================*/
void Get_Date(void)
{
if(i>=32) i=0 ;
switch(Data) //處理得到的字符碼值,轉化對應的1602碼值
{
case 0x1C: Key_Data[i]='A';break;
case 0x32: Key_Data[i]='B';break;
case 0x21: Key_Data[i]='C';break;
case 0x23: Key_Data[i]='D';break;
case 0x24: Key_Data[i]='E';break;
case 0x2B: Key_Data[i]='F';break;
case 0x34: Key_Data[i]='G';break;
case 0x33: Key_Data[i]='H';break;
case 0x43: Key_Data[i]='I';break;
case 0x3B: Key_Data[i]='J';break;
case 0x42: Key_Data[i]='K';break;
case 0x4B: Key_Data[i]='L';break;
case 0x3A: Key_Data[i]='M';break;
case 0x31: Key_Data[i]='N';break;
case 0x44: Key_Data[i]='O';break;
case 0x4D: Key_Data[i]='P';break;
case 0x15: Key_Data[i]='Q';break;
case 0x2D: Key_Data[i]='R';break;
case 0x1B: Key_Data[i]='S';break;
case 0x2C: Key_Data[i]='T';break;
case 0x3C: Key_Data[i]='U';break;
case 0x2A: Key_Data[i]='V';break;
case 0x1D: Key_Data[i]='W';break;
case 0x22: Key_Data[i]='X';break;
case 0x35: Key_Data[i]='Y';break;
case 0x1A: Key_Data[i]='Z';break;
case 0x45: Key_Data[i]='0';break;
case 0x16: Key_Data[i]='1';break;
case 0x1E: Key_Data[i]='2';break;
case 0x26: Key_Data[i]='3';break;
case 0x25: Key_Data[i]='4';break;
case 0x2E: Key_Data[i]='5';break;
case 0x36: Key_Data[i]='6';break;
case 0x3D: Key_Data[i]='7';break;
case 0x3E: Key_Data[i]='8';break;
case 0x46: Key_Data[i]='9';break;
case 0x29: Key_Data[i]=' ';break;
case 0x41: Key_Data[i]=',';break;
case 0x49: Key_Data[i]='.';break;
}
Update=0;
if(!Caps_Lock)
Key_Data[i] |= 0x20 ; //Caps_Lock未按下則小寫
i++ ; //計數加一
Update=1;
//數據更新標志
}
//長延時
void Delay400Ms(void)
{
uchar d=5;
uint j;
while(d--)
{
j=8269;
while(j--);
}
}
void main()
{
uchar m=0;
IT0=1;
EA=1;
EX0=1;
while(1)
{
if(BUF){Dispose();BUF=0;}
if(Update)
{
for(m=0;m<10;m++){P2=Key_Data[m];Delay400Ms();}
Update=0;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -