用8051与1601LCD设计的整数计算器.doc_第1页
用8051与1601LCD设计的整数计算器.doc_第2页
用8051与1601LCD设计的整数计算器.doc_第3页
用8051与1601LCD设计的整数计算器.doc_第4页
用8051与1601LCD设计的整数计算器.doc_第5页
免费预览已结束,剩余5页可下载查看

下载本文档

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

文档简介

/-Main.c-/名称:用8051与1601LCD设计的整数计算器/-#include #include #include calc.hstatic data long lvalue;static data long rvalue;static data char currtoken;static data char lasttoken;static data char lastpress;static xdata char outputbufferMAX_DISPLAY_CHAR;/输出缓冲/-/主程序/-void main()/变量初始化lvalue=0;rvalue=0;currtoken=;lasttoken=;/初始化LCDinitialise();calc_putput(OK);calc_evaluate();/-/获取按键值并进行计算处理/-void calc_evaluate()char data key;int data i;char xdata numberMAX_DISPLAY_CHAR;char xdata *bufferptr;/清除缓冲for(i=0;i=MAX_DISPLAY_CHAR;i+) numberi= ;bufferptr=number;while(1)key=calc_getkey();if(calc_testkey(key)if(bufferptr!=&numberMAX_DISPLAY_CHAR-2)*bufferptr=key;calc_display(number);bufferptr+;elseif(lasttoken=0) lvalue=calc_asciidec(number);elservalue=calc_asciidec(number);/清除数字蝗虫bufferptr=number;for(i=0;i=MAX_DISPLAY_CHAR;i+)numberi= ;/处理操作符currtoken=key;if(currtoken=C)calc_opfunctions(currtoken);elsecalc_opfunctions(lasetoken);/清除输出缓冲for(i=0;i=-99999999&num=99999999)return OK;else return ERROR;/-/ 根据操作状态输出/-switch(status)case OK:calc_deaplay(calc_decascii(lvalue);break;case SLEEP: break;case ERROR:calc_display(Exception);break;default:calc_display(Exception)break;/-/将ASCII字符串转换为浮点数/-long calc_asciidec (char *buffer)long data value;long data digit;value=0;while(*buffer!= )digit=*buffer-0;value=value*10+digit;buffer+return value;/-/将浮点数转换为ASCII字符串/-char *calc_decascii(long num)long data temp=num;char xdata *avvayptr=&outputbufferMAX_DISPLAY_CHAR;long data divisor=10;long data result;char data remainder,asciival;int data i;/如果计算结果为0。,则在缓冲中插入0并结束if(!temp)*arrayptr=0;goto done;if(temp0) /处理负数outputbuffer0=-;temp-=2*temp;for(i=0;isizeof(outputbuffer);i+)remainber=temp%divisor;result=temp/divisor;if(!remainder)&(!result)*arrayptr= ;elseasciival=remainder+0;*arrayptr=asciival;temp/=10;/为“”号保留位置if(arrayptr!=&outputbuffer1)arrayptr-;done:return outputbuffer;/-/测试按键时数字还是操作符,如果是数字则返回1.是操作符时返回0/-char calc_testkey (char key)if(isdigit(key)return 1;elseteturn 0;/-/调用input例程搜索按键,并返回按键的ASCII码值/-char calc_getkey()char data mykey;domykey=input();while(mykey=0);return mykey;/-/调用Output和Clearscreen例程向LCD输出ASCII/-void calc_display (char bufMAX_DISPLAY_CHAR)int data i=0;clearscreen();for(i;i=MAX_DISPLAY_CHAR;i+)if(bufi!= )output(bufi);/-calc.h-/本例头文件/-typedef unsigned short WORD;typedef unsigned char BYTE;/-/定义适合屏幕显示的ASCII字符的最大个数/-#define MAX_DISPLAY_CHAR 9/-/错误处理状态/-enum ERROR OK=0,SLEEP=1,ERROR=2;/-/函数声明/-void calc_evaluate();void calc_opfunctions (char token);char calc_testkey (char ch);long calc_asciidec (char *buffer);char *calc_decascii (long num);int calc_chkerror (long num);void calc_output (int status);char calc_getkey();void calc_display(char bufMAX_DISPLAY_CHAR);void initialise();char input();char output(char ch);void clearscreen;/-lcd.c-/单行液晶显示程序/-#include#include#define uchar unsigned char#define LCD_CMD_WR 0x00#define LCD_DATA_WWR 0x01#define LCD_BUSY_RD 0x02#define LCD_DATA_RD 0x03#define LCD_PAGE 0x80#define LCD_CLS 1#define LCD_HOME 2#define LCD_SETMODE 4#define LCD_SETVISIBLE 8#define LCD_SHIFT 16#define LCD_SETFUNCTION 32#define LCD_SETCGADDR 64#define LCD_SETDDADDR 128sbit bflag=ACC7;/忙标志位void wrcmd(uchar);void output(char);void busywait();/-/初始化LCD/-void initialise()wrcmd(0x30); /1行8位wrcmd(LCD_SETVISIBLE+4); /显示开,关光标wrcmd(LCD_SETDDADDR+15); /从右边开始显示wrcmd(LCD_SETMODE+3); / 递增左移/-/清屏并将显示位置起点设置在最右边/-void clearscreen()wrcmd(LCD_CLS); wrcmd(LCD_SETDDADDR+15); /-/向LCD写命令/-void wrcmd(uchar cmd)uchar volatile pdata *p=LCD_CMD_WR;P2=LCD_PAGE;*p=cmd;/上面三行可用下面的代码替换/XBYTE0x8000=cmd;busywait();/-/向LCD写一个字符/-void output(char ch)char volatile pdata *p=LCD_DATA_WR;P2=LCD_PAGE;*p=ch;/上面三行可用下面的代码替换/XBYTE0x8001=ch;busywait();/-/忙等待/-void busywait()uchar volatile pdata *p=LCD_BUSY_RD;P2=LCD_PAGE;/上面两行可改成:/uchar volatile pdata *p=0x8002;doACC=*p;while(bflag=1);/上述所有代码也可用以下代码替换/*doACC=XBYTE0x8002;while(bflag=1);*/-keypad.c-/键盘扫描函数char input();返回按键的ASCII码/-#include#includechar code keycodes=7,8,9,/,4,5,6,*,1,2,3,-,C,0,=,+;char data keyflags16;/-/获取键盘按键子程序/-char input

温馨提示

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

评论

0/150

提交评论