📄 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 + -