📄 51keyboard_display.c
字号:
#include "F020_FlashPrimitives.h"
#include<stdio.h>
#include "C8051F020.h"
#define N 50
#define WRITE 0x00
#define READ 0x01
#define EEPROM_ADDR 0xA0
#define SMB_BUFF_SIZE 0x08
#define SMB_BUS_ERROR 0x00
#define SMB_START 0x08
#define SMB_RP_START 0x10
#define SMB_MTADDACK 0x18
#define SMB_MTADDNACK 0x20
#define SMB_MTDBACK 0x28
#define SMB_MTDBNACK 0x30
#define SMB_MTARBLOST 0x38
#define SMB_MRADDACK 0x40
#define SMB_MRADDNACK 0x48
#define SMB_MRDBACK 0x50
#define SMB_MRDBNACK 0x58
unsigned char * pSMB_DATA_IN;
unsigned char SMB_SINGLEBYTE_OUT;
unsigned char * pSMB_DATA_OUT;
unsigned char SMB_DATA_LEN;
unsigned char WORD_ADDR;
unsigned char TARGET;
bit SMB_BUSY = 0;
bit SMB_RW;
bit SMB_SENDWORDADDR;
bit SMB_RANDOMREAD;
bit SMB_ACKPOLL;
sfr16 TMR3RL = 0x92; // Timer3 reload registers
sfr16 TMR3 = 0x94; // Timer3 counter registers
sbit SDA = P0^2;
sbit SCL = P0^3;
//sbit D0=P3^0;
//sbit D1=P3^1;
//sbit D2=P3^2;
//sbit D3=P3^3;
sbit DP=P3^4;
sbit A0=P3^5; //地址扫描线
sbit A1=P3^6;
sbit A2=P3^7;
sbit RL0=P2^0; //按键输入接口
sbit RL1=P2^1;
sbit RL2=P2^2;
sbit RL3=P2^3;
sbit RL4=P2^4;
sbit RL5=P2^5;
sbit con0=P1^0; //计数器数据读取口
sbit con1=P1^1;
sbit con2=P1^2;
sbit con3=P1^3;
sbit AA0=P1^4; //计数器数据 位选择 地址线
sbit BB0=P1^5;
bit keyflag=0,rkey=0;
bit one,two,three,four; // 自检状态下1234 标志
bit keyrelease0=1,keyrelease1=1,keyrelease2=1,keyrelease3=1,keyrelease4=1,keyrelease5=1,keyrelease6=1,keyrelease7=1,keyrelease8=1;
bit keyrelease9=1,keyrelease10=1,keyrelease11=1,keyrelease12=1,keyrelease13=1,keyrelease14=1,keyrelease15=1,keyrelease16=1;
bit keyrelease21=1,keyrelease22=1,keyrelease23=1,keyrelease30=1,keyrelease31=1,keyrelease32=1;
bit dot0,dot1,dot2;
bit fu=1,yang=1,zheng=1,fan=1,sudu=1;//方向键 释放标志 1时说明 释放
bit STATE0 ;
unsigned char xdata STATE1;
unsigned int xdata jdot0=0,jdot1=0,jdot2=0;
float targetH; //目标高度
unsigned char xdata key,keycode;
unsigned int xdata dataH,datahh,datalw;
long datajj;
unsigned char code DIS_DAT[16]={0x0,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
unsigned char code DIS_BIT[6]={0x00,0x20,0x40,0x60,0x80,0xa0};
unsigned char xdata KeyData[40]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};
unsigned char xdata M=0,C=0,c01=0x0a,c02=0x0c;
void DataDish(unsigned int dataTmp) ;
void DataDisHH(unsigned int dataTmp) ;
void zijian();
void ceju();
void delay(int m) ;
void Port_IO_Init() ;
void Oscillator_Init() ;
void Init_Device();
void Timer_Init();
void UART_Init();
void send(unsigned char jianzhi);
void DataDisZ( unsigned char c1,unsigned char c2,unsigned int dataTmp) ;
void DataDisL( unsigned int dataTmp);
void DataDisJ( long dataTmp) ;
void lingweiread();
void lingweiwrite();
void jiaojuwrite();
void jiaojuread();
void SMBus_Init(void);
void Timer3_Init(void);
void SMBus_ISR(void);
void Timer3_ISR(void);
void EEPROM_ByteWrite(unsigned char addr, unsigned char dat);
void EEPROM_WriteArray(unsigned char dest_addr, unsigned char* src_addr,
unsigned char len);
unsigned char EEPROM_ByteRead(unsigned char addr);
void EEPROM_ReadArray(unsigned char* dest_addr, unsigned char src_addr,
unsigned char len);
main()
{
WDTCN = 0xde;
WDTCN = 0xad;
Init_Device();
EIE1 |= 0x02;
SI = 0;
TR0=1 ;
TR1=1;
EA=1;
ES0 = 0;
send(0x20);
while(1)
{
while(keyflag) ;
if(rkey==1)
{
keycode = key;
if(keycode==31)
ceju();
else if(keycode==12)
zijian();
else if(keycode==21) //急停
{
send(0x15);
}
else if((keycode==13&&sudu==0)||(keycode==30&&yang==0))
send(0x11);
else if(keycode==13&&sudu==1) //方向键值 连发
{
send(0x0D);
if(yang==1)
{
send(0x21);
send(0x21);
send(0x21);
yang=0;
}
}
else if((keycode==14&&sudu==0)||(keycode==30&&fu==0))
send(0x12);
else if(keycode==14&&sudu==1)
{
send(0x0E);
if(fu==1)
{
send(0x21);
send(0x21);
send(0x21); //若方向键弹起则发送三个弹起键值
fu=0;
}
}
else if((keycode==15&&sudu==0)||(keycode==30&&fan==0))
send(0x13);
else if(keycode==15&&sudu==1)
{
send(0x0F);
if(fan==1)
{
send(0x21);
send(0x21);
send(0x21);
fan=0;
}
}
else if((keycode==16&&sudu==0)||(keycode==30&&zheng==0))
send(0x14);
else if(keycode==16&&sudu==1) //方向键值 连发
{
send(0x10);
if(zheng==1)
{
send(0x21);
send(0x21);
send(0x21); //若方向键弹起则发送三个弹起键值
zheng=0;
}
}
else if(keycode==22)
{
send(0x16);
}
else if(keycode==23)
send(0x17); /////////////// 稳定攻击 ////////////////////////
// send(0x18); ////////////// 稳定搜索 ////////////////////////
// else if(keycode==30)
// send(0x1E);
else
{STATE0=0;STATE1=0; }
rkey=0;
}
}
}
void DataDish(unsigned int dataTmp)
{
switch(M)
{
case 0:
P3=P3&0xf0|0x0A;DP=0;
break;
case 2:
{P3 = P3&0xf0|DIS_DAT[dataTmp/1000];DP=0;}
break;
case 3:
{P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=0;}
break;
case 4:
P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10] ;DP=0;
break;
case 5: P3 = P3&0xf0|DIS_DAT[dataTmp%10]; DP=0;
break;
case 1:
P3 = P3&0xf0|0x0c;DP=0;
break;
default: break;
}
}
void DataDisZ( unsigned char c1,unsigned char c2,unsigned int dataTmp) //////////////////////////////
{
switch(M)
{
case 0:
{P3 = P3&0xf0|DIS_DAT[c1];DP=0;}
break;
case 1:
{P3 = P3&0xf0|DIS_DAT[c2];DP=0;}
break;
case 2:
{P3 = P3&0xf0|DIS_DAT[dataTmp/1000];DP=0;}
break;
case 3:
{P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=0;}
break;
case 4:
P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10] ;DP=0;
break;
case 5: P3 = P3&0xf0|DIS_DAT[dataTmp%10]; DP=0;
break;
default: break;
}
}
void DataDisL( unsigned int dataTmp) //////////////////////////////
{
switch(M)
{
case 0:
{P3 = P3&0xf0|DIS_DAT[14];DP=0;}
break;
case 1:
{P3 = P3&0xf0|DIS_DAT[12];DP=0;}
break;
case 2:
{P3 = P3&0xf0|DIS_DAT[dataTmp/1000];DP=0;}
break;
case 3:
{P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=0;}
break;
case 4:
P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10] ;DP=0;
break;
case 5: P3 = P3&0xf0|DIS_DAT[dataTmp%10]; DP=0;
break;
default: break;
}
}
void DataDisJ( long dataTmp) //////////////////////////////
{
switch(M)
{
case 0:
{P3 = P3&0xf0|DIS_DAT[15];DP=0;}
break;
case 1:
{P3 = P3&0xf0|DIS_DAT[dataTmp/10000];DP=0;}
break;
case 2:
{P3 = P3&0xf0|DIS_DAT[dataTmp%10000/1000];DP=0;}
break;
case 3:
{P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=jdot2;}
break;
case 4:
P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10] ;DP=jdot1;
break;
case 5: P3 = P3&0xf0|DIS_DAT[dataTmp%10]; DP=jdot0;
break;
default: break;
}
}
void DataDisHH(unsigned int dataTmp)
{
switch(M)
{
case 0:
P3 = P3&0xf0|0x0B;DP=0;
break;
case 3: // if(dataTmp/100==0)
// {flagb=1;P3=P3|0x0f;DP=0;}
// else
{P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=dot2;}//flagb=0;}
break;
case 4: //if(flagb==1&&dataTmp/10==0)
// {P3=P3|0x0f;DP=0;}
// else
P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10];DP=dot1 ;
break;
case 5: P3 = P3&0xf0|DIS_DAT[dataTmp%10]; DP=dot0;
break;
case 2:
P3 = P3&0xf0|0x0c;DP=0;
break;
case 1:
P3 = P3&0xf0|0x0c;DP=0;
break;
default: break;
}
}
void Port_IO_Init()
{
XBR0 = 0x05;
XBR2 = 0x40;
P0MDOUT = 0x00;
P1MDOUT = 0xff;
P2MDOUT = 0xff;
P3MDOUT = 0xff;
P0 = 0xFF;
}
void Oscillator_Init()
{
int i = 0;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++);
while ((OSCXCN & 0x80) == 0);
OSCICN = 0x08;
}
void UART_Init() /////////////////////////////////////////////////////
{
SCON0=0x40;
TCON|=0x40;
TMOD|=0x20;
TH1= 0xFA;
TL1=TH1;
TI0=1;
}
void send(unsigned char jianzhi) /////////////////////////////////////////////
{
TI0=0;
SBUF0=jianzhi ;
while(TI0==0) ;
TI0=0;
}
void Init_Device(void)
{
Port_IO_Init();
Oscillator_Init();
Timer_Init();
UART_Init();
SMBus_Init ();
Timer3_Init ();
}
void Timer_Init()
{
TF0=0;
TR0=0;
TMOD|=0x01;
TH0=245;
TL0=250;
ET0=1;
EA=1;
}
void int0_ISR() interrupt 1
{
unsigned int geh,shih,baih,qianh;
unsigned int c0,c1,c2,c3;
TH0=245;
TL0=20;
if(M>=5)
M=0;
else
M++;
if(C>=3)
C=0;
else
C++;
if(C==0)
{
AA0=0;
BB0=0;
delay(N);
if(con0==1)
c0 = 1;
else
c0 = 0;
if(con1==1)
c1 = 2;
else
c1 = 0;
if(con2==1)
c2 = 4;
else
c2 = 0;
if(con3==1)
c3 = 8;
else
c3 = 0;
geh = c3 + c2 + c1 + c0;
}
else if(C==1)
{
AA0=1;
BB0=0;
delay(N);
if(con0==1)
c0 = 1;
else
c0 = 0;
if(con1==1)
c1 = 2;
else
c1 = 0;
if(con2==1)
c2 = 4;
else
c2 = 0;
if(con3==1)
c3 = 8;
else
c3 = 0;
shih = c3 + c2 + c1 + c0;
}
else if(C==2)
{
AA0=0;
BB0=1;
delay(N);
if(con0==1)
c0 = 1;
else
c0 = 0;
if(con1==1)
c1 = 2;
else
c1 = 0;
if(con2==1)
c2 = 4;
else
c2 = 0;
if(con3==1)
c3 = 8;
else
c3 = 0;
baih = c3 + c2 + c1 + c0;
}
else if(C==3)
{
AA0=1;
BB0=1;
delay(N);
if(con0==1)
c0 = 1;
else
c0 = 0;
if(con1==1)
c1 = 2;
else
c1 = 0;
if(con2==1)
c2 = 4;
else
c2 = 0;
if(con3==1)
c3 = 8;
else
c3 = 0;
qianh = c3 + c2 + c1 + c0;
}
datahh = 1000*qianh + 100*baih + 10*shih + geh ;
switch(M)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -