📄 main.c
字号:
/**********************************************
* 文件名称:
* main.c
* 文件说明:
* 程序运行后,行列扫描键盘工作,有按键按下
* 时按键的键值显示到LED。行列键盘的“#”对应键值为A
* “* ”对应键值为B
**********************************************/
#define MSP430F449_H 0
#include <msp430x44x.h>
/*****************************************************************************
* user constants declarations
******************************************************************************
*/
#define OUTA_U 0x80 /*DA converter A channel */
#define OUTB_I 0x00 /*DA converter B channel */
//#define NO_TOUCH 0x01 /*key press ,not touch plate */
//#define SLOW 0x02 /*start welding,slow wire feed */
//#define NORMAL 0x04 /*normal wire feed */
//#define STOP 0x08 /*no key pressed */
//#define STEP_TWO 0x01 /*two step */
//#define STEP_FOUR 0x02 /*four step */
#define POWER_ON 0x04 /*machine power on */
#define POWER_OFF (~0x04) /*turn off the power source */
#define UG 0x01
#define IG (~0x01)
#define GAS_ON (~0x40) /*turn on gas */
#define GAS_OFF 0x40 /*shut down gas */
#define FEED_ON 0x80 /*wire feed on */
#define FEED_OFF (~0x80) /*wire feed stop */
//asm("DA_DATA equ 0210h");
extern unsigned int DA_DATA;
unsigned int speed = 1;
unsigned char LOW_TEMP = 1 ;
unsigned char HIGH_TEMP = 1 ;
extern unsigned char key_Flag;
void init_Keyboard(void);
void key_Event(void);
void Key_Process(void);
void DaConverter(unsigned char aorb);
void CoderRead(void);
unsigned char Key_Flag;
/***********************************************************
* 延迟,用于消除抖动
************************************************************/
extern void delay(unsigned int cnt)
{
unsigned int tmp;
for(tmp=cnt;tmp>0;tmp--);
}
/**********************************************************
*
***********************************************************/
void init_sys(void)
{
unsigned int tmp1,tmp2;
IE1&=0x00;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
/*clock init**********************************************************/
SCFQCTL=SCFQ_4M ; //N=127 MODULATE ON
SCFI0|=FN_8+0x40; //5~40MHZ, D=2;
FLL_CTL0=0;
FLL_CTL0|=0x80; //DCO在MCLK或SMCLK前分频
FLL_CTL1|=SELS+SELM_XT2+FLL_DIV0 ; //SMCLK,MCLK为XT2CLK,ACLK/2
/*IO port function selection******************************************/
P3SEL|=BIT2+BIT3+BIT5;
P4SEL|=BIT0+BIT1;
P6SEL|=BIT0+BIT1+BIT2+BIT3;
/* IO direction selection *******************************************/
P1DIR|=BIT4+BIT5+BIT6+BIT7;
P3DIR|=BIT0+BIT1+BIT2+BIT4+BIT5+BIT6+BIT7;
P4DIR|=BIT0+BIT2;
P5DIR|=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7;
P6DIR|=BIT4+BIT5+BIT6+BIT7;
/* interrup initiation**************************************************/
P1IE =0x0F;
P1IES=0x00;
P1IFG=0x00;
P2IE =0xFE;
P2IES=0x00;
P2IFG=0x00;
/* assure weld state ***************************************************/
P1OUT|=0xF0;
P3OUT&=GAS_ON;
P3OUT&=IG; //P3.0/PI=0
P3OUT|=FEED_ON;
P4OUT|=POWER_ON;
P3OUT|=BIT1;
/* PWM1 output **************************************************/
TBCTL&=~(MC0+MC1);
TBCTL|=TBSSEL1+CNTL1+CNTL0;
TBCTL&=~(ID1+ID0);
TBCCTL4|=OUTMOD_6;
TBCCTL4&=~CAP;
TBCCR0=0xFE;
TBCTL|=MC0;
TBR=0x00;
for(tmp1=0x10;tmp1<=0x80;tmp1+=0x10) // 检测数码管
{
P6OUT|=tmp1;
delay(65500);
P6OUT&=0x00;
}
P5OUT|=0xff;
for(tmp2=0x90;tmp2<=0xc0;tmp2+=0x10) // 检测LED
{
P6OUT|=tmp2;
delay(65500);
P6OUT&=0x00;
}
P5OUT&=0x00;
for(tmp2=0x90;tmp2<=0xc0;tmp2+=0x10) // 检测LED
{
P6OUT|=tmp2;
delay(65500);
P6OUT&=0x00;
}
P5OUT=0xc0;
for(tmp1=0x10;tmp1<=0x80;tmp1+=0x10) // 检测数码管
{
P6OUT|=tmp1;
delay(65500);
P6OUT&=0x00;
}
_EINT();
}
/*****************************************************************************************
* SpiTask( )
*task to initiate spi and tlv5626
*
******************************************************************************************
*/
void SpiInitTask(void)
{ unsigned char i=0;
UCTL0&=~(SWRST+MM); // D TO A AND SPI
UCTL0|=SYNC+CHAR;
UTCTL0&=~(CKPH+SSEL0+SSEL1+CKPL);
P3OUT&=~BIT4;
P3OUT|=BIT1;
ME1|=USPIE0;
TXBUF0=0xD0;
P3OUT^=BIT4;
P3OUT&=~BIT1;
for(i=0;i<15;i++)
P3OUT^=BIT4;
UCTL0&=~(SWRST+MM);
TXBUF0=0x02;
ME1|=USPIE0;
for(i=0;i<16;i++)
P3OUT^=BIT4;
P3OUT|=BIT1;
//suspend this task and resume it after arcstop?
}
/*********************************************
* main()函数
*********************************************/
void main(void)
{
WDTCTL = WDTHOLD + WDTPW ; // 停止看门狗
init_sys();
SpiInitTask();
init_Keyboard(); // 初始化键盘
while(1){
if(key_Flag==1){Key_Process();}
CoderRead();
TBCCR4=speed;
}
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1()
{
if((P1IFG&(BIT0+BIT1+BIT2+BIT3))!=0) //判断是否是按键触发的中断
{
key_Event();
}
P1IFG&=0; //清除中断标志
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2()
{
if((P2IFG&(BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7))!=0) //判断是否是按键触发的中断
{
P5OUT|=BIT1;
P6OUT|=0XC0;
delay(65500);
P6OUT&=0x00;
}
P2IFG&=0; //清除中断标志
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -