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

📄 digitalcoder.c

📁 这是uc/osii在msp430上移植的详细代码
💻 C
字号:
#ifndef MSP430F449_H
#include <msp430x44x.h>
#endif

#define LEDLen 12

void LedDisply(void);
//void Channel_Number(void);

unsigned char CURT_SELT,VOLE_SELT,CHAN_SELT;
unsigned char Right_Rotate,Left_Rotate;

unsigned char Hundred,Ten,Digital;
unsigned char pre_vlaue;		//used to svae the last value of the coder

extern unsigned char LEDBuf[LEDLen];		// 显示缓冲
extern unsigned char current[6];	//useed to read and write between the 24c16
extern unsigned char voltage[9];
unsigned char channel[2];
extern const unsigned char NUM_LED[10];
extern unsigned int speed;

void Channel_Display(void)
{
	
	if(CURT_SELT==1)
	{
		switch(LEDBuf[8]&0x30)
		{	
			case 0x20:		//current
				current[0]	= Hundred;
				current[1]	= Ten;
				current[2]	= Digital;
				LEDBuf[0]	= NUM_LED[current[0]];
				LEDBuf[1]	= NUM_LED[current[1]];
				LEDBuf[2]	= NUM_LED[current[2]];
				LedDisply();
				break;
			case 0x10:		//thick
				current[3]	= Hundred;
				current[4]	= Ten;
				current[5]	= Digital;
				LEDBuf[0]	= NUM_LED[current[3]];
				LEDBuf[1]	= NUM_LED[current[4]];
				LEDBuf[2]	= NUM_LED[current[5]];
				LedDisply();
				break;
			
			default:
				break;
		}
	}
	else if(VOLE_SELT==1)
	{	
		switch(LEDBuf[8]&0x0e)
		{	
			case 0x08:		//voltage
				voltage[0]	= Hundred;
				voltage[1]	= Ten;
				voltage[2]	= Digital;
				LEDBuf[3]	= NUM_LED[voltage[0]];
				LEDBuf[4]	= NUM_LED[voltage[1]]&0x7F;
				LEDBuf[5]	= NUM_LED[voltage[2]];
				LedDisply();
				break;
			case 0x04:		//length
				voltage[3]	= Hundred;
				voltage[4]	= Ten;
				voltage[5]	= Digital;
				LEDBuf[3]	= NUM_LED[voltage[3]];
				LEDBuf[4]	= NUM_LED[voltage[4]]&0x7F;
				LEDBuf[5]	= NUM_LED[voltage[5]];
				LedDisply();
				break;
			case 0x02:	       //arc_force
				voltage[6]	= Hundred;
				voltage[7]	= Ten;
				voltage[8]	= Digital;
				LEDBuf[3]	= NUM_LED[voltage[6]];
				LEDBuf[4]	= NUM_LED[voltage[7]]&0x7F;
				LEDBuf[5]	= NUM_LED[voltage[8]];
				LedDisply();
				speed=100*Hundred+10*Ten+Digital;
				break;
			default:
				break;
		}
	}
	else if(CHAN_SELT==1)
	{	
		//switch(LEDBuf[8])
		//{	
			//case 0x01:		//channel
				channel[0]	= Ten;
				channel[1]	= Digital;
				LEDBuf[6]	= NUM_LED[channel[0]];
				LEDBuf[7]	= NUM_LED[channel[1]];
				LedDisply();
				
	}
}

void Add_Number(void)
{
	
	if(CURT_SELT==1 || VOLE_SELT==1)
	{
		if(Digital>=0 && Digital<9)
			Digital++;
		else if(Digital==9)
		{
			if(Ten>=0 && Ten<9)
			{
				Ten++;
				Digital = 0;
			}
			else if(Ten==9)
			{
				if(Hundred>=0 && Hundred<9)
				{	
					Hundred++;
					Ten	= 0;
					Digital = 0;
				}
				else if(Hundred==9)
				{	
					Digital = 0;
					Ten	= 0;
					Hundred = 0;
				}
			}
		}
	}
	else if(CHAN_SELT==1)
	{
		if(Digital>=0 && Digital<9)
			Digital++;
		else if(Digital==9)
		{
			if(Ten>=0 && Ten<9)
			{
				Ten++;
				Digital = 0;
			}
			else if(Ten==9)
			{
				Ten	= 0;
				Digital = 0;
			}
		}
	}
	Channel_Display();
}

void Dec_Number(void)
{
	
	if(CURT_SELT==1 || VOLE_SELT==1)
	{
		if(Digital>0 && Digital<=9)
			Digital--;
		else if(Digital==0)
		{
			if(Ten>0 && Ten<=9)
			{
				Ten--;
				Digital = 9;
			}
			else if(Ten==0)
			{
				if(Hundred>0 && Hundred<=9)
				{	
					Hundred--;
					Ten	= 9;
					Digital = 9;
				}
				else if(Hundred==0)
				{	
					Digital = 9;
					Ten	= 9;
					Hundred = 9;
				}
			}
		}
	}
	else if(CHAN_SELT==1)
	{
	if(Digital>0 && Digital<=9)
		Digital--;
	else if(Digital==0)
	{
		if(Ten>0 && Ten<=9)
		{
			Ten--;
			Digital = 9;
		}
		else if(Ten==0)
		{
			Ten	= 9;
			Digital = 9;
		}
	}
	}
	Channel_Display();
}



void Left_Or_Right(void)
{
	if(Right_Rotate==1)
		Add_Number();
	else if(Left_Rotate==1)
		Dec_Number();
}

void Num_Rotate(void)
{
	if(CURT_SELT==1)
	{
		switch(LEDBuf[8]&0x30)
		{	
			case 0x20:		//current
				Hundred	= current[0];
				Ten	= current[1];
				Digital	= current[2];
				Left_Or_Right();
				break;
			case 0x10:		//thick
				Hundred	= current[3];
				Ten	= current[4];
				Digital	= current[5];
				Left_Or_Right();
				break;
			
			default:
				break;
		}
	}
	else if(VOLE_SELT==1)
	{	
		switch(LEDBuf[8]&0x0e)
		{	
			case 0x08:		//voltage
				Hundred	= voltage[0];
				Ten	= voltage[1];
				Digital	= voltage[2];
				Left_Or_Right();
				break;
			case 0x04:		//length
				Hundred	= voltage[3];
				Ten	= voltage[4];
				Digital	= voltage[5];
				Left_Or_Right();
				break;
			case 0x02:	//arc_force
				Hundred	= voltage[6];
				Ten	= voltage[7];
				Digital	= voltage[8];
				Left_Or_Right();
				break;
			default:
				break;
		}
	}
	else if(CHAN_SELT==1)
	{	
		//switch(LEDBuf[10])
		//{	
			//case 0xc0:		//frequent
				Ten	= channel[0];
				Digital	= channel[1];
				Left_Or_Right();
				
	}
}
	



void CoderRead(void)
{
   	unsigned char value_in,value_temp;
	
//process the coder's data
	value_in	= P4IN;
	pre_vlaue	= pre_vlaue << 2;
	value_in	= value_in >> 6;
	value_temp	= value_in | pre_vlaue;
	pre_vlaue	= value_in;
//judge the state: 11 01 00 10 11 is left-truning and 11 10 00 01 11 is right-turning
//there are several case that we can judge whether is it left or right turning
//left-turning: 1011 1101 0100 0010 and right-truning: 0111 1110 1000 0001
	
//Note:There are several conditions to judge turn left or right, We need judge only one of them,
//then it must trun out
	if(value_temp==0x0e)		//0x0E:right-truning
	{
		Right_Rotate = 1;
		Left_Rotate  = 0;
		Num_Rotate();
		return;
	}
	else
	{
		if(value_temp==0x0b)	//0x0B:left-turning
		{
			Right_Rotate = 0;
			Left_Rotate  = 1;
			Num_Rotate();
			return;
		}
		else
	   		
       	        if(value_temp==0x07)	//0x07:right-truning
		{
			Right_Rotate = 1;
			Left_Rotate  = 0;
			Num_Rotate();
			return;			
		}
		else
		{
			if(value_temp==0x0d)	//0x0D:left-turning
			{
				Right_Rotate = 0;
				Left_Rotate  = 1;
				Num_Rotate();
				return;				
			}
			else
				return;
		}

	}
	
}


⌨️ 快捷键说明

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