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

📄 jyzno1.c

📁 一个使用MSP430的项目例子
💻 C
📖 第 1 页 / 共 3 页
字号:
					}
					//LCDMEM[pianh_cnt+6]=LCD_TAB1[pianh[pianh_cnt]];
					LCDMEM[6]=LCD_TAB1[pianh[0]];
					LCDMEM[7]=LCD_TAB1[pianh[1]];
					blink_dat=pianh[pianh_cnt];
                    break;
           	case 7:	//可在01 - 30 内进行设置
 					if(--fc_pianh==0)fc_pianh=30;
					LCDMEM[6]=LCD_TAB1[fc_pianh/10];
					LCDMEM[7]=LCD_TAB1[fc_pianh%10];
					blink_dat=fc_pianh%10;
                    break;
			case 8:	break;//通讯模式                    
		}
	}
}
//************************************************
void	key_mainloop(void)
{
	if(!f_20ms) return;
	f_20ms=0;
	switch(keyfuntask)//功能键
	{
		case 0:/*有键按下*/
			if((P4IN&BIT3)==0)	keyfuntask=1;
			break;
		case 1://延时去抖
			keyfuntask=2;break;	
		case 2://确认有键
			if((P4IN&BIT3)==0)	{keyfuntask=3;}
			else keyfuntask=0;
			break;
		case 3://等待释放
			if((P4IN&BIT3)!=0) {keyfuntask=0;fkeyfun=1;	lxf_mea=0;fcf_mea=0;}//按下功能键复测和连续测都停止
			break;
	}
	if(lxf_mea==1||fcf_mea==1)return;//连续测量状态,其它键不考虑!
	switch(keyoktask)//确认键
	{
		case 0:/*有键按下*/
			if((P4IN&BIT4)==0)	keyoktask=1;
			break;
		case 1://延时去抖
			keyoktask=2;break;	
		case 2://确认有键
			if((P4IN&BIT4)==0)	{keyoktask=3;}
			else keyoktask=0;
			break;
		case 3://等待释放
			if((P4IN&BIT4)!=0) {keyoktask=0;fkeyok=1;}
			break;
	}
	switch(keylefttask)//左移键
	{
		case 0:/*有键按下*/
			if((P4IN&BIT5)==0)	keylefttask=1;
			break;
		case 1://延时去抖
			keylefttask=2;break;	
		case 2://确认有键
			if((P4IN&BIT5)==0)	{keylefttask=3;}
			else keylefttask=0;
			break;
		case 3://等待释放
			if((P4IN&BIT5)!=0) {keylefttask=0;fkeyleft=1;}
			break;
	}
	switch(keydowntask)//减少键
	{
		case 0:/*有键按下*/
			if((P4IN&BIT6)==0)	keydowntask=1;
			break;
		case 1://延时去抖
			keydowntask=2;break;	
		case 2://确认有键
			if((P4IN&BIT6)==0)	
			{
				if(mode==7){fkeydown=1;keydowncount=1;}
				keydowntask=3;
			}
			else 
			{keydowntask=0;}
				break;
		case 3://等待释放			
			if((P4IN&BIT6)!=0) //释放
			{
				if(mode!=7){fkeydown=1;}
				keydowntask=0;
			}
			else if(mode==7)//连击
			{
				if(++keydowncount==QDSJ)
				{
					keydowncount-=LJSJ;
					fkeydown=1;
				} 					
			}
			break;
	}	
 	switch(keyuptask)//增加键
	{
		case 0:/*有键按下*/
			if((P4IN&BIT7)==0)	keyuptask=1;
			break;
		case 1://延时去抖
			keyuptask=2;break;	
		case 2://确认有键
			if((P4IN&BIT7)==0)	
			{
				if(mode==7){fkeyup=1;keyupcount=1;}
				keyuptask=3;
			}
			else 
			{keyuptask=0;}
			break;
		case 3://等待释放
			if((P4IN&BIT7)!=0) 
			{
				if(mode!=7){fkeyup=1;}
				keyuptask=0;
			}
			else if(mode==7)//连击
			{
				if(++keyupcount==QDSJ)
				{
					keyupcount-=LJSJ;
					fkeyup=1;
				} 					
			}			
			break;
	}
}
//************************************************
void	lcd_disinit(void)
{
	uchar	i;
	for (i=0;i<16;i++)
    {
    	LCDMEM[i]=0x0;
    }
	for(i=1;i<8;i++)
	{
		LCDMEM[i]=LCD_TAB1[8];		
	}
	for(i=9;i<16;i++)
	{
		LCDMEM[i]=LCD_TAB2[8];		
	}
}
//****************************
void	lcd_off(void)
{
	uchar	i;
	for (i=0;i<16;i++)
    {
    	LCDMEM[i]=0x0;
    }	
}

//****************************
/*产生各种时间控制*/
void	tim0_mainloop()
{	if(!f_10ms) return;
	f_10ms=0;
	if(--cnt_20ms==0)
	{
		cnt_20ms=INT20MSCOUNT;
		f_20ms=1;	/*20ms*/
		if(--cnt_250ms==0)
		{
			cnt_250ms=INT250MSCOUNT;
			f_250ms=1;	/*250ms*/			
			if(--cnt_500ms==0)
			{
				cnt_500ms=INT500MSCOUNT;
				f_500ms=1;	/*500ms*/			
				if(--cnt_5s==0)
				{
					cnt_5s=INT5SCOUNT;
					f_5s=1;	/*1s*/
					if(--cnt_20s==0)
					{
						cnt_20s=INT20SCOUNT;
						f_20s=1;	/*20秒*/
					}
				}
			}
		}	
	}
}

//****************************
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0(void)
{
	uint	temp;
	temp=CCR0;
	if(cp_no1==1)
	{
		cp_no1=0;
		
	}
	else
	{
		f_cap=1;		
		if(temp>ccr0_old)
		{
			timnew_dat= temp-ccr0_old;
		}	
		else
		{
			timnew_dat=65536-ccr0_old+temp;
		}
	}
	ccr0_old=temp;
	cnt_70ms=0;
}


// Timer B0 interrupt service routine
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B0 (void)
{
	f_10ms=1;
	if(lxf_mea==1||fcf_mea==1)
	{
		if(++cnt_70ms>7){cnt_70ms=0;timnew_dat=65535;f_cap=1;}
	}	
}
//****************************
void	lcd_blink(void)
{
	if(f_500ms&&f_blink)
    {
		f_500ms=0;
		switch(f_blink)
		{
			case 1:	LCDMEM[blink_address] =LCD_TAB1[blink_dat];f_blink=2;break;
			case 2:	LCDMEM[blink_address] =0x0;f_blink=1;break;
			case 3:	LCDMEM[blink_address] =LCD_TAB2[blink_dat];f_blink=4;break;
			case 4:	LCDMEM[blink_address] =0x0;f_blink=3;break;

		}
    }
}
//****************************
void delay(uint m)
{
	uint i,j;
	for(j=m;j>0;j--)
	{
		for (i=10;i>0;i--);
	}
}

//****************************
void 	main_init(void)
{
	//PORT_INIT--BUZ
	P4SEL &=~BIT2;//P4.2端口
	P4DIR |=BIT2;//P4.2输出
	//PORT_INIT--LED
	P3SEL &=~BIT0;//P3.0端口
	P3DIR |=BIT0;//P3.0输出
	//PORT_INIT--KEY
	P4SEL &=~(BIT3+BIT4+BIT5+BIT6+BIT7);
	P4DIR &=~(BIT3+BIT4+BIT5+BIT6+BIT7); //K1,K2,K3,K4,K5 输入
	//PORT_INIT--CAPTURE
	P1SEL |=BIT0;//P1.0捕获
	P1DIR &=~BIT0;//P1.0输入

	//CLK_INIT MCLK(4M) ACLK(32768) SMCLK(1M)
	SCFI0 |= FN_2;                  // x2 DCO frequency, 8MHz nominal DCO
	SCFQCTL = 121;                  // (121+1) x 32768 x 2 = 7.99 Mhz
	FLL_CTL0 |= DCOPLUS + XCAP18PF; // DCO+ set so freq = xtal x D x N+1	
	FLL_CTL1 |=XT2OFF;

	//TIMA_INIT--测频率--捕获模式,连续计数,溢出不中断,捕获中断--计数值存储在CCR0
	//停止--先停捕获,再停计数
		//TACCTL0 &= ~CM_3; // 禁止捕获
		//TACTL &= ~MC_3; // 停止定时器---将MC0,MC1置成0
	//重启--先开捕获,再开计数
		//TACCTL0 |= CM_1; // 启动俘获--上升沿
		//TACTL |= MC_2; // 选择连续增计数--启动定时器
	TACTL = TACLR; // clear TAR
	TACTL |= TASSEL_2; // 选择SMCLK做输入源--8M
	TACTL |= ID_3; // 选择8分频--8M-->1M
	TACTL &= ~MC_3; // 停止定时器---将MC0,MC1置成0
//	TACTL |= MC_2; // 选择连续增计数--启动定时器	
	TACCTL0 &= ~CM_3; // 禁止捕获
//	TACCTL0 |= CM_1; // 启动俘获--上升沿
	TACCTL0 |= SCS; // 选择同步模式
	TACCTL0 |= CAP; // 选择俘获模式
	TACCTL0 |= CCIS_0;//CCI0A
	TACCTL0 |= CCIE; // 中断允许  	
	


    //TIMB_INIT--时钟
	TBCTL = TBCLR; // clear TAR
	TBCTL |= TBSSEL_1; // 选择ACLK做输入源--32768
	TBCTL |= ID_3; // 选择8分频--32.768K-->4096
	TBCTL |= MC_1; // 选择增计数至CCR0模式
  	TBCCTL0 = CCIE; // TBCCR0 interrupt enabled	
//	TBCTL |= TBIE; // 计时器溢出允许
	TBCCR0 = 41;//约10ms中断
	
	//LCD_INIT
	BTCTL = BTFRFQ1; // STK LCD freq =32768/64分频
	LCDCTL = LCDON + LCD4MUX + LCDP0+LCDP2; // STK LCD 4Mux, S0-S31
	P5SEL = 0xfc;     // Common and Rxx all selected

	//FLASH_INIT
	FCTL2 = FWKEY + FSSEL0 + FN0;               // 设置时钟频率为ACLK	
	
	//UART_INIT
	//EN_3221	P2.7
	//OFF_3221	P2.6
	P2SEL |= 0x30;                        // P2.4,5 = USART0 TXD/RXD
	ME1 |= UTXE0 + URXE0;                 // Enable USART0 TXD/RXD
	UCTL0 |= CHAR;                        // 8-bit character
//	UTCTL0 |= SSEL1;                      // UCLK = SMCLK
//	UBR00 = 0x41;                         // 7.99MHz 9600 
//	UBR10 = 0x03;                         // 7.99MHz 9600
//	UMCTL0 = 0x00;                        // no modulation
	UTCTL0 |= SSEL0;                      // UCLK = ACLK
	UBR00 = 0x03;                         // 32k/9600 - 3.41
	UBR10 = 0x00;                         //
	UMCTL0 = 0x4A;                        // Modulation
	UCTL0 &= ~SWRST;                      // Initalize USART state machine
	IE1 |= URXIE0;                        // Enable USART0 RX interrupt
	P2DIR |= BIT4;                        // P2.4 output direction
	P2SEL &=~BIT7;//P2.7端口
	P2DIR |=BIT7;//P2.7输出
	P2SEL &=~BIT6;//P2.6端口
	P2DIR |=BIT6;//P2.6输出	
    P2OUT |=BIT7;//  /EN=0;片选无效
    P2OUT &= ~BIT6;	// /OFF=0;关闭有效
//    P2OUT |= BIT6;	// /OFF=1;关闭无效
//    P2OUT &= ~BIT7;//  /EN=0;片选有效
	/*串行口初始化完成,p2口定义完成*/		
	
	//VAR_INIT	
	fun_dat=1;
	f_10ms=0;
	lxf_mea=0;
	rxddat_p=rxddat;//指向接收组和缓存组的指针
	rxdbuf_p=rxdbuf;
	rxddat_cnt=0;
	rxdbuf_cnt=0;
}


//****************************************************
//****flash子程序*************
//擦除一段flash
void FlashErase(uint *addr)
{
	_DINT();
	FCTL3 = FWKEY;
	FCTL1 = FWKEY+ERASE;                //Erase
	*addr = 10;
	FCTL3  = FWKEY + LOCK;// Lock
	_EINT();
}

//向flash写一个uint
void FlashWriteInt(uint *addr, uint data)
{
	_DINT();
	FCTL3  = FWKEY;
	FCTL1 = FWKEY+WRT;
	*addr = data;
	FCTL3  = FWKEY + LOCK;// Lock
	_EINT();
}


//向flash写一个uchar
void FlashWriteUchar(uchar *addr, uchar data)
{
	_DINT();
	FCTL3  = FWKEY;
	FCTL1 = FWKEY+WRT;
	*addr = data;
	FCTL3  = FWKEY + LOCK;// Lock
	_EINT();
}

//向flash写一个float
void FlashWriteFloat(uint *addr,float data)
{
	uint *pdata;
	pdata = (uint*)&data;
	FlashWriteInt(addr,*pdata);
	pdata++;
	addr++;
	FlashWriteInt(addr,*pdata);
}
/**************************************************************
*读Flash中多个字节	addr:读地址	length:要读取的字节数	readBuf:用以存储读取内容的缓存区地址
***************************************************************/
void read_Flash(uchar * addr,uchar * rbuf,uchar len)
{
    uint cnt;
    _DINT();
    for(cnt=0;cnt<len;cnt++)
    {
        *(rbuf+ cnt) = *(addr + cnt);           // 读数据
    }
    _EINT();
}

/**************************************************************
*写多个字节到Flash	addr:地址	buf:要写数据的首地址	len:写入的字节数
***************************************************************/
void write_Flash(char*addr,char*buf,int len)
{
    uint cnt;
    _DINT();
    FCTL1  = FWKEY + WRT;                       // 准备写
	FCTL3  = FWKEY;
    for(cnt=0;cnt<len;cnt++)
    {
        *(addr+cnt) = *(buf + cnt);             // 写数据
    }
    FCTL3  = FWKEY + LOCK;                      // Lock
    _EINT();
}
/**************************************************************
*擦Flash	addr:512字节擦除区内任一地址
**************************************************************/
void erase_Flash(char* addr)
{
	_DINT();
    FCTL3  = FWKEY; // 清除 "Lock"
    FCTL1  = FWKEY + ERASE;// 准备擦除
    *addr   = 2;// 擦除,写任意数均可
    FCTL3  = FWKEY + LOCK;// 置“LOCK”
	_EINT();
}

//***************************
void	send16(uint txdat)
{
	while (!(IFG1 & UTXIFG0));            // USART0 TX buffer ready?
	TXBUF0 = txdat>>8;
	while (!(IFG1 & UTXIFG0));            // USART0 TX buffer ready?
	TXBUF0 = (uchar)(txdat);	
}
//***************************
void	send8(uchar txdat)
{
	while (!(IFG1 & UTXIFG0));            // USART0 TX buffer ready?
	TXBUF0 = txdat;	
}

//63 5b 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 DC 0d 0a
//220 30

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -