计算器液晶显示.docx
- 文档编号:9250397
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:24
- 大小:62.01KB
计算器液晶显示.docx
《计算器液晶显示.docx》由会员分享,可在线阅读,更多相关《计算器液晶显示.docx(24页珍藏版)》请在冰豆网上搜索。
计算器液晶显示
key.c
/**********************************************************
按键相关处理程序
**********************************************************/
#include
#include"work.h"
//=========================================================
voidjiahander(void);
voidjianhander(void);
voidchenghander(void);
voidchuhander(void);
//==========================================================
//键盘扫描函数返回键值1-16
//==========================================================
ucharkeys(void)
{
unsignedcharrecode,i,j;
for(i=0;i<4;i++)
{
KEY=~(0x01<
recode=KEY>>4;
if(recode<0x0f)
{
for(j=0;j<4;j++)
{if(!
(recode&0x01< return(i<<2)+(j+1);//返回键值1-16 } delayms(5);//延时5ms } return0;//无按键返回 } //======================================================= //给键值定义值 //======================================================= ucharscanzhi(void) { ucharzhi,k; k=keys(); switch(k) { case0: zhi=27;break; case1: zhi=7;break; case2: zhi=8;break; case3: zhi=9;break; case4: zhi=24;break;/// case5: zhi=4;break; case6: zhi=5;break; case7: zhi=6;break; case8: zhi=23;break;//* case9: zhi=1;break; case10: zhi=2;break; case11: zhi=3;break; case12: zhi=22;break;//- case13: zhi=26;break;//nc case14: zhi=0;break; case15: zhi=25;break;//= case16: zhi=21;break;//+ } return(zhi); } //============================================================ voidkeyscan(void) { ucharkey; key=scanzhi(); if(key! =27)//------有无按键 { if(key<=9)//-----------------------数字输入------------------ { pflag=1; sfflag|=0x01; if(qflag==1) { k=0; clearplay(3); bczs=0; qflag=0; } pbuffer1[k++]=0x30+key; bczs=bczs*10+key; }//----------------------------------------------------------- elseif(key>20)//------符号输入 { pflag=1; switch(key) { case21: jiahander();break;//+ case22: jianhander();break;//- case23: chenghander();break;//* case24: chuhander();break;/// case25: if(sfflag==0x01)break; if(qflag==1){sfflag=0;break;} czshu=bczs;jishuan();sfflag=0x01;pbuffer1[k++]='=';break;//= case26: bczs=0;jguo=0;bczshu=0;czshu=0;sfflag=0; clearplay(3);k=0;qflag=0;jsfuhao=0;break;//nc } } while(scanzhi()! =27); } } //======================================================= //等号处理函数 //======================================================= voidjishuan(void) { switch(jsfuhao) { case1: jguo=bczshu+czshu;jchangep();break; case2: jguo=bczshu-czshu;jchangep();break; case3: jguo=bczshu*czshu;jchangep();break; case4: jguo=bczshu/czshu;jchangep();break; } jsfuhao=0; qflag=1; } //======================================================= //加号处理函数 //======================================================= voidjiahander(void) { if(sfflag>=0x82)return; if((sfflag&0x80)! =0) { k--; pbuffer1[k++]='+'; jsfuhao=1; return; } if(qflag==1) { qflag=0;exchangexx(); bczshu=jguo;bczs=0;pbuffer1[k++]='+'; } else { bczshu=bczs;bczs=0;pbuffer1[k++]='+'; } sfflag|=0x80; sfflag+=0x01; jsfuhao=1; } //======================================================= //减号处理函数 //======================================================= voidjianhander(void) { if(sfflag>=0x82)return; if((sfflag&0x80)! =0) { k--; pbuffer1[k++]='-'; jsfuhao=2; return; } if(qflag==1) { qflag=0;exchangexx(); bczshu=jguo;bczs=0;pbuffer1[k++]='-'; } else { bczshu=bczs;bczs=0;pbuffer1[k++]='-'; } sfflag|=0x80; sfflag+=0x01; jsfuhao=2; } //======================================================= //乘号处理函数 //======================================================= voidchenghander(void) { if(sfflag>=0x82)return; if((sfflag&0x80)==0x80) { k--; pbuffer1[k++]='*'; jsfuhao=3; return; } if(qflag==1) { qflag=0;exchangexx(); bczshu=jguo;bczs=0;pbuffer1[k++]='*'; } else { bczshu=bczs;bczs=0;pbuffer1[k++]='*'; } sfflag|=0x80; sfflag+=0x01; jsfuhao=3; } //========================================================= //除号处理函数 //========================================================= voidchuhander(void) { if(sfflag>=0x82)return; if((sfflag&0x80)! =0) { k--; pbuffer1[k++]='/'; jsfuhao=4; return; } if(qflag==1) { qflag=0;exchangexx(); bczshu=jguo;bczs=0;pbuffer1[k++]='/'; } else { bczshu=bczs;bczs=0;pbuffer1[k++]='/'; } sfflag|=0x80; sfflag+=0x01; jsfuhao=4; } Lcd1602.c /********************************************************* LCD1602的驱动程序 **********************************************************/ #include #include"work.h" #include //=========================================================== //延时约1毫秒 //=========================================================== voiddelayms(uintz) { uintx,y; for(x=z;x>0;x--) for(y=120;y>0;y--); } //=========================================================== //lcd读忙标志 //=========================================================== ucharlcdbusy() { bitresult; lcd_rs=0; lcd_rw=1; lcd_en=1; delayms (1); result=(bit)(P0&0x80); lcd_en=0; return(result); } //============================================================ //"写数据函数" voidwritedata(ucharwrdata1)//"写数据函数" { while(lcdbusy()); lcd_rs=1;//writedata lcd_rw=0; lcd_en=1; DQ=wrdata1; delayms(5); lcd_en=0; } //============================================================ //"写命令函数" //============================================================ voidwritecom(ucharcomd)//"写命令函数" { while(lcdbusy()); lcd_rs=0; lcd_rw=0; lcd_en=1; DQ=comd; delayms(5); lcd_en=0; } /********************************************************** "写字符串函数" ********************************************************** voidwritestr(uchar*p)//"无地址,写之前要先写一个地址" { uchari; i=0; while(p[i]! ='\0') { writedata(p[i]); i++; } }*///---------此函数没有调用过,故注释掉-------------- //*******************"初始化函数"******************************** voidlcdinit(void) {writecom(0x38);//"5*8双行显示" delayms(5); writecom(0x06); delayms(5); writecom(0x0c); delayms(5); writecom(0x01);//"清屏" writecom(0x80); } //================================================================ //显示清除 //================================================================ voidclearplay(ucharx) { uchari; if(x==1) { for(i=0;i<16;i++) pbuffer1[i]=0; } elseif(x==2) { for(i=0;i<16;i++) pbuffer2[i]=0; } elseif(x==3) { for(i=0;i<16;i++) { pbuffer1[i]=0; pbuffer2[i]=0; } } pbuffer2[15]=0x30; pflag=1; } //================================================================= //刷全屏: 进行一次全屏的刷写 //================================================================= voiddisplayall(void) { uchari; if(pflag==1) { writecom(0x0c); writecom(0x80+0x40);//第二行 for(i=0;i<16;i++) writedata(pbuffer2[i]); writecom(0x80); for(i=0;i<16;i++)//第一行 writedata(pbuffer1[i]); writecom(0x80+k); writecom(0x0e); //pflag=0;//清0显示标志位 } } //========================================================== //flag=1,移第一行;flag=2,移第二行。 //========================================================== voidmoveright(ucharflag) { uchari; if(flag==1) { for(i=15;i>0;i--) pbuffer1[i]=pbuffer1[i-1]; pbuffer1[0]=0; } elseif(flag==2) { for(i=15;i>0;i--) pbuffer2[i]=pbuffer2[i-1]; pbuffer2[0]=0; } } //===================================================== //功能: 结果显示传换 //说明: 显示的结果小数部分是六位的,显示的只是表像结果, //当进行连运算时,结果就不对了,显示结果没有更改上一次的计算结果 //===================================================== voidjchangep(void)//结果显示传换 { uchari,p,q;//i循环变量,p整数位数,q小数位数 ucharn; longintj,m,xs;// floatxsj,jguo1; if(jguo<0)jguo1=-jguo; elsejguo1=jguo; j=jguo1;//取整数部分 xsj=jguo1-j;//取小数部分 p=0; q=0; if(j==0)//----------无整数--------------------- { p=1; q=9; xs=xsj*(longint)pow(10,9); while(xs%10==0) { xs=xs/10; q--; }//取小数个数 xs=xsj*(longint)pow(10,q); for(i=15;i>15-q;i--) { pbuffer2[i]=xs%10+0x30; xs=xs/10; } if(jguo<0)pbuffer2[15-q-1-1]='-'; pbuffer2[15-q-1]=0x30; pbuffer2[15-q]='.'; if(q>6) { n=q-6; for(i=0;i moveright (2); while(pbuffer2[15]==0x30)//小数点后的0不显示 { moveright (2); } } } elseif(xsj<0.000000002)//-----------无小数---------------- { q=0; for(i=0;i<10;i++) { m=(longint)pow(10,i);//p整数个数。 q小数个数 if(j/m! =0) p=i+1; } if(jguo<0){pbuffer2[15-p]='-';}//显示负号 for(i=15;i>15-p;i--) { pbuffer2[i]=j%10+0x30; j=j/10; } } else//---------小数和整数部分都有--------------------------- { p=1; q=9; xs=xsj*(longint)pow(10,9); while(xs%10==0) { xs=xs/10; q--; }//取小数个数 p=0; for(i=0;i<10;i++) { m=(longint)pow(10,i);//p整数个数。 q小数个数 if(j/m! =0) p=i+1; } xs=xsj*(longint)pow(10,q); for(i=15;i>15-q;i--) { pbuffer2[i]=xs%10+0x30; xs=xs/10; } pbuffer2[15-q]='.'; if(jguo<0)pbuffer2[15-q-p-1]='-'; for(i=15-q-1;i>15-q-p-1;i--) { pbuffer2[i]=j%10+0x30; j=j/10; } if(q>6) { n=q-6; for(i=0;i moveright (2); while(pbuffer2[15]==0x30)//小数点后的0不显示 { moveright (2); } } } pflag=1;//刷屏标志置1 } //====================================================== //连运算的上下两行显示转换 //====================================================== voidexchangexx(void) { uchari,j; j=0; while(pbuffer2[j]==0) j++; for(i=0;i<16;i++) { if(j<16) pbuffer1[i]=pbuffer2[j++]; elsepbuffer1[i]=0; } for(i=0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算器 液晶显示