单片机简单C语言问题,实现一个个位加法计算器

#include <reg52.h>
#define uchar unsigned char
#define unit unsigned int
#define OPdata P0 //十位数据口
#define OPdata1 P1//个位数据口
sbit se0=P3^6;//十位选择
sbit se1=P3^7;//个位选择
sbit Q=P2^6;
sbit W=P2^5;
sbit E=P2^4;
uchar cis; //按下键盘次数
uchar jia1; //加数1
uchar jia2; //加数2
uchar z; //中转数
uchar shi; //十位数
uchar ge; //个位数
uchar s; //译码结果
uchar j; //译码结果
uchar sum; //加法结果
uchar keytemp;
void judge(uchar m) //数码显像管译码
{
switch (m)
{
case 0:
s=0x3F;
break;
case 1:
s=0x06;
break;
case 2:
s=0x5B;
break;
case 3:
s=0x4F;
break;
case 4:
s=0x66;
break;
case 5:
s=0x6D;
break;
case 6:
s=0x7D;
break;
case 7:
s=0x07;
break;
case 8:
s=0x7F;
break;
case 9:
s=0x6F;
break;
}
}
void judge1(uchar h) //十位数码显像管译码
{
switch (h)
{
case 0:
j=0x3F;
break;
case 1:
j=0x06;
break;
}
}
void judgecis()
{
if (cis==1)
{
jia1=z;
ge=z;
shi=0;
}
else if (cis==2)
{
jia2=z;
ge=z;
shi=0;
cis=0;
}
}
void jiafa(uchar m,uchar n) //加法
{
sum=m+n;
if (sum>=10)
{
ge=sum-10;
shi=1;
}
else
{
ge=sum;
shi=0;
}
}

void main()
{
cis=0;
jia1=0;
jia2=0;
shi=0;
ge=0;
s=0;
j=0;
P2=0XFF;
se0=0;//开启十位
se1=0;//开启个位
OPdata=0x3f;//十位
OPdata1=0x3f;//个位
while (1)
{
Q=0;
keytemp=P2;
switch (keytemp)
{
case 0xbb:
z=3;
cis++;
break;
case 0xbd:
z=6;
cis++;
break;
case 0xbe:
z=9;
cis++;
break;
case 0xb7: //等于号
jiafa (jia1,jia2);
cis=0;
break;
}
Q=1;
W=0;
keytemp=P2;
switch (keytemp)
{
case 0xde:
z=8;
cis++;
break;
case 0xdd:
z=5;
cis++;
break;
case 0xdb:
z=2;
cis++;
break;
case 0xd7:
z=0;
cis++;
break;
}
W=1;
E=0;
keytemp=P2;
switch (keytemp)
{
case 0xee:
z=7;
cis++;
break;
case 0xed:
z=4;
cis++;
break;
case 0xeb:
z=1;
cis++;
break;
}
judgecis();
judge(ge);
OPdata1=s;
judge1(shi);
OPdata=j;
E=1;
}
}
问题出在每次按了两次之后,相加的结果总是等于第二个数加第二个数,看了好久都看不出来,我是要崩溃了……

你的问题应该出现在键盘处理不完善造成的,稍微修改了一下你试试。
#include <reg52.h>
#define uchar unsigned char
#define unit unsigned int
#define OPdata P0 //十位数据口
#define OPdata1 P1//个位数据口
sbit se0=P3^6;//十位选择
sbit se1=P3^7;//个位选择
sbit Q=P2^6;
sbit W=P2^5;
sbit E=P2^4;
uchar cis; //按下键盘次数
uchar jia1; //加数1
uchar jia2; //加数2
uchar z; //中转数
uchar shi; //十位数
uchar ge; //个位数
uchar s; //译码结果
uchar j; //译码结果
uchar sum; //加法结果
uchar keytemp;
void judge(uchar m) //数码显像管译码
{
switch (m)
{
case 0: s=0x3F; break;
case 1: s=0x06; break;
case 2: s=0x5B; break;
case 3: s=0x4F; break;
case 4: s=0x66; break;
case 5: s=0x6D; break;
case 6: s=0x7D; break;
case 7: s=0x07; break;
case 8: s=0x7F; break;
case 9: s=0x6F; break;
}
}
void judge1(uchar h) //十位数码显像管译码
{
switch (h)
{
case 0: j=0x3F; break;
case 1: j=0x06; break;
}
}
void judgecis()
{
if (cis==1)
{
jia1=z;
ge=z;
shi=0;
}
else if (cis==2)
{
jia2=z;
ge=z;
shi=0;
cis=0;
}
}
void jiafa(uchar m,uchar n) //加法
{
sum=m+n;
if (sum>=10)
{
ge=sum-10;
shi=1;
}
else
{
ge=sum;
shi=0;
}
}

void main()
{
cis=0;
jia1=0;
jia2=0;
shi=0;
ge=0;
s=0;
j=0;
P2=0XFF;
se0=0;//开启十位
se1=0;//开启个位
OPdata=0x3f;//十位
OPdata1=0x3f;//个位
while (1)
{
Q=0;
keytemp=P2;
switch (keytemp)
{
case 0xbb: z=3; cis++;while(P2==0xbb); break;
case 0xbd: z=6; cis++;while(P2==0xbd); break;
case 0xbe: z=9; cis++;while(P2==0xbe); break;
case 0xb7: //等于号
jiafa (jia1,jia2); cis=0; break;
}
Q=1;
W=0;
keytemp=P2;
switch (keytemp)
{
case 0xde: z=8; cis++;while(P2==0xde); break;
case 0xdd: z=5; cis++;while(P2==0xdd); break;
case 0xdb: z=2; cis++;while(P2==0xdb); break;
case 0xd7: z=0; cis++;while(P2==0xd7); break;
}
W=1;
E=0;
keytemp=P2;
switch (keytemp)
{
case 0xee: z=7; cis++;while(P2==0xee); break;
case 0xed: z=4; cis++;while(P2==0xed); break;
case 0xeb: z=1; cis++;while(P2==0xeb); break;
}
judgecis();
judge(ge);
OPdata1=s;
judge1(shi);
OPdata=j;
E=1;
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-01-03
你的意思是先按1,再按6,最后按=号,结果是12?而不是7?

下面有一行改下。
void judgecis()
{
if (cis==1)
{
jia1=z;
ge=z;
shi=0;
}
else if (cis==2)
{
jia2=z;
ge=z;
shi=0;
cis=0; //把这行去掉试试

}
}
第2个回答  2020-09-27
这个是个小试验项目吧,其实就是做一个4*4键盘的功能?简单就用16个io口分别赋予键值,复杂的就是用4x4键盘逻辑(4个io纵向,4个io横向编程)
第3个回答  2013-01-03
你这样的程序也不整理再贴出来,看了都累啊

51单片机键盘矩阵实现个位加法计算器,用c编程
KEYBUF EQU 40H ;键号存放单元 ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV KEYBUF,#0 ;初始键号设位0,也可以为任意值 MOV R0,#30H ;显示首地址 MOV R2,#0CH ;计算数据存放单元个数 CLR A QING:MOV R0,A ;将数据存放单元清零 INC R0 DJNZ R2,QING MOV P0,#8FH ;关闭显示 MOV R1,...

如何用51单片机做计算器(要求用C语言编程) 由于是新手所以没积分 对 ...
\/\/*** myh.h ***有两个文件,一个是头文件myh.h一个是js.c include <reg52.h> typedef unsigned char uchar;typedef unsigned int uint;typedef bit BOOL;\/\/ sbit rs=P2^6;sbit rw=P2^5;sbit e=P2^7;\/\/ uchar Key_Down(void);\/\/返回0到12的键盘的编码 void delay(uchar);\/\/...

大神,求51单片机做简易计算器的那个c语言程序
ulint bb,dd,ee,ff;uchar d,flag1;uchar fd1,fd2;uchar b1=16,b2=16,b3=16,b4=16,b5=16;uchar d1=16,d2=16,d3=16,d4=16,d5=16;uchar f1=16,f2=16,f3=16,f4=16,f5=16,f6=16,f7=16,f8=16,f9=16,f10=16;uchar key,keyval,c,temp;void Delay1ms(uint i) \/\/1ms延时...

用单片机设计1位十进制加法计算器,
Num_Buffer[2]=Key_Counts\/100;Num_Buffer[1]=Key_Counts\/10%10;Num_Buffer[0]=Key_Counts%10;for(i=0;i<3;i++){ j = _cror_(j,1);P2 = j;P0 = DSY_CODE[Num_Buffer[i]];DelayMS(1);} } void main(){ uchar i;P0 = 0xff;P1 = 0xff;P2 = 0x00;Key_Code = 0xff...

C语言设计一个加减计数器,通过两个按键来控制。就是按一个键就加一...
case KEYA: num++;break; case KEYM: num--;break; } } return 0;}如果你是要其他平台,比如单片机上运行,只要对应按钮电平对应防抖代码中对变量++,--就可以了。我之前给别人写个一个单片机的简单程序,里面就有按钮+-的,你可以参考。以前回答记录 ...

用C语言设计一个简单计算器
else if(p=='*') multiplication(a,b,c);else if(p=='\/') div(a,b,c);else puts("没有注册这个运算符号\\n"); }以上是设计的一个简易计算器。可以进行相应的加减乘除。简介:C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所...

C语言程序设计,做一个简单计算器
void add()\/\/加法运算 { double a,b;printf("请输入要计算的两个数:\\n");scanf("%lf%lf",&a,&b);printf("%.2lf+%.2lf=%.2lf\\n",a,b,a+b);} void sub()\/\/减法运算 { double a,b;printf("请输入要计算的两个数:\\n");scanf("%lf%lf",&a,&b);printf("%.2lf-%....

c语言如何实现一个简单的计算器?
void main(){ int n,a,b,c;scanf("%d",&n);a=n; c=a%10; a\/=10; b=a%10; a\/=10; a%=10;printf("%d的个位为%d,十位为%d,百位为%d。\\n",n,c,b,a);} c语言:1.简介:C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所...

单片机简单问题
无论是加法和减法都是一致的,单片机只提供结果的后八位,而正确的结果要利用OV和CY来校正,比如要用单片机做一个计算器,即必须自己设计这个校正程序,以得到正确的结果了。并且与微机不同的是,单片机内都是操作数的概念,而不是微机里的数都是用补码表示,单片机内部采用什么码是由设计着决定的,...

c语言设计一个简单的计算器程序
do//do-while先执行再判断循环条件,即可实现重复计算功能 { menu();//打印出菜单界面 scanf("%d",&select);//输入你的选项 printf("请输入计算值:");scanf("%d%d",&i,&j);//输入要计算的数值 switch(select){ case1:printf("%d+%d=%d\n"...

相似回答