|
//关于数组的定义的问题2013年11月10日13:41
// 编写人 heiheidiy
//基于TX-1C开发板的简易计算器
// 可以实现四位数字的运算,比如 4567+1234 333*1000
// 最大可以输出6位结果
// 不能实现小数运算,数码管最开始的时候显示6个0.
#include
typedef unsigned int uint
typedef unsigned char uchar
sbit dula=P2^6;
sbit wela=P2^7;
//sbit key1=P3^4;
//char z;
double shu1;
int p[8],shu2,shu3;
long s1=0; //
uchar t1=0,i,jia,jian,cheng,chu,num0;
uchar code table[]={ // 0~e
0x3f,0x06,0x5b,0x4f, //0x3f 0
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar num,temp,num1;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
long keyscan();
void display(long aa);
void main()
{
p[0]=-1;
p[1]=-1;
p[2]=-1;
p[3]=-1;
p[4]=-1;
p[5]=-1;
p[6]=-1;
p[7]=-1;
num=0; //
dula=1;
P0=0;
dula=0;
P0=0;
wela=1;
P0=0xff;
wela=0;
while(1)
{ //76543
display(keyscan());
}
}
void display(long aa) // 显示函数
{ /* if((aa/001000<0)&&(aa/10000)>0 ) //
else if((aa/10000)<0&&(aa/1000)>0)
else if((aa/1000)<0&&(aa/100)>0)
else if((aa/100)<0&&(aa/10)>0)
else if((aa/10)<0)
*/
wela=1;
P0=0xfe; //once error
wela=0;
P0=0;
dula=1;
P0=table[aa/100000];
dula=0; delay(3);
wela=1;
P0=0xfd;
wela=0;
P0=0;
dula=1;
P0=table[aa%100000/10000];
dula=0; delay(3);
wela=1;
P0=0xfb;
wela=0;
P0=0;
dula=1;
P0=table[aa%10000/1000];
dula=0; delay(3);
wela=1;
P0=0xf7;
wela=0;
P0=0;
dula=1;
P0=table[aa%1000/100];
dula=0; delay(3);
wela=1;
P0=0xef;
wela=0;
P0=0;
dula=1;
P0=table[aa%100/10];
dula=0; delay(3);
wela=1;
P0=0xdf;
wela=0;
P0=0;
dula=1;
P0=table[aa%10];
dula=0; delay(3);
}
void jisuan() // 计算输入的数值
{
if( p[0]>0&&p[1]<0 )
{
p[1]=num;
s1=(p[0]*10+p[1]);
}
else
{
if( p[0]>0&&p[1]>=0&&p[2]<0)
{ p[2]=num;
s1=(p[0]*100+p[1]*10+p[2]);
}
else
{
if(p[0]>0&&p[1]>=0&&p[2]>=0&&p[3]<0)
{
p[3]=num;
s1=(p[0]*1000+p[1]*100+p[2]*10+p[3]);
}
}
}
}
/*
1 2 3 4
5 6 7 8
9 0 =
* / + -
*/
long keyscan()//键盘扫描程序
{
//t :
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);//沿时去抖
temp=P3;
temp=temp&0xf0;//再次检测
while(temp!=0xf0)
{
temp=P3;//赋值
switch(temp)
{
case 0xee:
num=1;
if(p[0]<0)
s1=p[0]=num;
else {
jisuan();
}
break;
case 0xde:num=2;
if(p[0]<0) s1=p[0]=num;
else {
jisuan();
}
break;
case 0xbe:num=3;
if(p[0]<0) s1=p[0]=num;
else {
jisuan();
}
break;
case 0x7e:num=4;
if(p[0]<0) s1=p[0]=num;
else {
jisuan();
}
break;
}
while(temp!=0xf0)//松手检测
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: num=5;
if(p[0]<0) s1=p[0]=num;
else {
jisuan();
}
break;
case 0xdd:num=6;
if(p[0]<0) s1=p[0]=num;
else {
jisuan();
}
break;
case 0xbd:num=7;
if(p[0]<0) s1=p[0]=num;
else {
jisuan();
}
break;
case 0x7d:num=8;
if(p[0]<0) s1=p[0]=num;
else {
jisuan();
}
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: // s14
num=9;
if(p[0]<0)
s1=p[0]=num;
else
{
jisuan();
}
break;
case 0xdb:
num=0;
if( p[0]>0&&p[1]<0 )
{
p[1]=num;
s1=(p[0]*10+p[1]);
}
else
{
jisuan();
}
break;
case 0xbb://goto z;
break;
case 0x7b:
if(cheng==1)
s1=shu1*s1;
else
{
if(jia==1)
s1=shu1+s1;
else
{ if(jian==1)
s1=shu1-s1;
else
{
if(chu==1)
s1=shu1/s1;
}
}
}
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
cheng=1;
break;
case 0xd7:
chu=1; // s18
break;
case 0xb7:
jia=1;
break;
case 0x77:
jian=1;
break;
}
t1++; //统计数字的次数
if(t1==1)
{
shu1=s1; t1=0;
}
s1=0;
p[0]=-1;
p[1]=-1;
p[2]=-1;
p[3]=-1;
p[4]=-1;
p[5]=-1;
p[6]=-1;
p[7]=-1;
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
return s1;// 猜测将在此处出现10,100之类的数字
}
这是基于TX-1C开发板写的,主要是利用: if(p[0]<0)
s1=p[0]=num;
else {
jisuan();
}
来实现输入数值的计算。以前写的,希望能帮到你。
|
|