单片机计算器
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EA=1; //开全局中断
}
//清零中断程序
void EX0_int() interrupt 0
{
if(beepflag==1) //若开声音则每一次按键均鸣叫
{
beep=0;
delayms(100);
beep=1;
}
lcdwrite_com(0x01); //显示清屏
lcd_setxy(0,0);
}
//显示1位数字
void lcdwrite_num1(uint n)
{
lcdwrite_data(n+48);
}
//显示任意位数字
void lcdwrite_num(long n)
{
uchar length=0,j,a[8]={0,0,0,0,0,0,0,0};
long nx;
if(n==0)
{
lcdwrite_data('0');
lcdwrite_com(0x06); //设置光标移动方向增量方式,并指定显示不移动。
//lcdwrite_com(0x05); //设置光标移动方向减量方式,并指定显示移动。(光标不移动而整个屏幕移动)
//lcdwrite_com(0x07); //(当写一个字符,整屏显示左移)
}
//初始化程序
lcdwrite_data(nxtemp/10000000+0x30); //显示第7位小数
if((nxtemp%1000000%100000%10000%1000%100/10!=0)||(nxtemp%1000000%100000%10000%1000/100!=0)||(nxtemp%1000000%100000%10000/1000!=0)||(nxtemp%1000000%100000/10000!=0)||(nxtemp%1000000/100000!=0))
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num='-';
break;
case 0xdd:num=3;
break;
case 0xbd:num=2;
break;
case 0x7d:num=1;
break;
}
while(temp!=0xf0)
{
temp=P1;
return;
}
if(n<0)
{
lcdwrite_data('-');
n=0-n;
}
nx=n;
for(j=0;j<8;j++)
{
if(nx>=1)
length++;
nx/=10;
}
nx=n;
for(;length>0;length--)
{
a[length-1]=nx%10+0x30;
nx/=10;
}
lcdwrite_data(nxtemp%1000000%100000/10000+0x30); //显示第5位小数
if((nxtemp%1000000%100000%10000%1000%100/10!=0)||(nxtemp%1000000%100000%10000%1000/100!=0)||(nxtemp%1000000%100000%10000/1000!=0))
n=0-n;
}
nxtemp=n;
n=n;//+0.000002;
lcdwrite_num(nxtemp);
if((n-nxtemp)>0.000009)
{
lcdwrite_data('.');
n=(n-nxtemp)*10000000;
// n=n-1;
nxtemp=n;
//if(nxtemp%10!=0)
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0) //扫描列
{
delayms(10);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num='/';
break;
case 0xd7:num=9;
{
beepflag=~beepflag;
if(beepflag==1) //若开声音则每一次按键均鸣叫
{
beep=0;
delayms(100);
beep=1;
}
}
//按键扫描程序
uchar keyscan()
{
num='N'; //若没有按下任何按键,则返回‘N’
P1=0xfe; //扫描第一行
temp=P1;
break;
case 0xb7:num=8;
break;
case 0x77:num=7;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0; //等待松手
}
}
}
if(keypow==0)
{
delayms(5);
if(keypow==0)
{
//powflag=1;
lcdwrite_data('0');
lcd_setxy(0,0);
num='N'; //数字初始化
keynum1=0,keynum2=0,sign=0;
ans1=0,ans2=0,ans=0,point=0;
conflag=0,newcalc=0;
ac=1;
}
//声音中断程序
void EX1_int() interrupt 2
lcdwrite_data(nxtemp%1000000/100000+0x30); //显示第6位小数
if((nxtemp%1000000%100000%10000%1000%100/10!=0)||(nxtemp%1000000%100000%10000%1000/100!=0)||(nxtemp%1000000%100000%10000/1000!=0)||(nxtemp%1000000%100000/10000!=0))
void maininit(void)
{
delayms(100); //等待液晶初始化
lcd_init();
lcd_setxy(0,0);
lcdwrite_data('0');
lcd_setxy(0,0);
IT0=1; //下降沿触发
EX0=1; //开外部中断0
IT1=1; //下降沿触发
EX1=1; //开外部中断1
//延时1ms程序
void delayms(uint x) //12M延时1ms
{
unsigned int TempMS=x*110;
while(TempMS--);
}
//写命令
void lcdwrite_com(uchar i)
{
P0=i;
LCDRS=0;
LCDRW=0;
LCDEN=0;
delayms(1);
bit sqrtflag1=0; //开方1标志位
bit sqrtflag2=0; //开方2标志位
sbit keybeep=P3^3; //蜂鸣器开关按键
sbit beep=P2^7; //蜂鸣器控制口
sbit keysqrt=P3^4; //开方按键
sbit keypow=P3^5; //任意次方按键
uchar num1[8]={0},num2[8]={0}; //按键存储数组
float ans1=0,ans2=0,ans=0,point=0; //运算数据
bit conflag=0; //继续运算标志位
bit newcalc=0; //新运算标志位
bit ac=0; //清零标志,1为清零
bit beepflag=0; //蜂鸣器标志位
sbit LCDRS=P2^0;
sbit LCDRW=P2^1;
sbit LCDEN=P2^2;
uchaபைடு நூலகம் keyscan();
void maininit(void);
//附4:LCD1602显示程序
//#include<reg52.h>
//#include"lcd1602_8.h"
//#include<math.h>
num='^';
}
while(keypow==0); //扫描多次方按键
delayms(5);
while(keypow==0);
temp=temp&0xf0; //等待松手
}
}
}
P1=0xfb; //扫描第三行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0) //扫描列
{
delayms(10);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
lcdwrite_data(nxtemp%1000000%100000%10000/1000+0x30); //显示第4位小数
if((nxtemp%1000000%100000%10000%1000%100/10!=0)||(nxtemp%1000000%100000%10000%1000/100!=0))
delayms(5);
lcdwrite_com(0x38); //设置成1602显示
delayms(5);
lcdwrite_com(0x38); //设置成1602显示
delayms(5);
//lcdwrite_com(0x0f); //开显示0x0e显示开,光标开
lcdwrite_com(0x0c); //显示开
temp=temp&0xf0;
while(temp!=0xf0) //扫描列
{
delayms(10);
temp=P1;
switch(temp)
{
case 0xee:num='+';
break;
case 0xde:num='=';
break;
case 0xbe:num='.';
break;
case 0x7e:num=0;
lcdwrite_data(nxtemp%1000000%100000%10000%1000/100+0x30); //显示第3位小数
if(nxtemp%1000000%100000%10000%1000%100/10!=0)
lcdwrite_data(nxtemp%1000000%100000%10000%1000%100/10+0x30); //显示第2位小数
#include "reg52.h"
#include "math.h"
//#include "lcd1602_8.h"
#define uint unsigned int
#define uchar unsigned char
uint temp , num; //键盘扫描数值
uchar keynum1=0,keynum2=0,sign=0,i=0,j=0; //按键计数,符号标示
{
case 0xeb:num='*';
break;
case 0xdb:num=6;
break;
case 0xbb:num=5;
break;
case 0x7b:num=4;
break;
}
while(temp!=0xf0) //等待松手
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7; //扫描第四行
lcdwrite_string(a);
}
//显示7位小数
void lcdwrite_float(float n)
{
uchar i=0;
uint j=0;
long nxtemp;
if(n==0)
{
lcdwrite_data('0');
return;
}
if(n<0)
{
lcdwrite_data('-');
//lcdwrite_data(nxtemp%10+0x30); //显示第1位小数
}
else return;
}
//初始化液晶
void lcd_init(void)
{
lcdwrite_com(0x01); //显示清屏
lcdwrite_com(0x01); //显示清屏
lcdwrite_com(0x38); //设置成1602显示
LCDEN=1;
}
//写数据
void lcdwrite_data(uchar i)
{
P0=i;
LCDRS=1;
LCDRW=0;
LCDEN=0;
delayms(1);
LCDEN=1;
}
//写字符串
void lcdwrite_string(uchar *s)
{
while(*s)
{
lcdwrite_data(*s);
break;
}
while(temp!=0xf0) //等待松手
{
temp=P1;
temp=temp&0xf0;
}
}
P1=0xfd; //扫描第二行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0) //扫描列
{
delayms(10);
temp=P1;
temp=temp&0xf0;
s++;
}
}
//设置lcd光标值
void lcd_setxy(uchar x,uchar y)
{
uchar address;
y&=0x0f;
if(!x)
address=0x80+y; // 0在第一行
else
address=0xc0+y; // 1在第二行
lcdwrite_com(address);
}
//清零中断程序
void EX0_int() interrupt 0
{
if(beepflag==1) //若开声音则每一次按键均鸣叫
{
beep=0;
delayms(100);
beep=1;
}
lcdwrite_com(0x01); //显示清屏
lcd_setxy(0,0);
}
//显示1位数字
void lcdwrite_num1(uint n)
{
lcdwrite_data(n+48);
}
//显示任意位数字
void lcdwrite_num(long n)
{
uchar length=0,j,a[8]={0,0,0,0,0,0,0,0};
long nx;
if(n==0)
{
lcdwrite_data('0');
lcdwrite_com(0x06); //设置光标移动方向增量方式,并指定显示不移动。
//lcdwrite_com(0x05); //设置光标移动方向减量方式,并指定显示移动。(光标不移动而整个屏幕移动)
//lcdwrite_com(0x07); //(当写一个字符,整屏显示左移)
}
//初始化程序
lcdwrite_data(nxtemp/10000000+0x30); //显示第7位小数
if((nxtemp%1000000%100000%10000%1000%100/10!=0)||(nxtemp%1000000%100000%10000%1000/100!=0)||(nxtemp%1000000%100000%10000/1000!=0)||(nxtemp%1000000%100000/10000!=0)||(nxtemp%1000000/100000!=0))
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num='-';
break;
case 0xdd:num=3;
break;
case 0xbd:num=2;
break;
case 0x7d:num=1;
break;
}
while(temp!=0xf0)
{
temp=P1;
return;
}
if(n<0)
{
lcdwrite_data('-');
n=0-n;
}
nx=n;
for(j=0;j<8;j++)
{
if(nx>=1)
length++;
nx/=10;
}
nx=n;
for(;length>0;length--)
{
a[length-1]=nx%10+0x30;
nx/=10;
}
lcdwrite_data(nxtemp%1000000%100000/10000+0x30); //显示第5位小数
if((nxtemp%1000000%100000%10000%1000%100/10!=0)||(nxtemp%1000000%100000%10000%1000/100!=0)||(nxtemp%1000000%100000%10000/1000!=0))
n=0-n;
}
nxtemp=n;
n=n;//+0.000002;
lcdwrite_num(nxtemp);
if((n-nxtemp)>0.000009)
{
lcdwrite_data('.');
n=(n-nxtemp)*10000000;
// n=n-1;
nxtemp=n;
//if(nxtemp%10!=0)
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0) //扫描列
{
delayms(10);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num='/';
break;
case 0xd7:num=9;
{
beepflag=~beepflag;
if(beepflag==1) //若开声音则每一次按键均鸣叫
{
beep=0;
delayms(100);
beep=1;
}
}
//按键扫描程序
uchar keyscan()
{
num='N'; //若没有按下任何按键,则返回‘N’
P1=0xfe; //扫描第一行
temp=P1;
break;
case 0xb7:num=8;
break;
case 0x77:num=7;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0; //等待松手
}
}
}
if(keypow==0)
{
delayms(5);
if(keypow==0)
{
//powflag=1;
lcdwrite_data('0');
lcd_setxy(0,0);
num='N'; //数字初始化
keynum1=0,keynum2=0,sign=0;
ans1=0,ans2=0,ans=0,point=0;
conflag=0,newcalc=0;
ac=1;
}
//声音中断程序
void EX1_int() interrupt 2
lcdwrite_data(nxtemp%1000000/100000+0x30); //显示第6位小数
if((nxtemp%1000000%100000%10000%1000%100/10!=0)||(nxtemp%1000000%100000%10000%1000/100!=0)||(nxtemp%1000000%100000%10000/1000!=0)||(nxtemp%1000000%100000/10000!=0))
void maininit(void)
{
delayms(100); //等待液晶初始化
lcd_init();
lcd_setxy(0,0);
lcdwrite_data('0');
lcd_setxy(0,0);
IT0=1; //下降沿触发
EX0=1; //开外部中断0
IT1=1; //下降沿触发
EX1=1; //开外部中断1
//延时1ms程序
void delayms(uint x) //12M延时1ms
{
unsigned int TempMS=x*110;
while(TempMS--);
}
//写命令
void lcdwrite_com(uchar i)
{
P0=i;
LCDRS=0;
LCDRW=0;
LCDEN=0;
delayms(1);
bit sqrtflag1=0; //开方1标志位
bit sqrtflag2=0; //开方2标志位
sbit keybeep=P3^3; //蜂鸣器开关按键
sbit beep=P2^7; //蜂鸣器控制口
sbit keysqrt=P3^4; //开方按键
sbit keypow=P3^5; //任意次方按键
uchar num1[8]={0},num2[8]={0}; //按键存储数组
float ans1=0,ans2=0,ans=0,point=0; //运算数据
bit conflag=0; //继续运算标志位
bit newcalc=0; //新运算标志位
bit ac=0; //清零标志,1为清零
bit beepflag=0; //蜂鸣器标志位
sbit LCDRS=P2^0;
sbit LCDRW=P2^1;
sbit LCDEN=P2^2;
uchaபைடு நூலகம் keyscan();
void maininit(void);
//附4:LCD1602显示程序
//#include<reg52.h>
//#include"lcd1602_8.h"
//#include<math.h>
num='^';
}
while(keypow==0); //扫描多次方按键
delayms(5);
while(keypow==0);
temp=temp&0xf0; //等待松手
}
}
}
P1=0xfb; //扫描第三行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0) //扫描列
{
delayms(10);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
lcdwrite_data(nxtemp%1000000%100000%10000/1000+0x30); //显示第4位小数
if((nxtemp%1000000%100000%10000%1000%100/10!=0)||(nxtemp%1000000%100000%10000%1000/100!=0))
delayms(5);
lcdwrite_com(0x38); //设置成1602显示
delayms(5);
lcdwrite_com(0x38); //设置成1602显示
delayms(5);
//lcdwrite_com(0x0f); //开显示0x0e显示开,光标开
lcdwrite_com(0x0c); //显示开
temp=temp&0xf0;
while(temp!=0xf0) //扫描列
{
delayms(10);
temp=P1;
switch(temp)
{
case 0xee:num='+';
break;
case 0xde:num='=';
break;
case 0xbe:num='.';
break;
case 0x7e:num=0;
lcdwrite_data(nxtemp%1000000%100000%10000%1000/100+0x30); //显示第3位小数
if(nxtemp%1000000%100000%10000%1000%100/10!=0)
lcdwrite_data(nxtemp%1000000%100000%10000%1000%100/10+0x30); //显示第2位小数
#include "reg52.h"
#include "math.h"
//#include "lcd1602_8.h"
#define uint unsigned int
#define uchar unsigned char
uint temp , num; //键盘扫描数值
uchar keynum1=0,keynum2=0,sign=0,i=0,j=0; //按键计数,符号标示
{
case 0xeb:num='*';
break;
case 0xdb:num=6;
break;
case 0xbb:num=5;
break;
case 0x7b:num=4;
break;
}
while(temp!=0xf0) //等待松手
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7; //扫描第四行
lcdwrite_string(a);
}
//显示7位小数
void lcdwrite_float(float n)
{
uchar i=0;
uint j=0;
long nxtemp;
if(n==0)
{
lcdwrite_data('0');
return;
}
if(n<0)
{
lcdwrite_data('-');
//lcdwrite_data(nxtemp%10+0x30); //显示第1位小数
}
else return;
}
//初始化液晶
void lcd_init(void)
{
lcdwrite_com(0x01); //显示清屏
lcdwrite_com(0x01); //显示清屏
lcdwrite_com(0x38); //设置成1602显示
LCDEN=1;
}
//写数据
void lcdwrite_data(uchar i)
{
P0=i;
LCDRS=1;
LCDRW=0;
LCDEN=0;
delayms(1);
LCDEN=1;
}
//写字符串
void lcdwrite_string(uchar *s)
{
while(*s)
{
lcdwrite_data(*s);
break;
}
while(temp!=0xf0) //等待松手
{
temp=P1;
temp=temp&0xf0;
}
}
P1=0xfd; //扫描第二行
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0) //扫描列
{
delayms(10);
temp=P1;
temp=temp&0xf0;
s++;
}
}
//设置lcd光标值
void lcd_setxy(uchar x,uchar y)
{
uchar address;
y&=0x0f;
if(!x)
address=0x80+y; // 0在第一行
else
address=0xc0+y; // 1在第二行
lcdwrite_com(address);