📄 calculator.c
字号:
#include <math.h>
#include <stdio.h>
#include <reg51.h>
#define TRUE 1
#define FALSE 0
#define ENRD 0 //读有效
#define DISRD 1
#define ENWR 0
#define DISWR 1
#define DELAY_VALUE 3
#define PinDrvKey1 P0_0
#define PinDrvKey2 P0_1
#define PinDrvKey3 P0_2
#define PinDrvKey4 P0_3 //键盘扫描的驱动线
#define PinScanKey1 P0_0
#define PinScanKey2 P0_1
#define PinScanKey3 P0_2
#define PinScanKey4 P0_3 //键盘扫描的信号获取线
#define LedSelect0 0x01
#define LedSelect1 0x02
#define LedSelect2 0x04
#define LedSelect3 0x08
#define LedSelect4 0x10
#define LedSelect5 0x20
#define LedSelect6 0x40
#define LedSelect7 0x80 //led选择位
#define num0 0x3f //字符0的编码
#define num1 0x06
#define num2 0x5b
#define num3 0x4f
#define num4 0x66
#define num5 0x6d
#define num6 0x7d
#define num7 0x07
#define num8 0x7f
#define num9 0x67 //字符九的编码
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
char numtochar(char n)
{ switch(n)
{case 0:return num0;
break;
case 1:return num1;
break;
case 2:return num2;
break;
case 3:return num3;
break;
case 4:return num4;
break;
case 5:return num5;
break;
case 6:return num6;
break;
case 7:return num7;
break;
case 8:return num8;
break;
case 9:return num9;
break;
default:break;
}
}
void initial(void); //初始化子程序
void delay(short i);
void display(unsigned char i,unsigned char num);
unsigned char keyscan(void);
void main(void)
{ char Li,Ln; //第Li个le显示数字ln;
long dt1,dt2,temp;
char op,keyword;
dt1=0; //dt1为第一操作数
dt2=0; //dt2为第二操作数
initial();
//键盘驱动信号都设为低
for(Li=7;Li>=0;Li--)
{Ln=keyscan();
display(Li,Ln);
}
keyword=0;
do
{
keyword=keyscan();
if(keyword<=9)
{
dt2=dt2*10+keyword;
temp=dt2;
for(Li=0;Li<=7;Li++)
{
Ln=temp%10;
temp=temp/10;
display(Li,Ln); //显示输入的数字
if(temp==0)break;
}
}
else if(keyword<=13)
{ op=keyword-10;
dt1=dt2;
dt2=0;
switch(op)
{case 0:display(7,0);
break;
case 1:display(7,1);
break;
case 2:display(7,2);
break;
case 3:display(7,3);
break;
default:break;
}
}
}while(keyword!=14);
switch(op)
{case 0:dt1=dt1+dt2;
break;
case 1:dt1=dt1-dt2;
break;
case 2:dt1=dt1*dt2;
break;
case 3:dt1=dt1/dt2;
break;
default:break;
}
for(Li=0;Li<=7;Li++)
{
Ln=dt1%10;
dt1=dt1/10;
display(Li,Ln); //显示结果
if(dt1==0)break;
}
}
void initial(void)
{ WR=ENWR;
P2=0x80;
P0=0xff;
P2=0x90;
P0=0x00; //键盘驱动信号都设为低
WR=DISWR;
}
unsigned char keyscan()
{
char kword=0;
P0=0x00;
P2=0x80;
while(1)
{
RD=DISRD;
WR=ENWR;
PinDrvKey1=TRUE;
WR=DISWR;
RD=ENRD;
if(PinScanKey1==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey1==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey1==TRUE)
kword=1;
break;} //确认确实有按键信号,返回键值
if(PinScanKey2==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey2==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey2==TRUE)
kword=2;break;} //确认确实有按键信号,返回键值
if(PinScanKey3==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey3==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey3==TRUE)
kword=3;break;} //确认确实有按键信号,返回键值
if(PinScanKey4==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey2==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey2==TRUE)
kword=10;break;} //确认确实有按键信号,返回键值
//以上语句扫描第一列
RD=DISRD;
WR=ENWR;
PinDrvKey1=FALSE;
PinDrvKey2=TRUE;
WR=DISWR;
RD=ENRD;
if(PinScanKey1==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey1==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey1==TRUE)
kword=4;break;} //确认确实有按键信号,返回键值
if(PinScanKey2==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey2==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey2==TRUE)
kword=5;break;} //确认确实有按键信号,返回键值
if(PinScanKey3==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey3==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey3==TRUE)
kword=6;break;} //确认确实有按键信号,返回键值
if(PinScanKey4==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey4==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey4==TRUE)
kword=11;break;} //确认确实有按键信号,返回键值
//以上语句扫描第二列
RD=DISRD;
WR=ENWR;
PinDrvKey2=FALSE;
PinDrvKey3=TRUE;
WR=DISWR;
RD=ENRD;
if(PinScanKey1==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey1==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey1==TRUE)
kword=7;break;} //确认确实有按键信号,返回键值
if(PinScanKey2==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey2==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey2==TRUE)
kword=8;break;} //确认确实有按键信号,返回键值
if(PinScanKey3==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey3==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey3==TRUE)
kword=9;break;} //确认确实有按键信号,返回键值
if(PinScanKey4==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey4==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey4==TRUE)
kword=12;} //确认确实有按键信号,返回键值
//以上语句扫描第三列
RD=DISRD;
WR=ENWR;
PinDrvKey3=FALSE;
PinDrvKey4=TRUE;
WR=DISWR;
RD=ENRD;
if(PinScanKey4==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey1==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey1==TRUE)
kword=0;break;} //确认确实有按键信号,返回键值
if(PinScanKey2==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey2==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey2==TRUE)
kword=14;break;} //确认确实有按键信号,返回键值
if(PinScanKey3==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey3==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey3==TRUE)
kword=14;break;} //确认确实有按键信号,返回键值
if(PinScanKey4==TRUE)
delay(DELAY_VALUE); //如果判断有信号,则延时一次
if(PinScanKey4==TRUE)
{ delay(DELAY_VALUE); //假如判断还有信号,则再延时
if(PinScanKey4==TRUE)
kword=13;break;} //假如判断还有信号,则再延时
//以上语句扫描第四列
RD=DISRD;
WR=ENWR;
PinDrvKey4=FALSE;
WR=DISWR;
RD=ENRD;
}return kword;
}
void display(unsigned char i,unsigned char num)
{ WR=FALSE;
if(num >= 0 && num <=9)
{switch(i)
{ case 0:P2=0x80;
P0=LedSelect0;
P2=0x90;
P0=numtochar(num);
//Led0显示nu
break;
case 1:P2=0x80;
P0=LedSelect1;
P2=0x90;
P0=numtochar(num);
//Led1显示nu
break;
case 2:P2=0x80;
P0=LedSelect2;
P2=0x90;
P0=numtochar(num);
//Led2显示nu镜氖
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -