⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cnc2119.c

📁 基于ARM7与CAN总线的加工中心面板控制系统软件。选用ARM单片机且带CAN接口的lpc2119芯片
💻 C
📖 第 1 页 / 共 2 页
字号:
/*====================================================




====================================================*/
#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 + -