1602液晶显示计算器电路图及程序.docx
- 文档编号:15529099
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:19
- 大小:48.67KB
1602液晶显示计算器电路图及程序.docx
《1602液晶显示计算器电路图及程序.docx》由会员分享,可在线阅读,更多相关《1602液晶显示计算器电路图及程序.docx(19页珍藏版)》请在冰点文库上搜索。
1602液晶显示计算器电路图及程序
#include〈reg51。
h>
#include #include #include unsignedcharcodeError[]={”error"}; unsignedcharcodeSystemerror[]={”systemerror"}; unsignedcharcodeLcd[]={"lcdcalculate"}; charstr[16]; sbitRS=P2^0; sbitRW=P2^1; sbitE=P2^2; sbitBF=P0^7; /*********************** 函数功能: 延时1ms ***********************/ voiddelay1ms() { unsignedchari,j; for(i=0;i<10;i++) for(j=0;j〈33;j++) ; } /************************ 函数功能: 延时n毫秒 入口参数: n ************************/ voiddelaynms(unsignedcharn) { unsignedchari; for(i=0;i〈n;i++) delay1ms(); } /************************************ 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙。 ************************************/ bitBusyTest(void) { bitresult; RS=0;//根据规定,RS为低电平、RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读/写 _nop_(); _nop_(); _nop_(); _nop_(); result=BF;//将忙碌标志电平赋给result E=0; returnresult; } /************************************* 函数功能: 将模式设置指令或显示地址写入液晶模块 入口参数: dictate **************************************/ voidWriteInstruction(unsignedchardictate) { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同为低电平时,可以写入指令 RW=0; E=0; _nop_(); _nop_(); P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); E=0; } /***************************************** 函数功能: 指定字符显示的实际地址 入口参数: x,y *****************************************/ voidWriteAddress(unsignedcharx,unsignedchary) { unsignedchartemp; if(x==0) { switch(y) { case0: temp=0x00;break; case1: temp=0x01;break; case2: temp=0x02;break; case3: temp=0x03;break; case4: temp=0x04;break; case5: temp=0x05;break; case6: temp=0x06;break; case7: temp=0x07;break; case8: temp=0x08;break; case9: temp=0x09;break; case10: temp=0x0a;break; case11: temp=0x0b;break; case12: temp=0x0c;break; case13: temp=0x0d;break; case14: temp=0x0e;break; case15: temp=0x0f;break; } } if(x==1) { switch(y) { case0: temp=0x40;break; case1: temp=0x41;break; case2: temp=0x42;break; case3: temp=0x43;break; case4: temp=0x44;break; case5: temp=0x45;break; case6: temp=0x46;break; case7: temp=0x47;break; case8: temp=0x48;break; case9: temp=0x49;break; case10: temp=0x4a;break; case11: temp=0x4b;break; case12: temp=0x4c;break; case13: temp=0x4d;break; case14: temp=0x4e;break; case15: temp=0x4f;break; } } WriteInstruction(temp|0x80);//显示位置的确定方法规定为“80H+地址码x" } /***************************************** 函数功能: 将数据(字符的标准ASCII码)写入液晶模块 入口参数: y *****************************************/ voidWriteData(unsignedchary) { while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0; P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); _nop_(); E=0;//当E由高电平跳变成低电平时,液晶模块开始执行指令 } /***************************************** 函数功能: 对LCD的显示模式进行初始化设置 *****************************************/ voidLcdInitiate(void) { delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38);//显示模式设置 delaynms(5); WriteInstruction(0x38); delaynms(5); WriteInstruction(0x38); delaynms(5); WriteInstruction(0x0c);//显示模式设置: 显示开,无光标,光标不闪烁 delaynms(5); WriteInstruction(0x06);//显示模式设置: 光标右移,字符不移 delaynms(5); WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delaynms(5); } /*************************************** 函数功能: 显示字符串 ***************************************/ voiddisplay_error() { unsignedchari; WriteAddress(0,0); i=0; while(Error[i]! =’\0’) { WriteData(Error[i]); i++; delaynms(100); } } voiddisplay_systemerror() { unsignedchari; WriteAddress(0,0); i=0; while(Systemerror[i]! =’\0’) { WriteData(Systemerror[i]); i++; delaynms(100); } } voiddisplay_lcd() { unsignedchari; WriteAddress(0,0); i=0; while(Lcd[i]! =’\0’) { WriteData(Lcd[i]); i++; delaynms(100); } } /*************************** 函数功能: 按键判断 **************************/ bitjudge() { unsignedcharkeycode; P1=0x0f; keycode=P1; if(keycode==0x0f) return(0); else return (1); } /***************************** 函数功能: 键盘扫描 *****************************/ unsignedcharscan() { unsignedcharkeycode,keyscan; keyscan=0xef; while(keyscan! =0xff) { P1=keyscan; keycode=P1; if((keycode&0x0f)! =0x0f) break; keyscan=(keycode<〈1)|0x0f; } keycode=~keycode; return(keycode); } /******************************* 函数功能: 扫描键盘返回值 ******************************/ unsignedcharKey_Num() { unsignedcharkeycode; unsignedcharyong; if(judge()) { delaynms(20); if(judge()) { keycode=scan(); while(judge()); switch(keycode) { case0x11: yong=’7’;break; case0x12: yong=’4’;break; case0x14: yong='1';break; case0x18: yong=0;break; case0x21: yong=’8';break; case0x22: yong=’5';break; case0x24: yong='2’;break; case0x28: yong='0';break; case0x41: yong=’9';break; case0x42: yong='6’;break; case0x44: yong='3’;break; case0x48: yong=’=’;break; case0x81: yong=’/';break; case0x82: yong='*’;break; case0x84: yong='—';break; case0x88: yong='+’;break; default: display_systemerror(); } return(yong); } } else return(0xff); } /************************************** itoa函数定义 *********************************/ unsignedcharitoa(longintnum) { unsignedchari,j,L; unsignedchartemp[16]; for(i=0;num! =0;i++) { temp[i]=num%10+48; num=num/10; } L=i; if(i>16) { display_systemerror(); } for(j=0;j〈=L;j++) { str[j]=temp[i]; i-—; } return(L); } /***************************************** 函数功能: 主函数 ****************************************/ voidmain() { longinta; longintb; unsignedcharflag; unsignedcharsign; unsignedchari,j,s,x; unsignedcharnum; unsignedcharfgh; unsignedchartemp[16]; LcdInitiate(); display_lcd(); delaynms(20); WriteInstruction(0x01); flag=1; while (1) { num=Key_Num(); if(num! =0xff) { if(fgh==1) { WriteInstruction(0x01); fgh=0; } if((num! ='+')&&(num! ='-’)&&(num! ='*')&&(num! =’/')&&(num! ='.’)&&(num! =’=’)) { if(flag==1) { a=a*10+num—48; } else { b=num-48+b*10; } } if(num==0) { i=0; flag=1; a=0;b=0; WriteInstruction(0x01); } if((num==’+’)||(num=='—’)||(num==’*')||(num=='/')) { flag=0; switch(sign) { case'+’: a=a+b;break; case'-’: a=a—b;break; case'*’: a=a*b;break; case’/’: {if(b! =0) {a=a/b;break;} else { WriteInstruction(0x01); flag=1; WriteAddress(0,1); display_error(); delaynms(40); WriteInstruction(0x01); break; } } default: break; } sign=num; b=0; } if(num=='=') { flag=1; switch(sign) { case'+': a=a+b; break; case'—’: a=a—b; break; case'*’: a=a*b; break; case'/’: a=a/b; break; default: break; } temp[i]=num; WriteAddress(0,i); WriteData(num); for(s=0;s<16;s++) temp[s]=0; s=0; //WriteAddress(1,8); //WriteData(a+48); x=itoa(a);//函数转换 WriteAddress(1,1); while(s<=x) { WriteData(str[s]); s++; delaynms(100); } sign=0;a=b=0;j=0; for(s=0;s<16;s++) str[s]=0; s=0; fgh=1; i=0; } if(i<16) { if(num! =’=’) { if((i==1)&&(temp[0]==’0'))//如果第一个字符是0,判读第二个字符 { temp[0]=num;//如果是1—9数字,说明0没有用,则直接替换第一位0 WriteAddress(0,0);//输出数据 WriteData(num); } else { temp[i]=num; WriteAddress(0,i);//输出数据 WriteData(num); i++;//输入数值累加 } } } else { i=0; WriteInstruction(0x01); } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1602 液晶显示 计算器 电路图 程序