📄 shumaguan.c
字号:
/**********************************************************************
**文件名:shumaguan.c **
**功能:实现键盘、数码管显示,实现计算器功能 **
**创建人:xingyuegu **
**日期:2006-9-10 **
**版本:1.0 **
**********************************************************************/
#include <reg51.h>
/**********************************************************************
** 函数申明 **
**********************************************************************/
void delay(unsigned int);
void display(int );
unsigned char key_scan(void);
unsigned char transition(unsigned char);
void time_set();
void time0_int();
bit isdigit(unsigned char );
/**********************************************************************
** 变量定义 **
**********************************************************************/
unsigned char keyreturnvalue=0;
bit flag;
int code num_tab1[4]=
{0x88,0x84,0x82,0x81}
;
int code num_tab2[11]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}
;
unsigned char code keyvalue[][4]={
{'7','8','9','/'},
{'4','5','6','*'},
{'1','2','3','-'},
{'o','0','=','+'}
};
/**********************************************************************
**函数功能:主函数 **
**参数:无 **
**返回:无 **
**********************************************************************/
void main()
{
unsigned char kvalue,lastop,flag=0;
unsigned int currentvalue=0,lastvalue,result=0;
lastvalue=0;
while(1)
{
kvalue=key_scan();
if(isdigit(kvalue)&&!flag) //如果是数字,求值
{
currentvalue=transition(kvalue)+currentvalue*10;
result=currentvalue;
}
else //如果是功能键
if(kvalue=='o') //如果是ON/C,清0
{
result=0;
currentvalue=0;
lastvalue=0;
}
else if(kvalue=='+') //如果是“+”
{
lastop=kvalue; //lastop保存操作码
lastvalue=currentvalue;//当前值成为上次值
currentvalue=0; //当前值清0
}
else if(kvalue=='-')
{
lastop=kvalue;
lastvalue=currentvalue;
currentvalue=0;
}
else if(kvalue=='*')
{
lastop=kvalue;
lastvalue=currentvalue;
currentvalue=0;
}
else if(kvalue=='/')
{
lastop=kvalue;
lastvalue=currentvalue;
currentvalue=0;
}
else if(kvalue=='=') //如果是“=”
{
switch(lastop) //判断操作码是什么
{
case '+':
{
result=result+lastvalue;
currentvalue=result;
break;
}
case '-':
{
result=lastvalue-currentvalue;
currentvalue=result;
break;
}
case '*':
{
result=currentvalue*lastvalue;
currentvalue=result;
break;
}
case '/':
{
result=lastvalue/currentvalue;
currentvalue=result;
break;
}
}
}
if(result<=9999)
{
display(result);
}
else
{
display(0);
result=0;
currentvalue=0;
}
}
}
/*void time0_int() interrupt 1 using 2
{
unsigned char i=0;
TR0=0;
keyreturnvalue=key_scan();
time_set();
}
void time_set(void)
{
TMOD=TMOD&0xf0;
TMOD=TMOD|0X01;;
TH0=15535/255;
TL0=15535%255;
EA=1;
ET0=1;
TR0=1;
} */
/**********************************************************************
**函数功能:判断按键的键值是功能键还是数字键 **
**参数:整型数 **
**返回:BOOL型 **
**********************************************************************/
bit isdigit(unsigned char kvalue)
{
if(kvalue>='0'&&kvalue<='9')
return 1;
else
return 0;
}
/**********************************************************************
**函数功能:把数字的ASCII转换成整型 **
**参数:整型数 **
**返回:整型 **
**********************************************************************/
unsigned char transition(unsigned char kvalue)
{
if(kvalue>='0'&&kvalue<='9')
return (kvalue-'0');
else
return 0;
}
/**********************************************************************
**函数功能:键盘扫描功能 **
**参数:无 **
**返回:返回键值 **
**********************************************************************/
unsigned char key_scan(void)
{
unsigned char line,row,temp,a,b,kvalue;
temp=0xfe;
flag=0;
P1=0xff;
for(line=0;line<5;line++) //进行行扫描
{
a=temp<<line;
b=temp>>(8-line);
P3=a|b;
kvalue=P1&0x0f;
if(kvalue!=0x0f) //去除键抖动
delay(100);
kvalue=P1&0x0f;
if(kvalue!=0x0f)
break;
}
while(P1!=0x0ff) //判断键弹起
{
}
if(kvalue==0x0e) //确定是第几列
row=0;
else
if(kvalue==0x0d)
row=1;
else
if(kvalue==0x0b)
row=2;
else
if(kvalue==0x07)
row=3;
else
return 0;
P3=0xff;
return keyvalue[line][row];
}
/**********************************************************************
**函数功能:在数码管上显示数据 **
**参数:整型数 **
**返回:无 **
**********************************************************************/
void display(int disnum)
{
int ge,shi,bai,qian,i,j;
int num[5]={0,0,0,0,10};
if(disnum<9999)
{
ge=disnum%10;
shi=(disnum%100)/10;
bai=(disnum/100)%10;
qian=disnum/1000;
num[0]=ge;
num[1]=shi;
num[2]=bai;
num[3]=qian;
if(qian!=0)
{
for(i=0;i<4;i++)
{
P2=num_tab1[i]; //先送位码
P0=num_tab2[num[i]]; //再送段码
delay(1);
}
}
else
{
if(bai!=0)
{
for(i=0;i<3;i++)
{
P2=num_tab1[i];
P0=num_tab2[num[i]];
delay(1);
}
}
else
{
if(shi!=0)
{
for(i=0;i<2;i++)
{
P2=num_tab1[i];
P0=num_tab2[num[i]];
delay(1);
}
}
else
{
for(i=0;i<1;i++)
{
for(j=0;j<4;j++)
{
if(j==0)
{
P2=num_tab1[j];
P0=num_tab2[num[i]];
delay(1);
}
else
{
P2=num_tab1[j];
P0=num_tab2[num[4]];
delay(1);
}
}
}
}
}
}
}
else
;
}
/**********************************************************************
**函数功能:延时时间 **
**参数:整型数 **
**返回:无 **
**********************************************************************/
void delay(unsigned int time)
{
int i;
int k;
for(i=0;i<time;i++)
for(k=0;k<100;k++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -