用单片机C语言编程做个计算器,求详细代码,一定要可用的,发到youlingjujishou@163.com谢谢。
发布网友
发布时间:2022-05-07 19:42
我来回答
共2个回答
热心网友
时间:2023-11-08 13:49
#include <reg51.h>
#define uchar unsigned char
long First,End; //定义全局变量
void delay(int n) //***延时程序***//
{int i,j;
for(i=0;i<n;i++)
{for(j=0;j<50;j++)
;}
}
long add(long x,long y) //***加法程序***//
{long z;
z=x+y;
return(z);
}
long sub(long x,long y) //***减法程序***//
{long z;
if(x>=y)
z=x-y;
else
{z=y-x;
z=z+10e6;} //***最高位用1表示负数***//
return(z);
}
long mul(long x,long y) //***乘法程序***//
{long z;
z=x*y;
return(z);
}
long div(long x,long y) //***除法程序***//
{long z;
z=x/y;
return(z);
}
uchar kbscan(void) //***键盘扫描程序***//
{
uchar sccode;
P1=0xf0;
if((P1&0xf0)!=0xf0) //发全0行扫描码,列线输入
{ delay(222); //延时去抖
if((P1&0xf0)!=0xf0)
{sccode=0xfe; //逐行扫描初值
while((sccode&0x10)!=0)
{P1=sccode; //输出行扫描码
if((P1&0xf0)!=0xf0)
{
return(P1);} //如果检测到有键按下,返回键值
else
sccode=(sccode<<1)|0x01; //行扫描码左移一位
}
}
}
return(0); //无键按下,返回值为0
}
void display(void) //***显示程序***//
{int i;
uchar code rel[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管选通
uchar code led[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //定义0-9
uchar data num[8];
num[0]=First/10000000; //千万位
num[1]=First/1000000%10; //百万位
num[2]=First/100000%10; //十万位
num[3]=First/10000%10; //万位
num[4]=First/1000%10; //千位
num[5]=First/100%10; //百位
num[6]=First/10%10; //十位
num[7]=First%10; //个位
for(i=7;i>=0;i--)
{P3=rel[i]; //位选输出
P2=led[num[i]]; //数据输出
delay(2); //此延时必不可少?
}
}
void main(void) //***主程序***//
{ int k,n;
uchar f,g,key,gn1;
n=0;
f=0;
P0=0; //初始时指示灯灭
while(1) //不断查询是否有按键动作
{ key=kbscan(); //获取返回键值
if(key!=0)
{
switch(key) //译码,将对应按键返回值转换为相应数值
{
case 0xee: k=0;break;//0
case 0xde: k=1;break;//1
case 0xbe: k=2;break;//2
case 0x7e: k=3;break;//3
case 0xed: k=4;break;//4
case 0xdd: k=5;break;//5
case 0xbd: k=6;break;//6
case 0x7d: k=7;break;//7
case 0xeb: k=8;break;//8
case 0xdb: k=9;break;//9
case 0xbb: k=10;First=0;End=0;f=0;break;//清除
case 0x7b: k=11;break;//等于
case 0xe7: k=12;f=1;break;//加
case 0xd7: k=13;f=2;break;//减
case 0xb7: k=14;f=3;break;//乘
case 0x77: k=15;f=4;break;//除
}
P0=1;
delay(280); //有按键时,指示灯的显示时间
P0=0; //按键指示灭
if(k<10) //为数字键时(0-9)
{
if(f!=0) //为数字键时,如果已经有功能键按下
{
n++; //记录数字键所按次数
gn1=0; //清除标志,再次为功能键时进行运算
g=f; //保存运算标志
if(n==1) //输入为各位数时,直接赋值
First=k;
else if(n>1) //输入为多位数时,将它转化为10进制的多位数
First=First*10+k;
}
else //如果没有功能键按下
{
n++;
gn1=1; //定义标志,当下一次为功能键时,停止数据输入
if(n==1)
First=k;
else if(n>1)
First=First*10+k;
End=First; //将第一个数保存
}
}
else if(k>11) //为功能键时(+-*/)
{
if(gn1==1) //前一次数字键之后为功能键时
{
n=0; //清除计数标志
}
else //如果再次输入功能键,则进行运算
{n=0; //清除计数标志
switch(g)
{case 1: First=add(End,First);break;
case 2: First=sub(End,First);break;
case 3: First=mul(End,First);break;
case 4: First=div(End,First);break;}
}
End=First; //保存本次结果
}
else if(k==11) //为等于号时(=)
{n=0;
gn1=1; //接着输入为功能键时可以继续运算
switch(g)
{case 1: First=add(End,First);break;
case 2: First=sub(End,First);break;
case 3: First=mul(End,First);break;
case 4: First=div(End,First);break;
}
End=First; //保存最终运算结果
f=0; //清除运算标志
}
}
display(); //调用显示程序
}
}
这个吧!改些地方就能用
热心网友
时间:2023-11-08 13:49
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define an XBYTE[0x7fff]
#define wei XBYTE[0xbfff]
uchar key;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x7c,0x39,0x5e,0x79,0x71
};
uchar xian[8]={10,10,10,10,10,10,10,10
};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display()
{
uchar i;
for(i=0;i<8;i++)
{
wei=0xff;
an=~table[xian[i]];
wei=~(0x80>>i);
delay(2);
}
}
void key_scan()
{
uchar fu,num1,num2;
uint num;
uchar temp,temp1,temp2;
P1=0xf0;
temp1=P1;
if(temp1!=0xf0)
{
delay(10);
P1=0xf0;
temp1=P1;
if(temp1!=0xf0)
{
P1=0x0f;
temp2=P1;
temp=temp1|temp2;
switch(temp)
{
case 0xee: key=0;break;
case 0xde: key=1;break;
case 0xbe: key=2;break;
case 0x7e: key=3;break;
case 0xed: key=4;break;
case 0xdd: key=5;break;
case 0xbd: key=6;break;
case 0x7d: key=7;break;
case 0xeb: key=8;break;
case 0xdb: key=9;break;
case 0xbb: key=10;break;
case 0x7b: key=11;break;
case 0xe7: key=12;break;
case 0xd7: key=13;break;
case 0xb7: key=14;break;
case 0x77: key=15;break;
}
}
if(key<10)
{
if(fu==0)
{
xian[6]=xian[7];
xian[7]=key;
if(xian[6]==10)
{
num1=xian[7];
}
else
{
num1=xian[6]*10+xian[7];
}
}
else
{
xian[6]=xian[7];
xian[7]=key;
if(xian[6]==10)
{
num2=xian[7];
}
else
{
num2=xian[6]*10+xian[7];
}
}
}
if((11<key)&&(key<16))
{
xian[4]=10;
xian[5]=10;
xian[6]=10;
xian[7]=10;
fu=key;
}
if(key==10)
{
xian[4]=10;
xian[5]=10;
xian[6]=10;
xian[7]=10;
fu=0;
}
if(key==11)
{
switch(fu)
{
case 12: num=num1+num2;fu=0;break;
case 13: num=num1-num2;fu=0;break;
case 14: num=num1*num2;fu=0;break;
case 15: num=num1/num2;fu=0;break;
}
xian[4]=num/1000;
xian[5]=num%1000/100;
xian[6]=num%100/10;
xian[7]=num%10;
}
while(temp1!=0xf0)
{
P1=0xf0;
temp1=P1;
}
}
}
void main()
{
while(1)
{ key_scan();
display();
}
}
刚试过。可以
热心网友
时间:2023-11-08 13:49
#include <reg51.h>
#define uchar unsigned char
long First,End; //定义全局变量
void delay(int n) //***延时程序***//
{int i,j;
for(i=0;i<n;i++)
{for(j=0;j<50;j++)
;}
}
long add(long x,long y) //***加法程序***//
{long z;
z=x+y;
return(z);
}
long sub(long x,long y) //***减法程序***//
{long z;
if(x>=y)
z=x-y;
else
{z=y-x;
z=z+10e6;} //***最高位用1表示负数***//
return(z);
}
long mul(long x,long y) //***乘法程序***//
{long z;
z=x*y;
return(z);
}
long div(long x,long y) //***除法程序***//
{long z;
z=x/y;
return(z);
}
uchar kbscan(void) //***键盘扫描程序***//
{
uchar sccode;
P1=0xf0;
if((P1&0xf0)!=0xf0) //发全0行扫描码,列线输入
{ delay(222); //延时去抖
if((P1&0xf0)!=0xf0)
{sccode=0xfe; //逐行扫描初值
while((sccode&0x10)!=0)
{P1=sccode; //输出行扫描码
if((P1&0xf0)!=0xf0)
{
return(P1);} //如果检测到有键按下,返回键值
else
sccode=(sccode<<1)|0x01; //行扫描码左移一位
}
}
}
return(0); //无键按下,返回值为0
}
void display(void) //***显示程序***//
{int i;
uchar code rel[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管选通
uchar code led[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //定义0-9
uchar data num[8];
num[0]=First/10000000; //千万位
num[1]=First/1000000%10; //百万位
num[2]=First/100000%10; //十万位
num[3]=First/10000%10; //万位
num[4]=First/1000%10; //千位
num[5]=First/100%10; //百位
num[6]=First/10%10; //十位
num[7]=First%10; //个位
for(i=7;i>=0;i--)
{P3=rel[i]; //位选输出
P2=led[num[i]]; //数据输出
delay(2); //此延时必不可少?
}
}
void main(void) //***主程序***//
{ int k,n;
uchar f,g,key,gn1;
n=0;
f=0;
P0=0; //初始时指示灯灭
while(1) //不断查询是否有按键动作
{ key=kbscan(); //获取返回键值
if(key!=0)
{
switch(key) //译码,将对应按键返回值转换为相应数值
{
case 0xee: k=0;break;//0
case 0xde: k=1;break;//1
case 0xbe: k=2;break;//2
case 0x7e: k=3;break;//3
case 0xed: k=4;break;//4
case 0xdd: k=5;break;//5
case 0xbd: k=6;break;//6
case 0x7d: k=7;break;//7
case 0xeb: k=8;break;//8
case 0xdb: k=9;break;//9
case 0xbb: k=10;First=0;End=0;f=0;break;//清除
case 0x7b: k=11;break;//等于
case 0xe7: k=12;f=1;break;//加
case 0xd7: k=13;f=2;break;//减
case 0xb7: k=14;f=3;break;//乘
case 0x77: k=15;f=4;break;//除
}
P0=1;
delay(280); //有按键时,指示灯的显示时间
P0=0; //按键指示灭
if(k<10) //为数字键时(0-9)
{
if(f!=0) //为数字键时,如果已经有功能键按下
{
n++; //记录数字键所按次数
gn1=0; //清除标志,再次为功能键时进行运算
g=f; //保存运算标志
if(n==1) //输入为各位数时,直接赋值
First=k;
else if(n>1) //输入为多位数时,将它转化为10进制的多位数
First=First*10+k;
}
else //如果没有功能键按下
{
n++;
gn1=1; //定义标志,当下一次为功能键时,停止数据输入
if(n==1)
First=k;
else if(n>1)
First=First*10+k;
End=First; //将第一个数保存
}
}
else if(k>11) //为功能键时(+-*/)
{
if(gn1==1) //前一次数字键之后为功能键时
{
n=0; //清除计数标志
}
else //如果再次输入功能键,则进行运算
{n=0; //清除计数标志
switch(g)
{case 1: First=add(End,First);break;
case 2: First=sub(End,First);break;
case 3: First=mul(End,First);break;
case 4: First=div(End,First);break;}
}
End=First; //保存本次结果
}
else if(k==11) //为等于号时(=)
{n=0;
gn1=1; //接着输入为功能键时可以继续运算
switch(g)
{case 1: First=add(End,First);break;
case 2: First=sub(End,First);break;
case 3: First=mul(End,First);break;
case 4: First=div(End,First);break;
}
End=First; //保存最终运算结果
f=0; //清除运算标志
}
}
display(); //调用显示程序
}
}
这个吧!改些地方就能用
热心网友
时间:2023-11-08 13:49
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define an XBYTE[0x7fff]
#define wei XBYTE[0xbfff]
uchar key;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x7c,0x39,0x5e,0x79,0x71
};
uchar xian[8]={10,10,10,10,10,10,10,10
};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display()
{
uchar i;
for(i=0;i<8;i++)
{
wei=0xff;
an=~table[xian[i]];
wei=~(0x80>>i);
delay(2);
}
}
void key_scan()
{
uchar fu,num1,num2;
uint num;
uchar temp,temp1,temp2;
P1=0xf0;
temp1=P1;
if(temp1!=0xf0)
{
delay(10);
P1=0xf0;
temp1=P1;
if(temp1!=0xf0)
{
P1=0x0f;
temp2=P1;
temp=temp1|temp2;
switch(temp)
{
case 0xee: key=0;break;
case 0xde: key=1;break;
case 0xbe: key=2;break;
case 0x7e: key=3;break;
case 0xed: key=4;break;
case 0xdd: key=5;break;
case 0xbd: key=6;break;
case 0x7d: key=7;break;
case 0xeb: key=8;break;
case 0xdb: key=9;break;
case 0xbb: key=10;break;
case 0x7b: key=11;break;
case 0xe7: key=12;break;
case 0xd7: key=13;break;
case 0xb7: key=14;break;
case 0x77: key=15;break;
}
}
if(key<10)
{
if(fu==0)
{
xian[6]=xian[7];
xian[7]=key;
if(xian[6]==10)
{
num1=xian[7];
}
else
{
num1=xian[6]*10+xian[7];
}
}
else
{
xian[6]=xian[7];
xian[7]=key;
if(xian[6]==10)
{
num2=xian[7];
}
else
{
num2=xian[6]*10+xian[7];
}
}
}
if((11<key)&&(key<16))
{
xian[4]=10;
xian[5]=10;
xian[6]=10;
xian[7]=10;
fu=key;
}
if(key==10)
{
xian[4]=10;
xian[5]=10;
xian[6]=10;
xian[7]=10;
fu=0;
}
if(key==11)
{
switch(fu)
{
case 12: num=num1+num2;fu=0;break;
case 13: num=num1-num2;fu=0;break;
case 14: num=num1*num2;fu=0;break;
case 15: num=num1/num2;fu=0;break;
}
xian[4]=num/1000;
xian[5]=num%1000/100;
xian[6]=num%100/10;
xian[7]=num%10;
}
while(temp1!=0xf0)
{
P1=0xf0;
temp1=P1;
}
}
}
void main()
{
while(1)
{ key_scan();
display();
}
}
刚试过。可以
热心网友
时间:2023-11-08 13:49
#include <reg51.h>
#define uchar unsigned char
long First,End; //定义全局变量
void delay(int n) //***延时程序***//
{int i,j;
for(i=0;i<n;i++)
{for(j=0;j<50;j++)
;}
}
long add(long x,long y) //***加法程序***//
{long z;
z=x+y;
return(z);
}
long sub(long x,long y) //***减法程序***//
{long z;
if(x>=y)
z=x-y;
else
{z=y-x;
z=z+10e6;} //***最高位用1表示负数***//
return(z);
}
long mul(long x,long y) //***乘法程序***//
{long z;
z=x*y;
return(z);
}
long div(long x,long y) //***除法程序***//
{long z;
z=x/y;
return(z);
}
uchar kbscan(void) //***键盘扫描程序***//
{
uchar sccode;
P1=0xf0;
if((P1&0xf0)!=0xf0) //发全0行扫描码,列线输入
{ delay(222); //延时去抖
if((P1&0xf0)!=0xf0)
{sccode=0xfe; //逐行扫描初值
while((sccode&0x10)!=0)
{P1=sccode; //输出行扫描码
if((P1&0xf0)!=0xf0)
{
return(P1);} //如果检测到有键按下,返回键值
else
sccode=(sccode<<1)|0x01; //行扫描码左移一位
}
}
}
return(0); //无键按下,返回值为0
}
void display(void) //***显示程序***//
{int i;
uchar code rel[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管选通
uchar code led[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //定义0-9
uchar data num[8];
num[0]=First/10000000; //千万位
num[1]=First/1000000%10; //百万位
num[2]=First/100000%10; //十万位
num[3]=First/10000%10; //万位
num[4]=First/1000%10; //千位
num[5]=First/100%10; //百位
num[6]=First/10%10; //十位
num[7]=First%10; //个位
for(i=7;i>=0;i--)
{P3=rel[i]; //位选输出
P2=led[num[i]]; //数据输出
delay(2); //此延时必不可少?
}
}
void main(void) //***主程序***//
{ int k,n;
uchar f,g,key,gn1;
n=0;
f=0;
P0=0; //初始时指示灯灭
while(1) //不断查询是否有按键动作
{ key=kbscan(); //获取返回键值
if(key!=0)
{
switch(key) //译码,将对应按键返回值转换为相应数值
{
case 0xee: k=0;break;//0
case 0xde: k=1;break;//1
case 0xbe: k=2;break;//2
case 0x7e: k=3;break;//3
case 0xed: k=4;break;//4
case 0xdd: k=5;break;//5
case 0xbd: k=6;break;//6
case 0x7d: k=7;break;//7
case 0xeb: k=8;break;//8
case 0xdb: k=9;break;//9
case 0xbb: k=10;First=0;End=0;f=0;break;//清除
case 0x7b: k=11;break;//等于
case 0xe7: k=12;f=1;break;//加
case 0xd7: k=13;f=2;break;//减
case 0xb7: k=14;f=3;break;//乘
case 0x77: k=15;f=4;break;//除
}
P0=1;
delay(280); //有按键时,指示灯的显示时间
P0=0; //按键指示灭
if(k<10) //为数字键时(0-9)
{
if(f!=0) //为数字键时,如果已经有功能键按下
{
n++; //记录数字键所按次数
gn1=0; //清除标志,再次为功能键时进行运算
g=f; //保存运算标志
if(n==1) //输入为各位数时,直接赋值
First=k;
else if(n>1) //输入为多位数时,将它转化为10进制的多位数
First=First*10+k;
}
else //如果没有功能键按下
{
n++;
gn1=1; //定义标志,当下一次为功能键时,停止数据输入
if(n==1)
First=k;
else if(n>1)
First=First*10+k;
End=First; //将第一个数保存
}
}
else if(k>11) //为功能键时(+-*/)
{
if(gn1==1) //前一次数字键之后为功能键时
{
n=0; //清除计数标志
}
else //如果再次输入功能键,则进行运算
{n=0; //清除计数标志
switch(g)
{case 1: First=add(End,First);break;
case 2: First=sub(End,First);break;
case 3: First=mul(End,First);break;
case 4: First=div(End,First);break;}
}
End=First; //保存本次结果
}
else if(k==11) //为等于号时(=)
{n=0;
gn1=1; //接着输入为功能键时可以继续运算
switch(g)
{case 1: First=add(End,First);break;
case 2: First=sub(End,First);break;
case 3: First=mul(End,First);break;
case 4: First=div(End,First);break;
}
End=First; //保存最终运算结果
f=0; //清除运算标志
}
}
display(); //调用显示程序
}
}
这个吧!改些地方就能用
热心网友
时间:2023-11-08 13:49
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define an XBYTE[0x7fff]
#define wei XBYTE[0xbfff]
uchar key;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x7c,0x39,0x5e,0x79,0x71
};
uchar xian[8]={10,10,10,10,10,10,10,10
};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display()
{
uchar i;
for(i=0;i<8;i++)
{
wei=0xff;
an=~table[xian[i]];
wei=~(0x80>>i);
delay(2);
}
}
void key_scan()
{
uchar fu,num1,num2;
uint num;
uchar temp,temp1,temp2;
P1=0xf0;
temp1=P1;
if(temp1!=0xf0)
{
delay(10);
P1=0xf0;
temp1=P1;
if(temp1!=0xf0)
{
P1=0x0f;
temp2=P1;
temp=temp1|temp2;
switch(temp)
{
case 0xee: key=0;break;
case 0xde: key=1;break;
case 0xbe: key=2;break;
case 0x7e: key=3;break;
case 0xed: key=4;break;
case 0xdd: key=5;break;
case 0xbd: key=6;break;
case 0x7d: key=7;break;
case 0xeb: key=8;break;
case 0xdb: key=9;break;
case 0xbb: key=10;break;
case 0x7b: key=11;break;
case 0xe7: key=12;break;
case 0xd7: key=13;break;
case 0xb7: key=14;break;
case 0x77: key=15;break;
}
}
if(key<10)
{
if(fu==0)
{
xian[6]=xian[7];
xian[7]=key;
if(xian[6]==10)
{
num1=xian[7];
}
else
{
num1=xian[6]*10+xian[7];
}
}
else
{
xian[6]=xian[7];
xian[7]=key;
if(xian[6]==10)
{
num2=xian[7];
}
else
{
num2=xian[6]*10+xian[7];
}
}
}
if((11<key)&&(key<16))
{
xian[4]=10;
xian[5]=10;
xian[6]=10;
xian[7]=10;
fu=key;
}
if(key==10)
{
xian[4]=10;
xian[5]=10;
xian[6]=10;
xian[7]=10;
fu=0;
}
if(key==11)
{
switch(fu)
{
case 12: num=num1+num2;fu=0;break;
case 13: num=num1-num2;fu=0;break;
case 14: num=num1*num2;fu=0;break;
case 15: num=num1/num2;fu=0;break;
}
xian[4]=num/1000;
xian[5]=num%1000/100;
xian[6]=num%100/10;
xian[7]=num%10;
}
while(temp1!=0xf0)
{
P1=0xf0;
temp1=P1;
}
}
}
void main()
{
while(1)
{ key_scan();
display();
}
}
刚试过。可以