📄 counter.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 + -