📄 key10_10.c
字号:
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define SLAVEKEY_Addr 0x01
#define WaitTI while(TI==0);TI=0
#define WaitRI while(RI==0);RI=0
#define EndInputKey 0xa4
#define EnterKey 0x21
#define ShiftKey 0x04
#define PYStatusKey 0x05 /*拼音*/
#define dotkey 0x19
#define NoKeyPress 0x0 /* 没有键按下 */
#define KeyNoUp 0xff /* 键没有松开 */
#define NUMB 0x28
#define Tab1 1
#define Tab2 2
#define Tab3 3
#define Tab4 4
#define Yes 1
#define No 0
#define Off 0
#define On 1
#define Down 0
#define Up 1
#define Start 0
#define End 1
#define Low 0
#define High 1
/**************************************
-------------芯片管脚定义--------------
***************************************/
sbit PowerLed=P1^4;
sbit SHIFTLED=P1^5;
sbit Beep=P1^7;
sbit TestLED=P1^6;
/**********************************************
-------------与主机通信命令名柄定义----------
**********************************************/
#define GetKey 0x90 /* 有键直接返回键值ASCIID码或功能码 无键返回0X00,有键但没松开返回0XFF */
#define OpenBeep 0X91 /* 打开蜂鸣器,嘟... 嘟....,无返回值 */
#define RestWDOG 0x93 /* 复位看门狗 无返回值 */
//#define TestKey 0x94 /* 检测主板与键盘板IC的通信,回送主板Finish命令句柄 */
/**********************************************
---------define communication answer----------
**********************************************/
#define OK 0x00
#define Error 0xff
#define Finish 0x70
/***********************************************
------------------通信变量---------------------
***********************************************/
uchar data handle,Slen,uc0,key,RetKey;
uint data counter;
uint CounterNub1=0,CounterNub2=0;
uint SbufKey;
bit idata tf0=0;
bit bdata fini;
bit bdata KeyStatus;
bit bdata ShiftStatus; /* 上下档键切换:=0上,=1下档键. */
bit bdata PYStatusLED;
bit bdata PYStatus1;
bit bdata DotKeyStatus;
bit bdata KeyInt; /*判断有无键按下,以便产生中断信号*/
/***********************************************
-----------通信联合体结构---------------
***********************************************/
typedef union {
uchar ComBuf[10];
uint tempint;
ulong templong;
} un1;
data un1 Un;
/***********************************************
------------------ 键盘上档编码 ------------
***********************************************/
uchar code KeyCodeNewTabUp[40]={
0xa6,0x39,0x38,0x37,0xae,0xaf,0xa0,0xd1,
0xad,0x36,0x35,0x34,0xb7,0xa7,0xb4,0xd2,
0xa4,0x33,0x32,0x31,0xbc,0xa5,0xb8,0xd3,
0xa4,0x2e,0xa2,0x30,0xbe,0xba,0xb6,0xd4,
0xa4,0xa1,0xc9,0xbb,0xca,0xcb,0xcc,0xd5
};
/***********************************************
-------------------- 键盘下档编码 ----------
***********************************************/
uchar code KeyCodeNewTabDown[40]={
0xa6,0x39,0x38,0x37,0xae,0xaf,0xa0,0xd1,
0xad,0x36,0x35,0x34,0xbd,0xa7,0xb3,0xd2,
0xa4,0x33,0x32,0x31,0xbc,0xa5,0xb2,0xd3,
0xa4,0x2e,0xa2,0x30,0xbe,0xab,0xb9,0xd4,
0xa4,0xa1,0xc9,0xbb,0xa9,0xac,0xaa,0xd5
};
uchar code KeyCodeNewTabOne[40]={
0xa6,0x47,0x44,0x41,0xae,0xaf,0xa0,0xd1,
0xad,0x50,0x4d,0x4a,0xb7,0xa7,0xb4,0xd2,
0xa4,0x58,0x56,0x53,0xbc,0xa5,0xb8,0xd3,
0xa4,0x28,0x2c,0x26,0xbe,0xba,0xb6,0xd4,
0xa4,0xa1,0xc9,0xbb,0xca,0xcb,0xcc,0xd5
};
uchar code KeyCodeNewTabTwo[40]={
0xa6,0x48,0x45,0x42,0xae,0xaf,0xa0,0xd1,
0xad,0x51,0x4e,0x4b,0xb7,0xa7,0xb4,0xd2,
0xa4,0x59,0x57,0x54,0xbc,0xa5,0xb8,0xd3,
0xa4,0x29,0x2e,0x24,0xbe,0xba,0xb6,0xd4,
0xa4,0xa1,0xc9,0xbb,0xca,0xcb,0xcc,0xd5
};
uchar code KeyCodeNewTabThree[40]={
0xa6,0x49,0x46,0x43,0xae,0xaf,0xa0,0xd1,
0xad,0x52,0x4f,0x4c,0xb7,0xa7,0xb4,0xd2,
0xa4,0x5a,0x00,0x55,0xbc,0xa5,0xb8,0xd3,
0xa4,0x00,0x00,0x00,0xbe,0xba,0xb6,0xd4,
0xa4,0xa1,0xc9,0xbb,0xca,0xcb,0xcc,0xd5
};
uchar code KeyCodeNewTabFour[40]={
0xa6,0x39,0x38,0x37,0xae,0xaf,0xa0,0xd1,
0xad,0x36,0x35,0x34,0xb7,0xa7,0xb4,0xd2,
0xa4,0x33,0x32,0x31,0xbc,0xa5,0xb8,0xd3,
0xa4,0x2e,0xa2,0x30,0xbe,0xba,0xb6,0xd4,
0xa4,0xa1,0xc9,0xbb,0xca,0xcb,0xcc,0xd5
};
void RcvDataBy232(void);
void TranDataBy232(void);
void RecvToBuf(void);
void SendBuf(uchar order,uchar len);
void OpeningBeep(uchar OBN);
uchar Key_Press(void);
void InitSBUF(void);
void DELAY(uint z);
void RestWatchdog(void);
uchar ScanKey(void);
uchar StartPYKey(void);
void CheckPYTab(void);
void delayms(uchar t1,uchar t2);
void CheckLED(void);
/*****************************
----- 定时器1中断服务程序 ---
*****************************/
void TimeCount1(void) interrupt 3 using 0
{
_nop_();
}
/*****************************
---- 定时器0中断服务程序 ----
*****************************/
void TimeCount0(void) interrupt 1 using 0
{
_nop_();
}
/*****************************
----- 外部中断0 -----
/****************************/
void External0(void) interrupt 0 using 2
{
TestLED=0;
delayms(90,90);
TestLED=1;
_nop_();
KeyInt=Low;
}
/*****************************
------ 外部中断1 -------
*****************************/
void External1(void) interrupt 2 using 3
{
_nop_();
}
/*****************************************************
-------从串行端口接收一字节数据,并存入UC0变量中------
*****************************************************/
void RcvDataBy232(void)
{
counter=0;
do{
counter++;
RestWatchdog();
if(counter>0x6ff)
{ uc0=Error;goto rete1;} /* 1fff */
RestWatchdog();
} while(RI==0);
uc0=SBUF;
rete1: RI=0;
}
/*****************************************************
-------从串行端口发送一字节数据,数据已存入SBUF中------
*****************************************************/
void TranDataBy232(void)
{
while(TI==0) RestWatchdog();
TI=0;
}
/*********************************************************************
------------ 主从多机串行中断服务程序 ------------------
-- 主机先发送地址帧,从机接收到地址帧后,先判断是否为键盘地址:是则接收
-- 主机发送过来的所有数据信息,否则返回.
*********************************************************************/
void SerialCom(void) interrupt 4 using 1
{
// uchar data i;
EA=0;
ES=0; /* 关串行中断 */
SBUF=RetKey;
TranDataBy232();
RcvDataBy232();
if(uc0!=SLAVEKEY_Addr){ /* 非本机地址,继续监听 */
goto reti;
}
SBUF=SLAVEKEY_Addr;
TranDataBy232();
RecvToBuf();
reti:
ES=1;
RI=0; TI=0; EA=1;
}
/***********************************************************************
-- 从机接收主机按如下命令格式发送来的信息,数据保存至UN.COMBUF缓冲区中:
-- 包头(1,0xAA) + 键盘地址(1) + 命令(1) + 长度(1) + 数据 + Checksum(1)
-- 接收完成标志:fini=1;命令:handle;
***********************************************************************/
void RecvToBuf(void)
{
uchar data i;
uint data pp,tempint;
RcvDataBy232();
if(uc0!=0xaa){
uc0=0xff; goto ret1; /* 不是包头 */
}
pp=0xaa; /* 清校验和 */
RcvDataBy232();
pp=pp+uc0;
if(uc0!=SLAVEKEY_Addr){
uc0=0xff; goto ret1; /* 不是本机地址 */
}
RcvDataBy232(); pp=pp+uc0;
handle=uc0;
RcvDataBy232(); pp=pp+uc0;
Slen=uc0;
for(i=0;(i<Slen) && (i<10);i++){
RcvDataBy232();
Un.ComBuf[i]=uc0;
pp+=uc0; /* 接收一数据 */
}
RcvDataBy232(); /* 接收校验和 */
tempint=0;
tempint=(uint)(uc0*256);
RcvDataBy232();
tempint=tempint+uc0;
if(tempint==pp){ /* 效验和相同 */
SBUF=OK;
TranDataBy232();
fini=1;
}
else{ /* 如果接收效验和不相同,则回送失败信息给主机 */
SBUF=Error;
TranDataBy232();
fini=0;
}
ret1: _nop_();
}
/***********************************************************************
-- 从机向主机发送数据,数据已存在UN.COMBUF缓冲区中:
-- 包头(1,0xAA) + 命令(1) + 长度(1) + 数据 + Checksum(1)
***********************************************************************/
void SendBuf(uchar order,uchar len)
{
uchar data i;
uint data CheSum;
ulong l=0;
do{
do{
SBUF=0xaa;
TranDataBy232();
RcvDataBy232();
} while(uc0!=0xbb); /* 等待主机回送准备好 0XBB */
SBUF=order; /* 发送命令句柄 */
TranDataBy232();
CheSum=order; /* 初始化校验和 */
SBUF=len; /* 发送数据长度 */
TranDataBy232();
CheSum+=len;
for(i=0;i<len;i++)
{ /* 发送数据 */
SBUF=Un.ComBuf[i];
TranDataBy232();
CheSum+=Un.ComBuf[i];
}
SBUF=CheSum/256;
TranDataBy232(); /* 送校验和 */
SBUF=CheSum%256;
TranDataBy232();
RcvDataBy232();
}while(uc0!=OK); /* 如果主机返回成功信号则退出,否则重新发新 */
}
/*******************************************
---------- 初始化串行口来多机通信 ---------
*******************************************/
void InitSBUF(void)
{
TMOD=0x21; /* T/C1定义为方式2 */
TL1=0xfd; /* 9600时TH1,TL1=0xfd,1200时TH1,TL1=0XE8 */
TH1=0xfd;
PCON=0x0;
SCON=0x50; /* 串行口为方式3,SM2=1,TB8=0,RB8=0 */
/* SM0=0;*/
TR1=1; ES=0; IT0=0; EX0=0; /*ET0=1; ES=1; TR0=1;*/
/* SM2=1; PS=1;*/
RI=0; TI=0; EA=1;
}
/*****************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -