📄 cnc2119.c
字号:
/*====================================================
====================================================*/
#include"config.h"
#include "constant.h"
#define BPS_1000K 0<<23|1<<20|1<<16|1<<17|0<<14|0x03 //定义CAN通信波特率
//独立按键定义
#define S_And (1<<4)
#define S_Sub (1<<5)
#define X_And (1<<6)
#define X_Sub (1<<7)
#define Y_And (1<<8)
#define Y_Sub (1<<9)
#define Z_And (1<<20)
#define Z_Sub (1<<21)
#define Gxcjc (1<<22)
#define KEYCON (S_And|S_Sub|X_And|X_Sub|Y_And|Y_Sub|Z_And|Z_Sub|Gxincjc)
//旋转按钮定义
#define R_Key0 (1<<8)
#define R_Key1 (1<<9)
#define R_Key2 (1<<10)
#define R_Key3 (1<<11)
#define R_Key4 (1<<12)
#define R_Key5 (1<<13)
#define R_Key6 (1<<14)
#define R_Key7 (1<<15)
#define RKEYCON (R_Key0|R_Key1|R_Key2|R_Key3|R_Key4|R_Key5|R_Key6|R_Key7)
#define R_Oe0 (1<<12)
#define R_Oe1 (1<<13)
#define ROECON (R_Oe0|R_Oe1)
//#define PINCON (KEYCON|RKEYCON|ROECON)
//#define D_ma 0xF0
/*==========================端口定义=========================*/
/*===========================CH452L==========================*/
const unsigned int CH452_SCL=(1<<11); //P0.11为SCL
const unsigned int CH452_SDA=(1<<14); //P0.14为SDA
const unsigned int CH452_EINT=(1<<15); //P0.15为EINTY2
// 2线接口的CH452定义
#define CH452_I2C_ADDR0 0x40 // CH452的ADDR=0时的地址
#define CH452_I2C_ADDR1 0x60 // CH452的ADDR=1时的地址,默认值
#define CH452_I2C_MASK 0x3e // CH452的2线接口高字节命令掩码
//定义串口模式设置数据结构
typedef struct UartMode
{
uint8 datab; //字长度5,6,7,8
uint8 stopb; //停止位,1、2
uint8 parity; //奇偶校验位,0为无校验,1为奇数校验,2为偶数校验
}UARTMODE;
//按键编码定义
uint16 keylist[6][6]={
{0x0780,0x0740,0x0720,0x0710,0x0708,0x0704},
//程式空跑,选择停止,加工吹气,Z轴锁定,单节忽略,MST锁定
{0x0280,0x0740,0x0220,0x0210,0x0208,0x0204},
//主轴定位,主轴正转,主轴停止,主轴反转, ,中心出水
{0x0380,0x0340,0x0320,0x0310,0x0308,0x0304},
//工作灯,冷却液手,冷却液自,卷屑反转,卷屑停止,卷屑正转,
{0x0402,0x0401,0x0640,0x0620,0x0610,0x0608},
//程式停止,程式启动,H4,HZ,HY,HX
{0x0601,0x0702,0x0701,0x0202,0x0201,0x0820},
//手轮方式*1,机械锁定,单节执行,底板冲刷,自动断电, KEY PROG
{0x0302,0x0301,0x0604,0x0602,0xffff,0xffff},
//刀库反转,刀库正转,*100,*10
};
uint16 RolaKey[5][8]={
{0x011f,0x011e,0x011d,0x011c,0x011b,0x011a,0x0119,0x0118},
//0,10,20,30,40,50,60,70,
{0x0117,0x0116,0x0115,0x0114,0x0113,0x0112,0x0111,0x0110},
//80,90,100,110,120,130,140,150
{0x01e0,0x01c0,0x01a0,0x0180,0x0160,0x0140,0x0120,0x0100},
//连线,编辑,自动,MDI,手动,快送,寸动,原点
{0x0807,0x0806,0x0805,0x0804,0x0803,0x0802,0x0801,0x0800},
//50,60,70,80,90,100,110,120
{0x0830,0x0820,0x0810,0x0800,0xffff,0xffff,0xffff,0xffff}
//F0,25,50,100
};
uint16 IndeKey[8]={0x0011,0x0022,0x0033,0x0044,0x0055,0x0066,0x0077,0x0088};
uint8 rcv_buf[8]; //UART0数据接收缓冲区
uint8 rcv_new; //接收新数据标志
volatile uint32 val; //存储接收到的数据变量
uint8 nled;
UARTMODE uart0_set;
/*=======================函数声明==========================*/
void Nop(unsigned char dly);
void CH452I2CStart(void); //发送起始条件
void CH452I2CStop(void) ; //发送停止条件
void CH452I2CWrByte(uint8 dat); //发送一个字节数据
void CH452I2CWrite(uint16 command); //发送命令
uint8 CH452I2CRdByte(void); //读一个字节数据
uint8 CH452I2CRead(void); //得到KEY值
void CH452Init(void); //初始化
void sendmake(uint16 make_code); //发送通码,按键按下,或持续
void sendbreak(uint16 make_code); //发送断码,按键释放后
uint32 KeyDone(uint32 dat);
void SendByte(uint8 data);
uint8 ISendBuf(uint32 data);
uint8 UART0_Ini(uint32 baud,UARTMODE set);
void IRQ_UART0(void) __irq;
uint8 SendData(uint32 data);
void InitCAN(void);
void IRQ_CAN(void) __irq;
/*======================================================
**函数名称:_Nop()
**功能:延时函数
**入口参数:dly
**出口参数:无
=======================================================*/
void Nop(unsigned char dly)
{
unsigned char i;
for(i=0;i<dly;i++);
}
/*=======================================================
**函数名称:CH452I2CStart()
**功能:启动模拟I2C通讯
**入口参数:无
**出口参数:无
========================================================*/
void CH452I2CStart(void)
{
IO0DIR|=CH452_SCL|CH452_SDA;
IO0SET=CH452_SDA; //发送起始条件的数据信号
Nop(1);
IO0SET=CH452_SCL;
Nop(5);//起始条件建立时间大于4.7us,延时
IO0CLR=CH452_SDA; /*发送起始信号*/
Nop(5); // 起始条件锁定时间大于4μs
IO0CLR=CH452_SCL; //钳住I2C总线,准备发送或接收数据
Nop(5);
}
/*========================================================
**函数名称:CH452I2CStop()
**功能:停止模拟I2C通讯
**入口参数:无
**出口参数:无
=========================================================*/
void CH452I2CStop(void)
{
IO0CLR=CH452_SDA; //发送结束条件的数据信号
Nop(1);
IO0SET=CH452_SCL; //结束条件建立时间大于4μs
Nop(5);
IO0SET=CH452_SDA; /*发送I2C总线结束信号*/
Nop(5);
}
/*========================================================
**函数名称:CH452I2CWrByte()
**功能:发送一个字节数据
**入口参数:c 发送数据
**出口参数:无
============================================================*/
void CH452I2CWrByte(uint8 dat)
{
uint8 i;
for(i=0;i!=8;i++) // 输出8位数据
{
if((dat<<i)&0x80)
{
IO0SET=CH452_SDA;
}
else
{
IO0CLR=CH452_SDA;
}
Nop(15);
IO0SET=CH452_SCL;
Nop(15);
IO0CLR=CH452_SCL;
}
Nop(15);
IO0SET=CH452_SDA;
Nop(15);
IO0SET=CH452_SCL; // 接收应答
Nop(15);
IO0CLR=CH452_SCL;
Nop(15);
}
/*======================================================
**函数名称:CH452I2CWrite()
**功能:发送命令
**入口参数:command 发送数据
**出口参数:无
========================================================*/
void CH452I2CWrite(uint16 command)
{
CH452I2CStart(); //启动总线
#ifdef ENABLE_2_CH452 // 若有两个CH452并连
CH452I2CWrByte((uint8)(command>>7)&CH452_I2C_MASK|CH452_I2C_ADDR0); // CH452的ADDR=0时
#else
CH452I2CWrByte((uint8)(command>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1); // CH452的ADDR=1时(默认)
#endif
CH452I2CWrByte((uint8)command); //发送数据
CH452I2CStop(); //结束总线
}
/*====================================================
**函数名称:CH452I2CRdByte()
**功能:读一个字节数据
**入口参数:无
**出口参数:c 返回得到数据
========================================================*/
uint8 CH452I2CRdByte(void) //读一个字节数据
{
uint8 dat,i;
dat=0;
IO0SET=CH452_SDA; //置数据线为输入方式
for(i=0;i!=8;i++) // 输入8位数据
{
Nop(15);
IO0CLR=CH452_SCL; //置时钟线为低,准备接收数据位
Nop(20);
IO0SET=CH452_SCL; //置时钟线为高使数据线上数据有效
Nop(20);
dat<<=1;
IO0DIR&=(~CH452_SDA); /* 设置SDA为输入方向 */
if((IO0PIN&(CH452_SDA)))
dat++; //读数据位,接收的数据位放入 dat中
Nop(20);
}
IO0DIR|=CH452_SDA;
IO0CLR=CH452_SCL;
Nop(20);
return(dat);
}
/*=====================================================
**函数名称:CH452I2CRead()
**功能:得到KEY结果
**入口参数:无
**出口参数:KEY 返回按键值
========================================================*/
uint8 CH452I2CRead(void)
{
uint8 key;
CH452I2CStart(); //启动总线
CH452I2CWrByte((uint8)(CH452_GET_KEY>>7)&CH452_I2C_MASK|0x01|CH452_I2C_ADDR1); // 若有两个CH452并连,当ADDR=0时,需修改为CH452_I2C_ADDR0
key=CH452I2CRdByte(); //读取数据
CH452I2CStop(); //结束总线
return(key);
}
/*==========================================================
**函数名称:CH452Init()
**功能:初始化
**入口参数:无
**出口参数:无
=============================================================*/
void CH452Init(void)
{
//LED指示
CH452I2CWrite(CH452_SYSON1); //两线制方式,如果SDA用做按键中断输出,那么命令应该为(0x04,0x23)
CH452I2CWrite(CH452_DSP); // BCD译码,8个数码管
//单按按键
CH452I2CWrite(CH452_SYSON2); //两线制方式,如果SDA用做按键中断输出,那么命令应该为(0x04,0x23)
}
/*============================================================
**函数名称:InitCAN()
**功能:初始化
**入口参数:无
**出口参数:无
============================================================*/
void InitCAN(void)
{
PCONP|=~((uint32)0X01<<13);
PINSEL1=PINSEL1|0x02<<18;
CAN1MOD=CAN1MOD|0X01; //软件复位CAN1控制器
//CAN1CMR=0X10;
CAN1BTR|=BPS_1000K;
CAN1EWL=0X60;
CAN1IER=0X01;
CAN1MOD=CAN1MOD&0XFE; //软件复位CAN1控制器
VICIntSelect=0x00000000;
VICVectCntl0=0x37;
VICVectAddr0=(int)IRQ_CAN; //设置CAN1为非向量中断
VICIntEnable|=(1<<19)|(1<<26); //使能CAN1、CAN2中断通道
CANAFMR=0x03; //设置验收过滤模式为旁路模式
//while(1); //等待中断
}
/*=================================================================
**函数名称:SendData()
**功能:发送数据
**入口参数:row,col
**出口参数:无
=======================================================================*/
uint8 SendData(uint32 data)
{ //CAN1为键盘接口
//InitCAN();
CAN1TFI1|=(0<<31)|(0<<30)|(2<<16); //帧信息:标准数据帧,8位数据
CAN1TID1=0x0020; //帧ID:0xAA
CAN1TDA1=data; //前4字节数据
//CAN1TDB1=keylist[row][col]>>32; //后4字节数据
CAN1CMR=1<<5|1; //选择第一个缓冲并启动发送
while((CAN1GSR&0X01)==0);
CAN1CMR=0x04;
return 1;
}
/*=================================================================
**函数名称:IQR_CAN()
**功能:中断接收
**入口参数:无
**出口参数:无
=====================================================================*/
void IRQ_CAN(void) __irq
{
val=CAN1ICR; //清除中断方式
CAN1TFI1=CAN1RFS&0xff00;
//接收到的帧信息写入发送帧信息寄存器
CAN1TID1=CAN1RID; //接收到的帧ID写入发送帧ID寄存器
CAN1TDA1=CAN1RDA; //前4字节数据定入发送前4字节寄存器
val=CAN1RDA; //后4字节数据定入发送后4字节寄存器
CAN1CMR=1<<5|1; //选择第一缓冲并启动发送
CAN1CMR=0x04; //释放接收缓冲
VICVectAddr=0; //通知中断结束
}
/*====================================================
**函数名称:IRQ_UART0()
**功能:中断接收
**入口参数:无
**出口参数:无
====================================================*/
void IRQ_UART0(void) __irq
{
uint8 i;
if(0x04==(U0IIR&0X0F))
rcv_new=1; //设置接收到新的数据标志
for(i=0;i<2;i++)
{
rcv_buf[i]=U0RBR; //读取FIFO数据,并清除中断标志
}
VICVectAddr=0x00; //中断结束
}
/*===================================================
**函数名称:SendByte()
**功能:发送一字节数据
**入口参数:data
**出口参数:无
=======================================================*/
void SendByte(uint8 data)
{
U0THR=data; //发送数据
//while((U0LSR&0x04)==0);
}
/*================================================
**函数名称:ISendBuf()
**功能:发送2字节数据
**入口参数:无
**出口参数:无
==================================================*/
uint8 ISendBuf(uint32 data)
{
uint8 i;
uint32 dat;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -