📄 keyboad.c
字号:
#include<reg51.h>
#include<stdio.h>
#include<absacc.h>
#include <intrins.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//#define MyAddress 0x01
//#define MyTeam 0x01
sbit LedEnter=P2^0;
sbit LedInsert=P2^1;
sbit LedSet=P2^2;
sbit Beep=P2^3;
sbit HT1621_CS=P3^5;
sbit HT1621_WR=P3^4;
sbit HT1621_DT=P3^3;
sbit Int0=P3^2;
sbit r0=P1^7;
sbit r1=P1^6;
sbit r2=P1^5;
sbit r3=P1^4;
sbit l0=P1^3;
sbit l1=P1^2;
sbit l2=P1^1;
sbit l3=P1^0;
sbit IO=P3^7;
uchar OldCode[2]={0x00,0x00};
uchar Code[4]={0x00,0x00,0x00,0x00};
uchar ESC,Number,INSERT,SET,DELETE,LAST,RECALL,ENTER,PUSH,INSERTOK;
uchar NumKey,OthKey;
uchar ReHostH,ReHostL,ReWaitH,ReWaitL,ReAllow,ReCodeH,ReCodeL,BusState=0XFC;
uchar Times;
uchar code CharTab[] = {// dcbaegf人
0xfb,//0x7d,//0xeb, //0
0x61,//0x60, //1
0xbd,//0x3e, //2
0xf5,//0x7a, //3
0x67,//0x63, //4
0xd7,//0x5b, //5
0xdf,//0x5f, //6
0x71,//0x70, //7
0xff,//0x7f, //8
0xf7,//0x7b, //9
0x01//0x00, //空
};
uchar code CCharTab[]={
//dcbaegf人
0x7f,//a
0xcf,//b
0x9b,//c
0xed,//d
0x9f,//e
0x1f,//f
0x77,//g
0x6f,//h
0xf1//i
};
void delay(uchar n);
void Bee();
void ScanKey();
void Wait();
//**************************************************
void write_clk();
void send_bit(uchar op_code,uchar len);
void send_bit_l(uchar data *op_code,uchar len);
void send_command(command);
void send_data_nibble(uchar addr,uchar dat);
void clr_display();
void init();
void display_char(uchar pos,uchar num);
void display_cchar(uchar pos,uchar num);
//**************************************************
void send0(uchar w);
void send1(uchar w);
void SendBegBus();//总线控制请求
void SendReleaseBus();//总线释放请求
void SendNext();//发送请求下一位
void SendReCall(uchar mm,uchar nn);//发送请求重呼
void SendInsert(uchar mm,uchar nn);//插队
void SendLast(uchar mm,uchar nn);//上一位
//**************************************************
void send0(uchar w)
{
IO=1;
TI=0;
TB8=0;
SBUF=w;
while(!TI);
TI=0;
IO=0;
}
void send1(uchar w)
{
IO=1;
TI=0;
TB8=1;
SBUF=w;
while(!TI);
TI=0;
IO=0;
}
void SendBegBus()//总线控制请求
{
uchar MyTeam,MyAddress;
{
P2=0xff;
P2=0x7f;//第一个
MyTeam=P0;
MyTeam=~MyTeam;
P2=0xff;
P2=0xbf;
MyAddress=P0;
MyAddress=~MyAddress;
}
send1(0xfe);
send0(0xff);
send0(MyAddress);
send0(MyTeam);
IO=0;
}
void SendReleaseBus()//总线释放请求
{
uchar MyTeam,MyAddress;
{
P2=0xff;
P2=0x7f;//第一个
MyTeam=P0;
MyTeam=~MyTeam;
P2=0xff;
P2=0xbf;
MyAddress=P0;
MyAddress=~MyAddress;
}
send1(0xfc);
send0(0xff);
send0(MyAddress);
send0(MyTeam);
IO=0;
}
void SendNext()//发送请求下一位
{
uchar MyTeam,MyAddress;
{
P2=0xff;
P2=0x7f;//第一个
MyTeam=P0;
MyTeam=~MyTeam;
P2=0xff;
P2=0xbf;
MyAddress=P0;
MyAddress=~MyAddress;
}
send1(0xfd);
send0(0xff);
send0(MyAddress);
send0(MyTeam);
send0(0x03);
IO=0;
}
void SendReCall(uchar mm,uchar nn)//发送请求重呼
{
uchar MyTeam,MyAddress;
{
P2=0xff;
P2=0x7f;//第一个
MyTeam=P0;
MyTeam=~MyTeam;
P2=0xff;
P2=0xbf;
MyAddress=P0;
MyAddress=~MyAddress;
}
send1(0xfd);
send0(0xff);
send0(MyAddress);
send0(MyTeam);
send0(0x04);
send0(mm);
send0(nn);
IO=0;
}
void SendInsert(uchar mm,uchar nn)//插队
{
uchar MyTeam,MyAddress;
{
P2=0xff;
P2=0x7f;//第一个
MyTeam=P0;
MyTeam=~MyTeam;
P2=0xff;
P2=0xbf;
MyAddress=P0;
MyAddress=~MyAddress;
}
send1(0xfd);
send0(0xff);
send0(MyAddress);
send0(MyTeam);
send0(0x04);
send0(mm);
send0(nn);
IO=0;
}
void SendLast(uchar mm,uchar nn)//上一位
{
uchar MyTeam,MyAddress;
{
P2=0xff;
P2=0x7f;//第一个
MyTeam=P0;
MyTeam=~MyTeam;
P2=0xff;
P2=0xbf;
MyAddress=P0;
MyAddress=~MyAddress;
}
send1(0xfd);
send0(0xff);
send0(MyAddress);
send0(MyTeam);
send0(0x04);
send0(mm);
send0(nn);
IO=0;
}
//**************************************************
void Wait()
{
delay(20);
}
void delay(uchar n)
{
uchar i,j;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
;
}
}
}
void Bee()
{
Beep=0;
LedEnter=0;
delay(100);
Beep=1;
LedEnter=1;
}
//********************************************************************************
//扫描键盘
//********************************************************************************
void write_clk()
{
delay(3);
HT1621_WR = 1;
delay(3);
HT1621_WR = 0;
}
void send_bit(uchar op_code,uchar len)
{
while(len--)
{
HT1621_DT = (bit)(op_code&0x80);
write_clk();
op_code = op_code<<1;
}
}
void send_bit_l(uchar data *op_code,uchar len)
{
while(len--)
{
HT1621_DT = (bit)((*op_code)&0x01);
write_clk();
*op_code = (*op_code)>>1;
}
}
void send_command(command)
{
HT1621_CS = 0;
send_bit(0x80,3);
send_bit(command,8);
write_clk();
HT1621_CS = 1;
}
void send_data_nibble(uchar addr,uchar dat)
{
HT1621_CS = 0;
send_bit(0xa0,3);
addr <<= 2;
send_bit(addr,6);
send_bit_l(&dat,4);
HT1621_CS = 1;
}
void clr_display()
{
uchar i;
for(i=11;i<18;i++)
{
send_data_nibble(i,0);
}
}
void init()
{
IE=0x90;
TMOD=0x21; //33M/0xEE;
TH1=0xfa;//24000xe8;//0xd0;//1200//9600/22.11//0xe8;////// fa9600 //0xf44800
TR1=1;
SCON=0xf0;
EA=1;
ES=1;
IO=0;
EX0=1;
IT0=0;
P1=0x0f;
IP=0X10;
SM2=1;
HT1621_CS = 1;
HT1621_WR = 0;
HT1621_DT = 1;
send_command(1); //SYS EN
send_command(3); //LCD ON
send_command(0x0d); //CLR TIMER
send_command(0x0f); //CLR WDT
send_command(0x18); //RC 256K
send_command(0x28); //1/2 bias,1/4 duty
clr_display();
PUSH=0x00;
BusState=0xfc;
Times=4;
ESC=Number=INSERT=SET=DELETE=LAST=RECALL=ENTER=INSERTOK=0x00;
NumKey=OthKey=0x00;
display_char(0,0);
display_char(1,0);
display_char(2,0);
display_char(3,0);
display_char(4,0);
IO=0;
}
void display_char(uchar pos,uchar num)
{
uchar dat;
dat = CharTab[num];
pos = pos*2;
HT1621_CS = 0;
send_bit(0xa0,3);
pos <<= 2;
send_bit(pos,6);
send_bit_l(&dat,8);
HT1621_CS = 1;
}
void display_cchar(uchar pos,uchar num)
{
uchar dat;
dat = CCharTab[num];
pos = pos*2;
HT1621_CS = 0;
send_bit(0xa0,3);
pos <<= 2;
send_bit(pos,6);
send_bit_l(&dat,8);
HT1621_CS = 1;
}
void getbyte(void) interrupt 0 using 0
{
Wait();
if (Int0)return;
// EX0=0;
ScanKey();
while(!Int0);
EX0=1;
}
void receive(void) interrupt 4 using 3
{
uchar TempData,MyTeam,MyAddress;
//uint Addr;
uchar BadData1,BadData2,BadData3;
if (TI==1)
{
return;
}
{
P2=0xff;
P2=0x7f;//第一个
MyTeam=P0;
MyTeam=~MyTeam;
P2=0xff;
P2=0xbf;
MyAddress=P0;
MyAddress=~MyAddress;
}
if (RI)
{
TempData=SBUF;
RI=0;
if (TempData==MyAddress )//窗口
{
RI=0;
SM2=0;
TempData=_getkey();
if (TempData==MyTeam)//队列
{
ReHostH=_getkey();//0xfd
RI=0;
ReHostL=_getkey();//0xff
RI=0;
ReAllow=_getkey();
RI=0;
if (ReAllow!=0x00)return;
OldCode[0]=ReCodeH;
ReCodeH=_getkey();
RI=0;
OldCode[1]=ReCodeL;
ReCodeL=_getkey();
RI=0;
ReWaitH=_getkey();
RI=0;
ReWaitL=_getkey();
}
else
{
goto ee;
}
}
else if (TempData==0xf8)
{
RI=0;
SM2=0;
TempData=_getkey();
if (TempData==0xff)
{
ReHostH=_getkey();
ReHostL=_getkey();
TempData=_getkey();
if (TempData==0x07)
{
TempData=_getkey();//窗口号
TempData=_getkey();
if (TempData==MyTeam)
{
ReWaitH=_getkey();
ReWaitL=_getkey();
}
}
else
{
goto ee;
}
}
else
{
goto ee;
}
}
else if ((TempData==0xfe)||(TempData==0xfc))
{
BusState=TempData;//0xdf 0xef
SM2=0;
BadData1=_getkey();
BadData2=_getkey();
BadData3=_getkey();
RI=0;
}
else
{
goto ee;
}
}
ee: SM2=1;
}
void main()
{
uchar DNumH,DNumL;
uchar TCode[10];
//uchar DCodeH,DCodeL;
init();
ES=1;
while(1)
{
// ScanKey();
if (PUSH==0xff && INSERT==0xff)//插入键
{
INSERT=0X00;
PUSH=0X00;
clr_display();
display_char(5,10);
display_char(6,10);
display_char(7,10);
display_char(8,10);
display_char(9,10);
Times=4;
INSERTOK=0XFF;
}
if (PUSH==0xff && Times<9 && NumKey==0xff && OthKey==0x00 && INSERTOK==0XFF)
{
Times=Times+1;
PUSH=0x00;
if (Times==5)
{
display_cchar(Times,Number);
}
else
{
display_char(Times,Number);
}
NumKey=0x00;
Code[Times]=Number;
}
else if (PUSH==0xff && Times>=9 && NumKey==0xff&& OthKey==0x00 && INSERTOK==0XFF)
{
Times=9;
PUSH=0x00;
display_char(9,Number);
NumKey=0x00;
Code[Times]=Number;
}
if (PUSH==0xff && ESC==0xff && OthKey==0xff)//ESC键
{
ESC=0X00;
PUSH=Number=INSERTOK=SET=DELETE=LAST=RECALL=ENTER=0x00;
Times=5;
//是否考虑加入显示原处理号码(因为此时已经清除)
}
if (PUSH==0xff && Times>4 && DELETE==0xff&& OthKey==0xff && NumKey==0x00 && INSERTOK==0XFF)//删除键
{
PUSH=DELETE=0x00;
display_char(Times,10);
Times=Times-1;
}
if (PUSH==0XFF && ENTER==0XFF && OthKey==0xff && INSERTOK!=0xff)//回车键
{
PUSH=ENTER=0X00;
//GETOK=0x00;//首先将标志字节置零
while(BusState!=0xfc);
SendBegBus();
SendNext();
SendReleaseBus();
}
else if (PUSH==0XFF && ENTER==0XFF && OthKey==0xff && INSERTOK==0xff)//插入回车
{
PUSH=ENTER=INSERTOK=0X00;
DNumH=Code[5]*0x10+(Code[6]*1000+Code[7]*100+Code[8]*10+Code[9])/256;
DNumL=(Code[5]*1000+Code[6]*100+Code[7]*10+Code[8])%256;//Code[2]*0x10+Code[3]*0x01;
//ReCodeH=DNumH;//(Code[0]*10000+Code[1]*1000+Code[2]*100+Code[3]*10+Code[4])/256;
//ReCodeL=DNumL;//(Code[0]*10000+Code[1]*1000+Code[2]*100+Code[3]*10+Code[4])%256;
while(BusState!=0xfc);
SendBegBus();
SendInsert(DNumH,DNumL);
SendReleaseBus();
}
if (PUSH==0xff && RECALL==0xff && OthKey==0xff)//重呼键
{
PUSH=RECALL=0x00;
while(BusState!=0xfc);
SendBegBus();
SendReCall(ReCodeH,ReCodeL);
SendReleaseBus();
//&&&&&&&&
}
if (PUSH==0xff && LAST==0xff && OthKey==0xff)//上一位
{
PUSH=LAST=0X00;
while(BusState!=0xfc);
SendBegBus();
SendLast(OldCode[0],OldCode[1]);
SendReleaseBus();
}
//delay(100);
if (INSERTOK!=0xff)//非插入状态下
{
TCode[0]=(ReWaitH*256+ReWaitL)/10000;
TCode[1]=((ReWaitH*256+ReWaitL)%10000)/1000;
TCode[2]=((ReWaitH*256+ReWaitL)%1000)/100;
TCode[3]=((ReWaitH*256+ReWaitL)%100)/10;
TCode[4]=(ReWaitH*256+ReWaitL)%10;
display_char(0,TCode[0]);
display_char(1,TCode[1]);
display_char(2,TCode[2]);
display_char(3,TCode[3]);
display_char(4,TCode[4]);
TCode[5]=ReCodeH/0x10;
TCode[6]=(((ReCodeH%0x10)*0x100+ReCodeL))/1000;
TCode[7]=(((ReCodeH%0x10)*0x100+ReCodeL)%1000)/100;
TCode[8]=(((ReCodeH%0x10)*0x100+ReCodeL)%100)/10;
TCode[9]=((ReCodeH%0x10)*0x100+ReCodeL)%10;
display_cchar(5,TCode[5]);
display_char(6,TCode[6]);
display_char(7,TCode[7]);
display_char(8,TCode[8]);
display_char(9,TCode[9]);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -