本作品是在b站博主“江协科技”视频下学习完51单片机后的成果,帮助一些刚学完后的人做一个简单的成品,如有侵权,请联系删除,未经允许,不得转载。
模块代码是在b站博主江协科技那边学的(学单片机的应该会了解的到),旨在帮助一些学了江协的但在制作过程中有疑点上网查资料后因为命名习惯的不同而导致看不懂别人的代码的人,本来应该是封装好的函数,因为我暂时不太会用这个发布的功能所以整合到一起了,应该是没有太大问题。如果有问题或者对代码部分有疑问可以询问,本人也是在校学生,有课程任务不能及时回复,看到就回,该代码可以实现的功能包括加减乘除、清零、错误警告(被除数为0时)以及错误时的蜂鸣器响应
#include <REGX52.H>
#include <INTRINS.H>
//蜂鸣器端口
sbit Buzzer=P2^5;
/**
*@brief 蜂鸣器私有延时函数,延时500us
*@param 无
*@retval 无
*/
void Buzzer_Delay500us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 247;
while (--i);
}
/**
*@brief 蜂鸣器发声
*@param ms发声时长
*@retval 无
*/
void Buzzer_Time(unsigned int ms)
{
unsigned int i;
for(i=0;i<ms*2;i++)
{
Buzzer=!Buzzer;
Buzzer_Delay500us();
}
}
/**
*@brief 延时函数
*@param x毫秒
*@retval 无
*/
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{ i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
/**
*@brief 按键扫描
*@param 无
*@retval 键码
*/
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;
P1_3=0;// 按列扫描
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}//Delay(20)消抖
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
return KeyNumber;//返回键码
}
unsigned char x[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};//储存0~9数字
/**
*@brief 数码管
*@param location 位置,number 数字
*@retval 无
*/
void Nixie(unsigned char location,number)
{
switch(location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=x[number];
Delay(1);//消隐
P0=0x00;
}
typedef unsigned char u8;
typedef unsigned int u16;
u16 KeyNum;
u16 KeySwitch;
u16 box[8]={0};//储存数字,数码管00000000初始化
void display()// 数码管显示储存数字
{
int i;
for(i=8;i>0;i--)
{
Nixie(i,box[8-i]);
}
}
void full_box()//填充数组box
{
box[0]=c%10;
box[1]=(c/10)%10;
box[2]=(c/100)%10;
box[3]=(c/1000)%10;
box[4]=(c/10000)%10;
box[5]=(c/100000)%10;
box[6]=(c/1000000)%10;
box[7]=(c/10000000)%10;
}
void main()
{
long int a=0,b=0,c=0,i;
while(1)
{
display();
KeyNum=MatrixKey();//获取键码
if(KeyNum)
{
if(KeyNum==10)
{
KeyNum%=10;
}
if(KeyNum==0||KeyNum==1||KeyNum==2||KeyNum==3||KeyNum==4||KeyNum==5||KeyNum==6||KeyNum==7||KeyNum==8||KeyNum==9)
{
KeySwitch=1; //区分运算符和数字
}
}
if(KeySwitch==1)
{
for(i=7;i>0;i--)
{
box[i]=box[i-1];//向左移位
}
box[0]=KeyNum;
KeySwitch=0;
}
else if(KeyNum==11) //清零
{
for(i=0;i<8;i++)
{
box[i]=0;
display();
}
}
else if(KeyNum==13)
{ //第一次数
a=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000+box[5]*100000+box[6]*1000000+box[7]*10000000;
for(i=0;i<8;i++) //清空准备装第二次输入数
{
box[i]=0;
}
while(1)
{
display();
KeyNum=MatrixKey();
if(KeyNum)
{
if(KeyNum==10)
{
KeyNum%=10;
}
if(KeyNum==0||KeyNum==1||KeyNum==2||KeyNum==3||KeyNum==4||KeyNum==5||KeyNum==6||KeyNum==7||KeyNum==8||KeyNum==9)
{
KeySwitch=1;
}
}
if(KeySwitch==1)
{
for(i=7;i>0;i--)
{
box[i]=box[i-1];
}
box[0]=KeyNum;
KeySwitch=0;
}
if(KeyNum==12) break;
}
b=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000+box[5]*100000+box[6]*1000000+box[7]*10000000;
c=a+b; //加的运算
full_box();
display();
}
else if(KeyNum==14)
{
a=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000+box[5]*100000+box[6]*1000000+box[7]*10000000;
for(i=0;i<8;i++) //清空准备装第二次输入数
{
box[i]=0;
}
while(1)
{
display();
KeyNum=MatrixKey();
if(KeyNum)
{
if(KeyNum==10)
{
KeyNum%=10;
}
if(KeyNum==0||KeyNum==1||KeyNum==2||KeyNum==3||KeyNum==4||KeyNum==5||KeyNum==6||KeyNum==7||KeyNum==8||KeyNum==9)
{
KeySwitch=1;
}
}
if(KeySwitch==1)
{
for(i=7;i>0;i--)
{
box[i]=box[i-1];
}
box[0]=KeyNum;
KeySwitch=0;
}
if(KeyNum==12) break;
}
b=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000+box[5]*100000+box[6]*1000000+box[7]*10000000;
c=a-b; //减的运算
full_box();
display();
}
else if(KeyNum==15)
{
a=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000+box[5]*100000+box[6]*1000000+box[7]*10000000;
for(i=0;i<8;i++) //清空准备装第二次输入数
{
box[i]=0;
}
while(1)
{
display();
KeyNum=MatrixKey();
if(KeyNum)
{
if(KeyNum==10)
{
KeyNum%=10;
}
if(KeyNum==0||KeyNum==1||KeyNum==2||KeyNum==3||KeyNum==4||KeyNum==5||KeyNum==6||KeyNum==7||KeyNum==8||KeyNum==9)
{
KeySwitch=1;
}
}
if(KeySwitch==1)
{
for(i=7;i>0;i--)
{
box[i]=box[i-1];
}
box[0]=KeyNum;
KeySwitch=0;
}
if(KeyNum==12) break;
}
b=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000+box[5]*100000+box[6]*1000000+box[7]*10000000;
c=a*b; //乘的运算
full_box();
display();
}
else if(KeyNum==16)
{
a=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000+box[5]*100000+box[6]*1000000+box[7]*10000000;
for(i=0;i<8;i++) //清空准备装第二次输入数
{
box[i]=0;
}
while(1)
{
display();
KeyNum=MatrixKey();
if(KeyNum)
{
if(KeyNum==10)
{
KeyNum%=10;
}
if(KeyNum==0||KeyNum==1||KeyNum==2||KeyNum==3||KeyNum==4||KeyNum==5||KeyNum==6||KeyNum==7||KeyNum==8||KeyNum==9)
{
KeySwitch=1;
}
}
if(KeySwitch==1)
{
for(i=7;i>0;i--)
{
box[i]=box[i-1];
}
box[0]=KeyNum;
KeySwitch=0;
}
if(KeyNum==12) break;
}
b=box[0]+box[1]*10+box[2]*100+box[3]*1000+box[4]*10000+box[5]*100000+box[6]*1000000+box[7]*10000000;
if(b!=0)
{
c=a/b; //除的运算
full_box();
display();
}
else // 被除数为0时蜂鸣器报警,数码管显示error
{
Buzzer_Time(100);
while(1)
{
P2_4=1;P2_3=1;P2_2=1;
P0=0x7B;Delay(1);P0=0x00;
P2_4=1;P2_3=1;P2_2=0;
P0=0x77;Delay(1);P0=0x00;
P2_4=1;P2_3=0;P2_2=1;
P0=0x77;Delay(1);P0=0x00;
P2_4=1;P2_3=0;P2_2=0;
P0=0x3F;Delay(1);P0=0x00;
P2_4=0;P2_3=1;P2_2=1;
P0=0x77;Delay(1);P0=0x00;
}
}
}
}
}