- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单片机计算器讲述
#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; //按键计数,符号标示
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; //蜂鸣器标志位
bit sqrtflag1=0; //开方1标志位
bit sqrtflag2=0; //开方2标志位
sbit keybeep=P3^3; //蜂鸣器开关按键
sbit beep=P2^7; //蜂鸣器控制口
sbit keysqrt=P3^4; //开方按键
sbit keypow=P3^5; //任意次方按键
sbit LCDRS=P2^0;
sbit LCDRW=P2^1;
sbit LCDEN=P2^2;
uchar keyscan();
void maininit(void);
//附4:LCD1602显示程序
//#includereg52.h
//#includelcd1602_8.h
//#includemath.h
//延时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);
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);
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);
}
//显示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);
return;
}
if(n0)
{
lcdwrite_data(-);
n=0-n;
}
nx=n;
for(j=0;j8;j++)
{
if(nx=1)
length++;
nx/=10;
}
nx=n;
for(;length0;length--)
{
a[length-1]=nx%10+0x30;
nx/=10;
}
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(n0)
{
lcdwrite_data(-);
n=0-n;
}
nxtemp=n;
n=n;//+0.000002;
lcdwrite_num(nxtemp);
if((n-nxtemp)0.000
文档评论(0)