计算器__C51源程序_第1页
计算器__C51源程序_第2页
计算器__C51源程序_第3页
计算器__C51源程序_第4页
计算器__C51源程序_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit rs=P00;sbit rw=P01;sbit e=P02;sbit k0=P10;sbit k1=P11;sbit k2=P12;sbit k3=P13;sbit k4=P14;sbit k5=P15;sbit k6=P16;sbit k7=P17;unsigned char code digit ="0123456789" /定义字符数组显示数字unsigned char s,m,h,day,month,ye

2、ar,count;void write_dat(uchar dat); void write_com(uchar com);void keyscan();/* 功能说明:显示编码,加上0x30,分别为'1','2','3','+','4','5','6','-',等*/uchar code table1=1,2,3,0x2b-0x30,4,5,6,0x2d-0x30,7,8,9,0x2a-0x30,0,0x3d-0x30,0x01-0x30,0x2f-0x30;uch

3、ar k=0,flag=0,num,fuhao,i;long a,b,c;void delay(uint z) uint x,y; for(x=z;x>0;x-) for(y=110;y>0;y-);/*函数功能:指定字符显示的实际地址入口参数:x*/ void WriteAddress(unsigned char x) write_com(x|0x80); /显示位置的确定方法规定为"80H+地址码x" /* 函数功能:显示小时 */void DisplayHour() unsigned char i,j;i=h/10; /取整运算,求得十位数字j=h%10;

4、 /取余运算,求得各位数字 WriteAddress(0x45); /写显示地址,将十位数字显示在第2行第0列 write_dat(digiti); /将十位数字的字符常量写入LCD write_dat(digitj); /将个位数字的字符常量写入LCD /* 函数功能:显示分钟 */void DisplayMinute() unsigned char i,j; i=m/10; /取整运算,求得十位数字j=m%10; /取余运算,求得各位数字 WriteAddress(0x48); /写显示地址,将十位数字显示在第2行第3列 write_dat(digiti); /将十位数字的字符常量写入LC

5、D write_dat(digitj); /将个位数字的字符常量写入LCD /* 函数功能:显示秒 */void DisplaySecond() unsigned char i,j; i=s/10; /取整运算,求得十位数字j=s%10; /取余运算,求得各位数字 WriteAddress(0x4b); /写显示地址,将十位数字显示在第2行第6列 write_dat(digiti); /将十位数字的字符常量写入LCD write_dat(digitj); /将个位数字的字符常量写入LCD /* 函数功能:显示小时 */void DisplayYear() unsigned char i,j;i

6、=year/10; /取整运算,求得十位数字j=year%10; /取余运算,求得各位数字 WriteAddress(0x07); /写显示地址,将十位数字显示在第2行第0列 write_dat(digiti); /将十位数字的字符常量写入LCD write_dat(digitj); /将个位数字的字符常量写入LCD /* 函数功能:显示分钟 */void DisplayMonth() unsigned char i,j; i=month/10; /取整运算,求得十位数字j=month%10; /取余运算,求得各位数字 WriteAddress(0x0a); /写显示地址,将十位数字显示在第2

7、行第3列 write_dat(digiti); /将十位数字的字符常量写入LCD write_dat(digitj); /将个位数字的字符常量写入LCD /* 函数功能:显示秒 */void DisplayDay() unsigned char i,j; i=day/10; /取整运算,求得十位数字j=day%10; /取余运算,求得各位数字 WriteAddress(0x0d); /写显示地址,将十位数字显示在第2行第6列 write_dat(digiti); /将十位数字的字符常量写入LCD write_dat(digitj); /将个位数字的字符常量写入LCD void keyscan2

8、()if(k0=0) delay(5); if(k0=0) s+; if(s=60) s=0; if(k1=0) delay(5); if(k1=0) m+; if(m=60) m=0; if(k2=0) delay(5); if(k2=0) h+; if(h=60) h=0; if(k3=0) delay(5); if(k3=0) day+; if(day=30) day=0; if(k4=0) delay(5); if(k4=0) month+; if(month=13) month=0; if(k5=0) delay(5); if(k5=0) year+; if(year=99) yea

9、r=0; void keyscan() uchar temp; 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=0; break; case 0xde:num=1; break; case 0xbe:num=2; break; case 0x7e:num=3; break; while(temp!=0xf0) temp=P3; temp=temp&

10、amp;0xf0; /*当按下1,2,3,松手后执行下面这段语句*/ if(num=0|num=1|num=2) if(flag=0) a=a*10+table1num;/如果没有按符号键,符号前的数值为a else if(flag=1) b=b*10+table1num; /如果按了符号键,符号后的数值为b if(k=1) /如果之前按了'='号,再按键时清屏,进行下一次计算 k=0; write_com(0x01); else if(num=3) /判断按下'+' flag=1; fuhao=1; i=table1num; /显示按下的键 write_dat

11、(0x30+i); 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=4; break; case 0xdd:num=5; break; case 0xbd:num=6; break; case 0x7d:num=7; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; if(num=4|num

12、=5|num=6) /判断是否按下'4','5','6' if(k=1) k=0; write_com(0x01); if(flag=0) a=a*10+table1num; else if(flag=1) b=b*10+table1num; else if(num=7) flag=1; fuhao=2; i=table1num; /显示按下的键 write_dat(0x30+i); P3=0xfb; temp=P3; temp=temp&0xf0; while(temp!=0xf0) delay(5); temp=P3; temp=te

13、mp&0xf0; while(temp!=0xf0) temp=P3; switch(temp) / case 0xeb:num=8; break; case 0xdb:num=9; break; case 0xbb:num=10; break; case 0x7b:num=11; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; if(num=8|num=9|num=10) /判断是否按下'7','8','9' if(k=1) k=0; write_com(0x01); if(f

14、lag=0) a=a*10+table1num; else if(flag=1) b=b*10+table1num; else if(num=11) /判断是否按下'*' flag=1; fuhao=3; i=table1num; write_dat(0x30+i); 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:num=12; / 0键

15、 break; case 0xd7:num=13; / '=' break; case 0xb7:num=14; /清零键 break; case 0x77:num=15; /'/' break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; switch(num) case 12: if(k=1) k=0; write_com(0x01); if(flag=0) a=a*10; else if(flag=1) b=b*10; write_dat(0x30); break; case 13: /按=键 k=1; i

16、f(fuhao=1) /如果符号键是+,执行+运算 write_com(0x80+0x4f); write_com(0x04); c=a+b; while(c!=0) write_dat(0x30+c%10); c=c/10; write_dat(0x3d); fuhao=0; a=0;b=0;flag=0; if(fuhao=2) write_com(0x80+0x4f); write_com(0x04); if(a>=b) c=a-b; while(c!=0) write_dat(0x30+c%10); c=c/10; else if(a<b) c=b-a; while(c!=

17、0) write_dat(0x30+c%10); c=c/10; write_dat(0x2d); write_dat(0x3d); a=0;b=0;flag=0;fuhao=0; if(fuhao=3) /如果符号键是* write_com(0x80+0x4f); write_com(0x04); c=a*b; while(c!=0) write_dat(0x30+c%10); c=c/10; write_dat(0x3d); a=0;b=0;flag=0;fuhao=0; if(fuhao=4) /如果符号键是/ i=0; write_com(0x80+0x4f); write_com(0

18、x04); c=(long)(float)a/b)*1000000); /结果保留6位小数 while(c!=0) write_dat(0x30+c%10); c=c/10; i+; if(i=6) / 显示完六位小数后,显示· write_dat(0x2e); if(a/b<=0) write_dat(0x30); write_dat(0x3d); a=0;b=0;flag=0;fuhao=0; break; case 14: write_com(0x01); a=0;b=0;flag=0;fuhao=0; break; case 15: flag=1; fuhao=4; w

19、rite_dat(0x30+table1num); break; /*led1602*/void write_com(uchar com) rs=0;/选择写指令 rw=0; P2=com; e=1; delay(5);/无延时不能正常工作 e=0;void write_dat(uchar dat) rs=1;/选择写数据 rw=0; P2=dat; e=1; delay(5);/无延时不能正常工作 e=0;void init() /初始化 delay(15); write_com(0x38); delay(6); write_com(0x38); delay(6); write_com(0x

20、38); write_com(0x38); write_com(0x0c); /开显示,关光标 write_com(0x06);/光标移动 设置 write_com(0x01);/清屏 void geshi() WriteAddress(0x00); write_dat('D'); WriteAddress(0x01); write_dat('a'); WriteAddress(0x02); write_dat('t'); /将分号的字符常量写入LCD WriteAddress(0x03); write_dat('e'); Wri

21、teAddress(0x04); write_dat(':'); WriteAddress(0x05); write_dat('2');WriteAddress(0x06); write_dat('0'); WriteAddress(0x09); write_dat('-'); WriteAddress(0x0c); write_dat('-'); WriteAddress(0x40); write_dat('T'); WriteAddress(0x41); write_dat('i'

22、;); WriteAddress(0x42); write_dat('m'); WriteAddress(0x43); /写地址,将第二个分号显示在第2行第7列write_dat('e'); /将分号的字符常量写入LCDWriteAddress(0x44); /写地址,将第二个分号显示在第2行第10列write_dat(':'); /将分号的字符常量写入LCD WriteAddress(0x47); write_dat(':'); WriteAddress(0x4a); write_dat(':'); void m

23、ain() init();TMOD=0x01; /使用定时器T0的模式1TH0=(65536-46083)/256; /定时器T0的高8位设置初值TL0=(65536-46083)%256; /定时器T0的低8位设置初值EA=1; /开总中断ET0=1; /定时器T0中断允许TR0=1; /启动定时器T0count=0; /中断次数初始化为0s=0; /秒初始化为0m=0; /分钟初始化为0h=0; /小时初始化为0year=0;month=0;day=0; while(1) keyscan(); if(k6=0) k6=0; write_com(0x01); while(1)keyscan2

24、(); geshi(); delay(5); DisplayHour(); delay(5); DisplayMinute(); delay(5); DisplaySecond(); delay(5); DisplayYear();delay(5); DisplayMonth(); delay(5); DisplayDay();delay(5); if(k7=0) k6=1; write_com(0x01); break; /*函数功能:定时器T0的中断服务函数*/ void Time0(void ) interrupt 1 using 1 /定时器T0的中断编号为1,使用第1组工作寄存器 c

25、ount+; /每产生1次中断,中断累计次数加1 if(count=20) /如果中断次数计满20次 count=0; /中断累计次数清0 s+; /秒加1 if(s=60) /如果计满60秒 s=0; /秒清0 m+; /分钟加1 if(m=60) /如果计满60分 m=0; /分钟清0 h+; /小时加1 if(h=24) h=0; day+; if(day=30) day=0; month+; if(month=13) month=0; year+; if(year=99) year=0; TH0=(65536-46083)/256; /定时器T0高8位重新赋初值 TL0=(65536-

26、46083)%256; /定时器T0低8位重新赋初值 #include "reg52.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#define uchar unsigned char#define uint unsigned intsbit choose=P34; /时钟和计算器切换sbit buzz=P00;sbit lcdrs=P37;sbit lcdrw=P36;sbit lcden=P35;bit idata f

27、orm;uchar idata state;sbit reset=P30;/复位sbit back=P31;/撤销sbit save=P32;/存储bit idata eqsign;bit idata press;bit idata savesign;bit idata sc;uchar idata process30,proc;uchar idata continu=0;uchar idata pai22;uchar idata ferror;uchar idata ywei; uchar idata count=0;uchar idata count_num=0;uchar idata r

28、esult15;uchar idatasaveresult15;uchar idata jieguo15;uchar idatabdate24;uchar idata on_symbol;uchar idata fsym2;uchar idata ssym2;uchar idata bfun2;uchar idata futojiao2;double idata date2;double idata resultdate;sbit stime=P33;/时间设置uchar idata ms50=0;uchar idata s=0;uchar idata m=0;uchar idata h=0;

29、void delay(uchar z);void write_com(uchar com);void write_date(uchar date);void read_date(void);void write_str(uchar *str);void init(void);void shift(void);uchar keyscan(void);void fuwei(void);void callerror(void);void huifu(void);uchar funqian(void);void cullars(uchar);char memory(void);void process

30、_date(uchar press_date);void calculator(uchar press_date);void settime(void);void Timer0(void);void time(void);void delay(uchar z)uchar x,y;for(x=z;x>0;x-) for(y=200;y>0;y-);void bell(void)buzz=0;delay(100);buzz=1;void write_com(uchar com)lcdrs=0;lcdrw=0;lcden=0;P1=com;delay(5);lcden=1;delay(5

31、); lcden=0;void write_date(uchar date)lcdrs=1;lcdrw=0;lcden=0;P1=date;delay(5);lcden=1;delay(5);lcden=0;void read_date(void)lcdrs=0;lcdrw=1;delay(5);P1=0XFF;lcden=1;delay(5);state=P1;delay(5);lcden=0;delay(5);state=state&127;void write_str(uchar *str)uchar idata i;for(i=0;stri!='0'i+)wri

32、te_date(stri);void init(void)write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);void shift(void)if(sc=1)read_date();write_com(0xc0);write_date('f');write_com(state+0x80);elseread_date();write_com(0xc0);write_date(' ');write_com(state+0x80);return;uchar keyscan(void)uchar

33、 idata key0,key1,keyment=0;P2=0X0FE;key0=P2;key0=key0&0x0f0;key1=key0;if(key0!=0xf0)delay(5);P2=0X0FE;key0=P2;key0=key0&0xf0;if(key0=key1)switch(key0)case 0xe0:keyment='7'bell();break;case 0xd0:keyment='8'bell();break;case 0xb0:keyment='9'bell();break;case 0x70:keyment=0xfd;bell();break;while(key0!=0x0f0) key0=P2; key0=key0&0x0f0; press=1; return(keyment); P2=0X0FD; key0=P2; key0=key0&0x0f0; key1=key0; if(key0!=0x0f0) delay(5); P2=0X0Fd; key0=P2; key0=key0&0xf0; if(key0=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论