📄 shumaguan2.c
字号:
/**********************************************************************
**文件名:shumaguan2.c **
**功能:实现键盘、数码管显示,实现计算器功能 **
**创建人:xingyuegu **
**创建日期:2006-9-10 **
**版本:1.0 **
**修改日期:2006-10-17 **
**版本:2.0 **
**********************************************************************/
#include <reg52.h>
#include <lcd.h>
#define uchar unsigned char
#define uint unsigned int
/**********************************************************************
变量定义
**********************************************************************/
unsigned char lastop;
unsigned long result=0;
unsigned long currentvalue=0,lastvalue=0;
code ksp[8]={0x8F,0x9F,0xAF,0xBF,0xCF,0xDF,0xEF,0xFF};
/****************************************************************************
数组功能:定义 按键按下时 P2口的数据
****************************************************************************/
code key_code1[32]={142,206,174,238,158,222,190,254,
141,205,173,237,157,221,189,253,
139,203,171,235,155,219,187,251,
135,199,167,231,151,215,183,247};
unsigned char code keyvalue[]=
{
'7','8','9','/',
'4','5','6','*',
'1','2','3','-',
'o','0','=','+'
};
uchar code letter_logo[10][16]={
/*-- 文字: 0 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-- 文字: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-- 文字: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-- 文字: 3 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 4 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: 5 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 6 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 7 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-- 文字: 8 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*-- 文字: 9 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
};
/**********************************************************************
** 函数申明 **
**********************************************************************/
void display(unsigned long);
unsigned char key_scan(void);
unsigned char transition(unsigned char);
bit isdigit(unsigned char );
unsigned int process(unsigned char );
uchar input();
/**********************************************************************
**函数功能:主函数 **
**参数:无 **
**返回:无 **
**********************************************************************/
void main()
{
unsigned char kvalue,temp;
Lcd_Initial();
Delay(500);
Lcd_Clear();
while(1)
{
temp=input();
kvalue=keyvalue[temp];
if(kvalue!=0)
result=process(kvalue);
kvalue=0;
if(result<=999999999)
{
display(result);
}
else
{
display(0);
}
}
}
/**********************************************************************
**函数功能:键值处理函数(处理+.-.*./.=) **
**参数:字符型 **
**返回:整型 **
**********************************************************************/
unsigned int process(unsigned char kvalue)
{
if(isdigit(kvalue)) //如果是数字,求值
{
currentvalue=transition(kvalue)+currentvalue*10;
result=currentvalue;
}
else //如果是功能键
if(kvalue=='o') //如果是ON/C,清0
{
result=0;
currentvalue=0;
lastvalue=0;
}
else
if(kvalue=='+') //如果是“+”
{ Lcd_Clear();
lastop=kvalue; //lastop保存操作码
lastvalue=currentvalue;//当前值成为上次值
result=currentvalue=0; //当前值清0
}
else if(kvalue=='-')
{
Lcd_Clear();
lastop=kvalue;
lastvalue=currentvalue;
result=currentvalue=0;
}
else if(kvalue=='*')
{
Lcd_Clear();
lastop=kvalue;
lastvalue=currentvalue;
result=currentvalue=0;
}
else if(kvalue=='/')
{
Lcd_Clear();
lastop=kvalue;
lastvalue=currentvalue;
result=currentvalue=0;
}
else if(kvalue=='=') //如果是“=”
{
Lcd_Clear();
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;
}
default:
break;
}
}
if(result>999999999)
{
result=0;
currentvalue=0;
}
return result;
}
/**********************************************************************
**函数功能:判断按键的键值是功能键还是数字键 **
**参数:整型数 **
**返回: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;
}
/******************************************************************************
* 函数名称
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -