收藏 分享(赏)

用8051与1601LCD设计的整数计算器.docx

上传人:kaixinyidian 文档编号:12070185 上传时间:2021-08-27 格式:DOCX 页数:10 大小:73.94KB
下载 相关 举报
用8051与1601LCD设计的整数计算器.docx_第1页
第1页 / 共10页
用8051与1601LCD设计的整数计算器.docx_第2页
第2页 / 共10页
用8051与1601LCD设计的整数计算器.docx_第3页
第3页 / 共10页
用8051与1601LCD设计的整数计算器.docx_第4页
第4页 / 共10页
用8051与1601LCD设计的整数计算器.docx_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、/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=

2、;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(buffer

3、ptr!=&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_op

4、functions(lasetoken);/ 清除输出缓冲for(i=0;i=-99999999&num=99999999)return OK;elsereturn 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 (

5、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 remain

6、der,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;/ 为“”号保留位

7、置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 和 Clearscr

8、een 例程向 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,ER

9、ROR=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(

10、);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_SETMODE4#define LCD_SET

11、VISIBLE8#define LCD_SHIFT16#define LCD_SETFUNCTION 32#define LCD_SETCGADDR 64#define LCD_SETDDADDR 128sbit bflag=ACC”忙标志位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_S

12、ETMODE+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

13、=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#include cha

14、r code keycodes= 7,8,9,/,4,5,6,*,1,2,3,-,C,0,=,+;char data keyflags16;/ 获取键盘按键子程序/ char input()/ 标识按键指针键盘行地址1110 1111列数据char *pKeyflag=keyflags;char RowAddr=0xef;/char ColData=0;/char i,j,Tmp=0;for(i=0;i4;i+)P2=RowAddr; /在 P2 端口设置行地址_nop_();Tmp=P1&0x0f; / 从 P1 端口读取列数据for(j=0;j1;RowAddr=1;P2=0xff;return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 管理论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报