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

📄 counter.c

📁 用ARM philips2124
💻 C
字号:
#include <lpc21xx.h>

const unsigned char LEDSEGCODE[]=
{
  0x3F,0x06,0x5B,0x4F,0x66,
  0x6D,0x7D,0x07,0x7E,0x6F,
  0x77,0x7C,0x39,0x5e,0x79,0x71,
  0x00,0x40,
};
const unsigned char LEDBITCODE[]=
{
  0xFE,0xFD,0xFB, 0xF7,
  0xEF,0xDF,0xBF,0x7E
};

//延时250us
void Delay_250uS (void)
{
  unsigned int i;
  i=2500;
  while (i--);
}
#define KEY_ROW (0xF0<<16)
#define KEY_COL (0x0F<<16)	 
unsigned char LEDBuffer[8]={0,16,16,16,16,16,16,16};
unsigned char LEDScanPointer;
unsigned char Key;
unsigned char KeyTemp1;
unsigned char KeyTemp2;
unsigned char NoFlashFlag;
unsigned char GetKeyCount=0;
unsigned char GetKeyMaxFlag=0;
unsigned long NumberA;
unsigned long NumberB;
long Result;
unsigned char NagFlag=0;
unsigned char DotPosition=0;
unsigned char CurrentFunction=0;
unsigned char Signal;

int main (void)
{
	unsigned char i;
	unsigned char Temp;
	PINSEL0=0x00000000;
	PINSEL1=0x00000000;
	PINSEL2=0x00000000;
	IO0DIR|=(0xFFFF<<0);
	while (1)
		{
		 //数码管动态扫描
		IO0CLR|=0xFF;
		if(DotPosition!=0)
			{
				if (DotPosition==LEDScanPointer)
					{
						IO0SET|=(LEDSEGCODE[LEDBuffer[LEDScanPointer]]<<0);
						IO0SET=(1<<7);
					}
					else IO0SET=(LEDSEGCODE[LEDBuffer[LEDScanPointer]]<<0);
				}
			else IO0SET=(LEDSEGCODE[LEDBuffer[LEDScanPointer]]<<0);
		IO0CLR|=0xFF00;
		IO0SET|=(LEDBITCODE[LEDScanPointer]<<8);
		LEDScanPointer++;
		if (LEDScanPointer==sizeof(LEDBuffer))LEDScanPointer=0;
			Delay_250uS();
			IO1SET = KEY_COL;	//	配置列为高电平
			IO1DIR &=~KEY_COL;	//	  输入引脚
			IO1DIR |= KEY_ROW;	//	  输出引脚
			IO1CLR = KEY_ROW;	//	   输出全为低电平
			KeyTemp1=(IO1PIN>>16) & 0x0F;//	 读取列电平状态
			if (0x0F!=KeyTemp1)	  //
				{	

					if(NoFlashFlag==0)
						{
							Delay_250uS();	   // 消抖
							KeyTemp1= (IO1PIN>>16) & 0x0F;	//读列电平
							if (0x0F !=KeyTemp1)
							{
								 NoFlashFlag=1;
								IO1SET = KEY_ROW; 	   // 高电平	
								IO1DIR &=~KEY_ROW;		//	输入引脚
								IO1DIR |=KEY_COL;	   //	输出引脚
								IO1CLR = KEY_COL;		//	输出列全为低电平
								KeyTemp2=(IO1PIN>>20) & 0x0F; //  读行电平状态
								KeyTemp2<<=4;		   //		左移4位
								KeyTemp2|=KeyTemp1;	  //	   或操作
								switch (KeyTemp2)	   //	  键码散转
									{
										case 0xEE:	  //
										Key=0;
										break;					   //定义键值0
										case 0xED:
											Key=1;
											break;
										case 0xEB:
											Key=2;
											break;
										case 0xE7:
											Key=3;
											break;
										case 0xDE:
											Key=4;
											break;
										case 0xDD:
											Key=5;
											break;
										case 0xDB:
											Key=6;
											break;
										case 0xD7:
											Key=7;
											break;
										case 0xBE:
											Key=8;
											break;
										case 0xBD:
											Key=9;
											break;
										case 0xBB:
											Key=10;
											break;
										case 0xB7:
											Key=11;
											break;
										case 0x7E:
											Key=12;
											break;
										case 0x7D:
											Key=13;
											break;
										case 0x7B:
											Key=14;
											break;
										case 0x77:
											Key=15;
                                            break;
										default:	
											Key=16;					//定义无效键值
											break;	
											}
//加减乘除运算
	
switch(CurrentFunction)
{
	case 0:					//从键盘输入数据1
	  if (Key<10)				//输入0-9的数字
	{
		 if(GetKeyMaxFlag==0)
		{
		  for (Temp=GetKeyCount;Temp>0;Temp--)
			LEDBuffer[Temp]=LEDBuffer[Temp-1];
			LEDBuffer[0]=Key;
			GetKeyCount++;
			if (GetKeyCount==5)GetKeyMaxFlag=1;
		}
	}
else if (Key<14)
{
NumberA=0;
Temp=0;
while (LEDBuffer[Temp]!=16)
	{
		switch (Temp)
		{
		 case 0:
			NumberA+=LEDBuffer[Temp];
			break;
		 case 1:
			NumberA+=(LEDBuffer[Temp])*10;
			break;
		 case 2:
			NumberA+=(LEDBuffer[Temp])*100;
			break;
		  case 3:
			NumberA+=(LEDBuffer[Temp])*1000;
			break;
		  case 4:
			NumberA+=(LEDBuffer[Temp])*10000;
		}
		Temp++;
		}
	CurrentFunction=1;
	Signal =Key;
	GetKeyMaxFlag =0;
	GetKeyCount=0;
	for (Temp=0;Temp<sizeof(LEDBuffer);Temp++)
    	LEDBuffer[Temp]=16;
    	LEDBuffer[0]=0;
	}
	else if (Key==14)		//数字输入清除键
		{
			CurrentFunction=0;
			GetKeyMaxFlag=0;
			GetKeyCount=0;
			NagFlag=0;
			DotPosition=0;
			for (Temp=0;Temp<sizeof(LEDBuffer);Temp++)
			LEDBuffer[Temp]=16;
			LEDBuffer[0]=0;
		}
	break;
	case 1:			//从键盘输入数据2
if (Key<10)			//输入0-9数据						
	{
		if(GetKeyMaxFlag==0)
			{
				for (Temp=GetKeyCount;Temp>0;Temp--)
					LEDBuffer[Temp]=LEDBuffer[Temp-1];
					LEDBuffer[0]=Key;
				 GetKeyCount++;
					if(GetKeyCount==5)GetKeyMaxFlag=1;
			}
	}
	else if (Key==15)		//输入等号,并运算结果
		{
			NumberB=0;
			Temp=0;
			while (LEDBuffer[Temp]!=16)
			{
				switch( Temp)
				{
					case 0:
						NumberB+=LEDBuffer[Temp]; 
						 break;
					case 1:
						NumberB+=(LEDBuffer[Temp])*10;
						break; 
					case 2:
						NumberB+=(LEDBuffer[Temp])*100;
						break;
					case 3 :
						NumberB+=(LEDBuffer[Temp])*1000;
						break;
					case 4:
						NumberB+=(LEDBuffer[Temp])*10000;
						break;
				}
			Temp++;
			}
	Result=0;
	switch (Signal)
	{
		case 10:				//加法
			Result=NumberA;
			Result+=NumberB;
			DotPosition=0;
			break;
		case 11:				//减法
			Result=NumberA;
			Result-=NumberB;
			DotPosition=0;
			break;
		case 12:				//乘法
			Result=NumberA;
			Result*=NumberB;
			DotPosition=0;
			break;
		case 13:				//除法
			Result=NumberA;
			Result*=10000;
			Result/=NumberB;
			DotPosition=0;
			break;
		}
		for (Temp=0;Temp<sizeof(LEDBuffer);Temp++)
		LEDBuffer[Temp]=16;
		LEDBuffer[0]=0;

		NagFlag=0;
		if(Result<0)
			{
			Result=~Result;
			Result++;
			NagFlag=1;
			}
			if (Signal==13)				//除法运算结果小于0 
				{

				if(Result>=1000) DotPosition=4;
				else if (Result>=100) DotPosition=3;
				else if (Result>=10) DotPosition=2;	
				else if (Result>=1) DotPosition=1;
					for(Temp=DotPosition;Temp<5;Temp++)
					LEDBuffer[Temp]=0;
					DotPosition=4;
				}
			else DotPosition=0;
			Temp=0;				//将运算结果送出输出缓冲区
			while (Result)
				{
				LEDBuffer[Temp]=Result%10;
				Result/=10;
				Temp++;
				}
					if(NagFlag==1) LEDBuffer[Temp]=17;	//结果为负的处理
					if(Signal==13)				//除法运算中最后位为0的处理
					{
					Temp=0;
					while (LEDBuffer [Temp]==0)
						{
							for(i=0;i<sizeof (LEDBuffer);i++)
							LEDBuffer[i]=LEDBuffer[i+1];
							LEDBuffer[sizeof (LEDBuffer)-1]=16;
							DotPosition--;
						}
					}
					CurrentFunction=2;
				}
					break;
					case 2:
					if(Key==14)		//清除键
						{
							CurrentFunction=0;
							GetKeyMaxFlag=0;
							GetKeyCount=0;
							NagFlag=0;
							DotPosition=0;
							for (Temp=0;Temp<sizeof(LEDBuffer);Temp++)
								LEDBuffer[Temp]=16;
								LEDBuffer[0]=0;
								}
									break;
								}
							
							}
						}
					}
              else NoFlashFlag	=0;
			}
		}		   

⌨️ 快捷键说明

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