#include "PCI9052Dll.h"
#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <math.h>
#include "DirectPort.h"
using namespace std;
unsigned char row[]={0x0e,0x0d,0x0b,0x07};
char key[4][4]={
'1','2','3','4',
'5','6','7','8',
'9','0','=','C',
'+','-','*','/'};
char first[8]={'1','2','3','4','5','6','#'}; //存第一个操作数
char second[8]; //存第二个操作数
char ch='#';
char x[8]; // 运算符
int f_num=0; //数组first中字符的个数
int s_num=0; //数组second中字符的个数
unsigned short base; //得到端口的基地址 19
void Scan(); //扫描键盘的函数 20
void Operation(char data); //对输入的字符进行操作
void Calculate(); //计算
int char_to_int(char x[]); //字符串转换为整数
void int_to_char(char x[],int A); //整数转换为字符串
void Show_Result(float r); //显示计算结果
void Dis_Error();
void Show_Result2(int r); //显示错误信息 26
int main(float argc, char* argv[])
{
if(!OpenDevice())
return 0;
GetIoBase(&base);
for(int i=0;i<8;i++) //初始化操作数组 32
{
first[i]='#';
second[i]='#';
}
//初始化显示器 36
DP_OutpB(base+8, 0x06);
Sleep(5);
DP_OutpB(base+8, 0x0f);
Sleep(5); // 40
DP_OutpB(base+8, 0x01);
Sleep(100);
DP_OutpB(base+8, 0x38);
Sleep(100);
DP_OutpB(base+3,0x82); //初始化8255 45
//Show_Result2(first);
Scan();
return 0;
}
void Scan() //49
{
char Key_Data='#';
unsigned char data=0x0f;
int j=0;
while(true)
{
for(int i=0;i<4;i++)
{
DP_OutpB(base,row[i]); //依次检测每一行 57
Sleep(20);
data=(BYTE)DP_InpB(base+1); //读键盘的状态
Sleep(20);
data=data&0x0f; //高四位清零 61
if(data!=0x0f&&j==0){
j=1;
switch(data)
{
case 0x0e:
Key_Data=key[i][0];
Sleep(20);
break;
case 0x0d:
Key_Data=key[i][1];
Sleep(20); // 70
break;
case 0x0b:
Key_Data=key[i][2];
Sleep(20);
break;
case 0x07:
Key_Data=key[i][3];
Sleep(20);
break;
default: // 80
Key_Data='#';
Sleep(20);
break;
}
if(Key_Data!='#')
{
cout<<Key_Data;
Operation(Key_Data);
}
}
if(data==0x0f){j=0;
Sleep(20);}
}
}
} // 92
void Operation(char data)
{
int i;
switch(data)
{
case '0':
case '1':
case '2': // 100
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': // 107
if(ch=='#')
{
if(f_num>20) // 110
{
cout<<"数值范围太大!"<<endl;
exit(-1);
Dis_Error();
}
first[f_num++]=data; // 116
}
else
{
if(s_num>20) // 120
{
cout<<"数值范围太大!"<<endl;
exit(-1);
Dis_Error();
}
second[s_num++]=data; // 126
}
DP_OutpB(base+9, data);
break;
case '+': // 130
case '-':
case '*':
case '/':
if(first[0]=='#')
Dis_Error();
else
{
ch=data;
Sleep(100);
DP_OutpB(base+8, 0x01); // 140
}
break;
case 'C':
system("cls");
DP_OutpB(base+8, 0x01);
Sleep(100);
for(i=0;i<20;i++)
{
first[i]='#';
second[i]='#'; // 150
}
ch='#';
f_num=0;
s_num=0;
break;
case '=':
Calculate();
break;
}
} // 160
void Calculate()
{
int c;
int A=char_to_int(first);
int B=char_to_int(second);
float result;
switch(ch)
{
case '+':
result=A+B;
Show_Result(result); // 170
break;
case '*':
result=A*B;
if(10000<result){Show_Result2(result);
}
else Show_Result(result);
break;
case '-':
result=A-B;
system("cls");
Show_Result(result);
break;
case '/': // 180
if(B==0)
Dis_Error();
else
{ result=A/B;
c=((A%B)*100)/B;
system("cls");
cout<<result;
cout<<"."<<c<<endl;
DP_OutpB(base+8,0x01);
Sleep(50);
int_to_char(first,result);
for(int t=0;t<8 && first[t]!='#';t++)
{
DP_OutpB(base+9,first[t]);
Sleep(50);
}
int_to_char(first,c);
DP_OutpB(base+9,'.');
Sleep(30);
for(int p=0;p<8 && first[p]!='#';p++)
{
DP_OutpB(base+9,first[p]);
Sleep(40);
}
// Show_Result(result);
}
break;
}
} // 190
int char_to_int(char x[])
{
int A=0;
for(int i=7;x[i]=='#';i--);
for(int j=i,k=0;j>=0;j--,k++)
{
int temp=(int)(x[j]-'0')*(float)pow(10,k);
A+=temp;
}
return A; // 200
}
void int_to_char(char x[],int A)
{
int i=0;
char y[8];
while(A)
{
y[i]=(char)(A%10+'0');
A=A/10;
i++; // 210
}
i--;
int leng=i;
for(int j=0;j<=leng;j++,i--)
x[j]=y[i];
for(;j<8;j++)
x[j]='#';
}
void Dis_Error()
{ // 220
system("cls");
cout<<"Error!";
DP_OutpB(base+8,0x01);
Sleep(5);
DP_OutpB(base+9,'E');
Sleep(5);
DP_OutpB(base+9,'R');
Sleep(5);
DP_OutpB(base+9,'R');
Sleep(5); // 230
DP_OutpB(base+9,'O');
Sleep(5);
DP_OutpB(base+9,'R');
Sleep(5);
DP_OutpB(base+9,'!');
Sleep(5);
}
void Show_Result(float result)
{int r=0;
//system("cls");
DP_OutpB(base+8,0x01);
Sleep(30);
cout<<result<<endl;
if(result<0)
{
result=0-result;
DP_OutpB(base+9,'-');
Sleep(30);
} //240
// DP_OutpB(base+8,0x01);
Sleep(50);
if(result==0)
{DP_OutpB(base+9,'0');
Sleep(50);
}
else{ int_to_char(first,result);
for(int m=0;m<8 && first[m]!='#';m++)
{m++;}
r=15-m;
for(r=15-m;0<=r;r++){
DP_OutpB(base+9,' ';
Sleep(50);
}
for(int i=0;i<8 && first[i]!='#';i++)
{
DP_OutpB(base+9,first[i]);
Sleep(50);
}
}
} // 249
void Show_Result2(int r)
{
cout<<r<<endl;
int i=0;
int c=0;
char b;
int_to_char( x,r);
//system("cls");
DP_OutpB(base+8,0x01);
Sleep(50);
//DP_OutpB(base+9,x[0]);
DP_OutpB(base+9,x[0]);
Sleep(50);
DP_OutpB(base+9,'.');
Sleep(50);
for(int m=1;m<8 && x[m]!='#';m++)
{c=c+1;
DP_OutpB(base+9,x[m]);
Sleep(50);
}
DP_OutpB(base+9,'E');
Sleep(40);
b=(char)(c+'0');
DP_OutpB(base+9,b);
} // 249
weiji.rar_weiji
版权申诉
108 浏览量
2022-09-19
16:31:19
上传
评论
收藏 2KB RAR 举报
Kinonoyomeo
- 粉丝: 76
- 资源: 1万+
最新资源
- ocr模型ch-ppocr-mobile-v2.0-cls-infer
- 计算两个地点之间的最短路线距离.php
- JavaWeb-学习笔记
- 一键安装docker环境:docker、docker-compose
- 使Unity开发的游戏支持热更新的解决方案
- 信息办公简易java开源订销管理系统-javainfo.zip
- 新闻文章NTsky新闻发布(提供JavaBean)v1.0-ntskynewsv1.0javabean.zip
- 搜索链接java(结合lucene)版的公交搜索系统-javaso.zip
- 基于深度循环神经网络DRNN的单通道音乐人声分离python源码(高分大作业).zip
- 实验4.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈