📄 cnc2119.c
字号:
dat=KeyDone(data);
rcv_buf[0]=dat>>8;
rcv_buf[1]=dat;
for(i=0;i<2;i++)
SendByte(rcv_buf[i]);
while((U0LSR&0X20)==0);
return 1;
}
/*================================================
**函数名称:UART0_Ini()
**功能:初始化
**入口参数:baud,set
**出口参数:无
==================================================*/
uint8 UART0_Ini(uint32 baud,UARTMODE set)
{
uint32 bak;
PINSEL0|=0X00000005;
//参数过滤
if((0==baud)||(baud<115200))
return(0);
if((set.datab<5)||(set.datab>8))
return(0);
if((0==set.stopb)||(set.stopb>2))
return(0);
if(set.parity>4)
return(0);
//设置串口波特率
U0LCR=0x80; //DLAB位置1
bak=(Fpclk>>4)/baud;
U0DLM=bak>>8;
U0DLL=bak&0xff;
//设置串口模式
bak=set.datab-5; //设置字长度
if(2==set.stopb)
bak|=0x04; //判断是否为2位停止位
if(0!=set.parity)
{
set.parity=set.parity-1;
bak|=0x08;
}
bak|=set.parity<<4; //设置奇偶校验
U0FCR=0x81;
U0IER=0X01;
U0LCR=bak;
VICIntSelect=0x00000000;
VICVectCntl1=0x26;
VICVectAddr1=(int)IRQ_UART0;
VICIntEnable|=0x00000040;
return(1);
}
/*========================================================
===========================================================*/
uint32 KeyDone(uint32 dat)
{
uint8 row,col,temp;
switch(dat) //按键编码
{
case 0x40:
row=0;
col=0;
nled=0x40;
break;
case 0x48:
row=1;
col=0;
nled=0x48;
break;
case 0x50:
row=2;
col=0;
nled=0x50;
break;
case 0x58:
row=3;
col=0;
nled=0x58;
break;
case 0x60:
row=4;
col=0;
nled=0x60;
break;
case 0x68:
row=5;
col=0;
nled=0x68;
break;
case 0x41:
row=0;
col=1;
nled=0x41;
break;
case 0x49:
row=1;
col=1;
nled=0x49;
break;
case 0x51:
row=2;
col=1;
nled=0x51;
break;
case 0x59:
row=3;
col=1;
nled=0x59;
break;
case 0x61:
row=4;
col=1;
nled=0x61;
break;
case 0x69:
row=5;
col=1;
nled=0x69;
break;
case 0x42:
row=0;
col=2;
nled=0x42;
break;
case 0x4A:
row=1;
col=2;
nled=0x4A;
break;
case 0x52:
row=2;
col=2;
nled=0x52;
break;
case 0x5A:
row=3;
col=2;
nled=0x5A;
break;
case 0x62:
row=4;
col=2;
nled=0x62;
break;
case 0x6A:
row=5;
col=2;
nled=0x6A;
break;
case 0x43:
row=0;
col=3;
nled=0x43;
break;
case 0x4b:
row=1;
col=3;
nled=0x4b;
break;
case 0x53:
row=2;
col=3;
nled=0x53;
break;
case 0x5b:
row=3;
col=3;
nled=0x5b;
break;
case 0x63:
row=4;
col=3;
nled=0x63;
break;
case 0x6b:
row=5;
col=3;
nled=0x6b;
break;
case 0x44:
row=0;
col=4;
nled=0x44;
break;
case 0x4c:
row=1;
col=4;
nled=0x4c;
break;
case 0x54:
row=2;
col=4;
nled=0x54;
break;
case 0x5c:
row=3;
col=4;
nled=0x5c;
break;
case 0x64:
row=4;
col=4;
nled=0x64;
break;
case 0x6c:
row=5;
col=4;
nled=0x6c;
break;
case 0x45:
row=0;
col=5;
nled=0x45;
break;
case 0x4d:
row=1;
col=5;
nled=0x4d;
break;
case 0x55:
row=2;
col=5;
nled=0x55;
break;
case 0x5d:
row=3;
col=5;
nled=0x5d;
break;
case 0x65:
row=4;
col=5;
nled=0x65;
break;
case 0x6d:
row=5;
col=5;
nled=0x6d;
break;
default:
break;
}
temp=keylist[row][col];
//SendData(temp);
return temp;
}
/*====================================================
===================================================*/
void IRQ_Eint0(void) __irq
{ //下面尜加键值处理
uint8 data;
uint32 dat;
CH452I2CWrByte(nled); //相应按键的LED灯亮
data=CH452I2CRead();
dat=KeyDone(data);
SendData(dat);
ISendBuf(dat);
while((EXTINT&0x01)!=0) //等待外部中断信号恢复为高电平
EXTINT=0x01; //清除EINTO中断标志
VICVectAddr=0; //向量中断结束
}
/*=========================================================
通码与断码 make_code 为键盘标准值
==========================================================*/
void sendmake(uint16 make_code) //通码,按键按下,或持续按住
{
SendData(make_code); //直接发低8位
ISendBuf(make_code);
}
/*=============================================================
发送断码,按键释放后
================================================================*/
void sendbreak(uint16 make_code) //断码,按键释放
{
uint8 sendsucc=0; //存储返回值
uint8 t=0; //记次数
while(sendsucc!=0x08) //判断是否发送成功,没有则继续发送断码
{
sendsucc = 0;
t++;
sendsucc+=SendData(0xf0); //发送断码0xf0
sendsucc+=SendData(make_code); //直接发送
sendsucc+=ISendBuf(0xf0);
sendsucc+=ISendBuf(make_code);
if(t==5) //防止一直没有成功发送断码,产生死循环
break;
}
}
/*=============================================================
================================================================*/
void Reset(void)
{
}
/*==============================================================
主函数
================================================================*/
int main(void)
{
uint8 i,j;
uint16 p;
uart0_set.datab=8;
uart0_set.stopb=1;
uart0_set.parity=0;
Reset();
PINSEL0=0x00000000;
PINSEL1=0x00000000;
//IO0DIR=PINCON;
//IO0SET=PINCON;
rcv_new=0;
UART0_Ini(115200,uart0_set);
CH452Init();
InitCAN();
while(1)
{
if(S_And==0) //如果+4按下,则发送通码,否则发送断码
sendmake(IndeKey[0]);
else
sendbreak(IndeKey[0]);
if(S_Sub==0) //如果-4按下,则发送通码,否则发送断码
sendmake(IndeKey[1]);
else
sendbreak(IndeKey[1]);
if(X_And==0) //如果+X按下,则发送通码,否则发送断码
sendmake(IndeKey[2]);
else
sendbreak(IndeKey[2]);
if(X_Sub==0) //如果-X按下,则发送通码,否则发送断码
sendmake(IndeKey[3]);
else
sendbreak(IndeKey[3]);
if(Y_And==0) //如果+Y按下,则发送通码,否则发送断码
sendmake(IndeKey[4]);
else
sendbreak(IndeKey[4]);
if(Y_Sub==0) //如果-Y按下,则发送通码,否则发送断码
sendmake(IndeKey[5]);
else
sendbreak(IndeKey[5]);
if(Z_And==0) //如果+Z按下,则发送通码,否则发送断码
sendmake(IndeKey[6]);
else
sendbreak(IndeKey[6]);
if(Z_Sub==0) //如果-Z按下,则发送通码,否则发送断码
sendmake(IndeKey[7]);
else
sendbreak(IndeKey[7]);
if(R_Oe0==1||R_Oe1==1)
{
for(i=0;i<5;i++)
for(j=0;j<8;j++)
{
p=RolaKey[i][j]&0x00ff;
if(ROECON==p)
{
SendData(RolaKey[i][j]);
ISendBuf(RolaKey[i][j]);
}
}
}
}
// return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -