📄 keycode.c.bak
字号:
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#include "ku.h" //按键通码与ascii对照表
#include "Scod.h"
///////////////////////////////////////////////////////////////////
sbit DATA=P3^4; //用p3.3做数据线控制口(小键盘)
sbit CLK =P3^2; //用p3.2做时钟线控制口(小键盘)
sbit Key_Data=P3^5; //定义接受标准键盘引脚控制口(数据线)
sbit Key_CLK=P3^3; //定义接受标准键盘引脚控制口(时钟线,外部中断1)
sbit inhibit=P4^0; //定义专用键盘和标准PS2键盘控制转换(P4.0)
///////////////////////////////////////////////////////////////////
sbit a1 = P4^1; //用p4.1做语音控制口1
sbit a2 = P4^2; //用p4.1做语音控制口2
//////////////////////////////////////////////////////////////////
sbit buzzer = P2^7; //用p0.1做蜂鸣器控制口
//////////////////////////////////////////////////////////////////
sbit atxtflag = P4^3; //用p4.3做AT/XT控制口(拨码开关)
sbit bit1_6flag = P3^6; //用p3.6做1bit/6bit清除控制口(拨码开关)
sbit numberflag = P3^7; //用p3.7做液晶显示数字和*号控制口(拨码开关)
//////////////////////液晶控制位及数据接口/////////////////////////
unsigned char code cdle_net[] = {" WELCOME! "};
unsigned char code email[] = {"we do our best!!"};
unsigned char code Cls[] = {" "}; //清显示
//字符以ASCII码存储,不需要转换
//OSC=12MHZ
//LCMPORT=P2,4位模式,不带读“忙”状态功能,
//现用P0口实验.
//DATA(D7--D4),D3(E),D2(R/W),D1(RS),D0(VO).
sfr LCMPORT = 0x80;
sbit E=LCMPORT^3;
sbit RW=LCMPORT^2;
sbit RS=LCMPORT^1;
sbit VO=LCMPORT^0;
///////////////////////////////////////////////////////////////////
#define uchar unsigned char
#define uint unsigned int
///////////////////////////////////////////////////////////////////
////////////////////////////键盘扫描定义///////////////////////////
unsigned char keyvartab[8][5]={'A','B','C','D','E',
'F','G','H','I','J',
'K','L','M','N','O',
'P','Q','R','S','T',
'U','V','1','2','3',
' ',' ','4','5','6',
'W','X','7','8','9',
'Y','Z','~','0','!'
};
//键盘行扫苗码
#define NOKEY 0x01 //无键按下时的返回值
#define LOHI() P1=0xff; P2=0x80;_nop_() //00 //列出行入
#define HOLI() P1=0x00; P2=0x9f;_nop_() //1F //行出列入
code unsigned char hh[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //行位置表
code unsigned char ll[5]={0x9e,0x9d,0x9b,0x97,0x8f};
unsigned char DispFlag;
unsigned char key;
////////////////////////////////////////////////////////////////////
void initlcm4bit(void);
void writport(unsigned char lcmdata);
void writbyte(unsigned char RS,unsigned char asic);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
/////////////////////////////////////////////////////////////////////
void Delay5Ms(void);
void Delay400Ms(void);
void delay(unsigned int N);
/////////////////////////////////////////////////////////////////////
void Decode(unsigned char ScanCode);
/////////////////////////////////////////////////////////////////////
void numbertocode(void);
void initkeyvariable(void);
unsigned char readkeyvar(void);
unsigned char parity(unsigned char x);
void SEND_byte(unsigned char byte_data);
/////////////////////////////////////////////////////////////////////
////static unsigned char IntNum = 0; //中断次数计数
////static unsigned char KeyV; //键值
////static unsigned char DisNum = 0; //显示用指针
////static unsigned char Key_UP=0, Ctrl = 0;//Key_UP是键松开标识,Ctrl是Ctrl键按下标识
////static unsigned char BF = 0; //标识是否有字符被收到
////static unsigned char biaozhiflag = 1;//表示小键盘已经有键按下标志位
/////////////////////////////////////////////////////////////////////
unsigned char dat=0,dat1=0,dat2=0; //接收键盘数据变量? 存储通码变量 接受连续通码变量
unsigned char count=0,num=9,temp[5],shu=0; //中数次数 中断控制变量 缓冲区数组 缓冲区指针
unsigned char key=0; //按键最终值
/////////////////////////延时子函数开始//////////////////////////////
void delay_ms(unsigned char ms) // 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
/////////////////////////////////////////
void delayus(unsigned int us) //执行一次是机器周期=12÷11.0592MHz=1.0857μS
//(65536-定时常数)*1.0857μS=50mS
// 定时常数=4C00H
{
while(us--);
}
////////////////////////////////////////
void delay5Ms(void)
{
unsigned int TempCyc =5552;
while(TempCyc--);
}
////////////////////////////////////////
//400ms延时函数
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
/////////////////////////延时子函数结束//////////////////////////////
/////////////////////////////////////////////////////////////////////
//////////////////////////1602-LCD驱动程序开始///////////////////////
void writport(unsigned char lcmdata)
{
LCMPORT=lcmdata|0x08;
delayus(100);
LCMPORT=lcmdata&0xf7;
}
///////////////////////////////////////////////////
//RS=1时为写数据,RS=0时为写命令。
void writbyte(unsigned char RS,unsigned char asic)
{
unsigned char temp=asic&0xf0;
if(RS)
{
temp|=0x02;
writport(temp);
temp=asic<<4;
temp|=0x02;
}
else
{
delayus(1050);
writport(temp);
temp&=0xf0;
temp=asic<<4;
}
writport(temp);
}
///////////////////////////////////////////////////
//4BIT 初始化,分两行。
void initlcm4bit(void)
{
E=0;E=0;
delayus(40000);//
writport(0x20); //4-BIT mode chage
delayus(10000);
writbyte(0,0x2C);//seting display mode 2 line mode,display off //0X2C
writbyte(0,0x0C);//display on/off. //0X0F
writbyte(0,0x01);//display clear
delayus(30000);
}
///////////////////////////////////////////////////
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
writbyte(0,X);
writbyte(1,DData);
}
///////////////////////////////////////////////////
//按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength,j;
ListLength = strlen(DData);
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (X <= 0xF) //X坐标应小于0xF
{
for(j=0;j<ListLength;j++)
{
DisplayOneChar(X, Y, DData[j]); //显示单个字符
//delayus5Ms();
X++;
}
}
}
//////////////////////////1602-LCD驱动程序结束///////////////////////
void zhongduan(void) interrupt 2 //外部中断1 用来接受键盘发来的数据
{
dat>>=1; //接受数据 低->高
if(Key_Data) dat|=0x80;
count++;
if(count==num)
{
if(count==9)
{
dat1=dat; //中断9次后为键盘所按按键的通码(开始位始终为0在第一次中断时右移中忽略)
num=20; //使中断可以继续中断11次
}
if(count==20)
{
dat2=dat; //取回第二个通码
if(dat1==0xe0 || dat2==0xf0) //第一个通码是0xe0则证明所按按键为功能键,第二个通码是0xf0证明按键结束
{
temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //将所按按键存到缓冲区中
ie=0x82; //关闭外部中断并打开内部中断来处理所按按键
tr0=1;
}
else
{
temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //如果shift键被按下则记录与它同时按下的那个键
count=0;
}
if((temp[0]==18 || temp[0]==89) && (temp[2]==18 || temp[2]==89) ) tr0=1; //如果缓冲区中有两个间隔的shift键则证明需要的铵键结束
}
}
}
void getkey(void) interrupt 1 //内部中断0 用来处理缓冲区里的数据
{
unsigned char i=0;
tr0=0;
th0=0;
tl0=0;
count=0; //中断记数则0
if((temp[0]==18 || temp[0]==89) && temp[1]!=0xf0 ) //shift被按下
{
//for(i=0;i<21;i++)
//{
// if(addshift[i][0]==temp[1]) //搜索shift被按下的表
// {
// key=addshift[i][1];
ie=0x86; //打开外部中断1
return;
// }
// }
}
else if(temp[0]==0xe0) //所按下的按键是功能键
{
//for(i=0;i<80;i++)
//{
// if(noshift[i][0]==temp[1]) //功能键的通码在缓冲区的第二位
// {
// key=noshift[i][1];
ie=0x86;
return;
//}
//}
}
else //普通按键
{
if(atxtflag==1)
{
if(key==0x78)
{
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
biaozhiflag = 0;
inhibit = 0;
ie = 0x00;
EA = 0;
}
else
{
ie=0x86;
return;
}
}
else
{
if(key==0x57)
{
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
buzzer = 0;
delay5Ms();
buzzer = 1;
delay5Ms();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -