1、计算器液晶显示key.c/*按键相关处理程序*/#include #include work.h/=void jiahander(void);void jianhander(void);void chenghander(void);void chuhander(void);/=/键盘扫描函数 返回键值 1-16/=uchar keys(void) unsigned char recode,i,j; for(i=0;i4;i+) KEY=(0x014; if(recode0x0f) for(j=0;j4;j+) if(!(recode&0x01j)break; return (i2)+(j+1)
2、; /返回键值 1-16 delayms(5); /延时5ms return 0; /无按键返回/=/给键值定义值/=uchar scanzhi(void) uchar zhi,k; k=keys(); switch(k) case 0: zhi=27;break; case 1: zhi=7;break; case 2: zhi=8;break; case 3: zhi=9;break; case 4: zhi=24;break; / / case 5: zhi=4;break; case 6: zhi=5;break; case 7: zhi=6;break; case 8: zhi=23
3、;break; /* case 9: zhi=1;break; case 10: zhi=2;break; case 11: zhi=3;break; case 12: zhi=22;break; /- case 13: zhi=26;break; /nc case 14: zhi=0;break; case 15: zhi=25;break; /= case 16: zhi=21;break; /+ return(zhi);/=void keyscan(void) uchar key; key=scanzhi(); if(key!=27) /-有无按键 if(key20)/-符号输入 pfl
4、ag=1; switch(key) case 21: jiahander();break; /+ case 22: jianhander();break; /- case 23: chenghander(); break; /* case 24: chuhander(); break; / / case 25: if(sfflag=0x01) break; if(qflag=1) sfflag=0; break; czshu=bczs;jishuan();sfflag=0x01;pbuffer1k+=;break; /= case 26: bczs=0;jguo=0;bczshu=0;czsh
5、u=0;sfflag=0; clearplay(3);k=0;qflag=0;jsfuhao=0; break; /nc while(scanzhi()!=27); /=/等号处理函数/=void jishuan(void) switch(jsfuhao) case 1: jguo=bczshu+czshu;jchangep();break; case 2: jguo=bczshu-czshu;jchangep();break; case 3: jguo=bczshu*czshu;jchangep();break; case 4: jguo=bczshu/czshu;jchangep();br
6、eak; jsfuhao=0; qflag=1; /=/加号处理函数/=void jiahander(void) if(sfflag=0x82) return; if(sfflag&0x80)!=0) k-; pbuffer1k+=+; jsfuhao=1; return; if(qflag=1) qflag=0;exchangexx(); bczshu=jguo; bczs=0;pbuffer1k+=+; else bczshu=bczs;bczs=0;pbuffer1k+=+; sfflag|=0x80; sfflag+=0x01; jsfuhao=1;/=/减号处理函数/=void ji
7、anhander(void) if(sfflag=0x82) return; if(sfflag&0x80)!=0) k-; pbuffer1k+=-; jsfuhao=2; return; if(qflag=1) qflag=0;exchangexx(); bczshu=jguo; bczs=0;pbuffer1k+=-; else bczshu=bczs;bczs=0;pbuffer1k+=-; sfflag|=0x80; sfflag+=0x01; jsfuhao=2; /= /乘号处理函数 /=void chenghander(void) if(sfflag=0x82) return;
8、 if(sfflag&0x80)=0x80) k-; pbuffer1k+=*; jsfuhao=3; return; if(qflag=1) qflag=0;exchangexx(); bczshu=jguo; bczs=0;pbuffer1k+=*; else bczshu=bczs;bczs=0;pbuffer1k+=*; sfflag|=0x80; sfflag+=0x01; jsfuhao=3;/=/除号处理函数/=void chuhander(void) if(sfflag=0x82) return; if(sfflag&0x80)!=0) k-; pbuffer1k+=/; js
9、fuhao=4; return; if(qflag=1) qflag=0;exchangexx(); bczshu=jguo; bczs=0;pbuffer1k+=/; else bczshu=bczs;bczs=0;pbuffer1k+=/; sfflag|=0x80; sfflag+=0x01; jsfuhao=4;Lcd1602.c/*LCD1602的驱动程序*/#include #include work.h#include /=/延时约1毫秒/=void delayms(uint z) uint x,y; for(x=z;x0;x-) for(y=120;y0;y-);/=/lcd读
10、忙标志/=uchar lcdbusy() bit result; lcd_rs = 0; lcd_rw = 1; lcd_en = 1; delayms(1); result = (bit)(P0 &0x80); lcd_en = 0; return (result);/=/写数据函数void writedata(uchar wrdata1) /写数据函数 while(lcdbusy(); lcd_rs=1; /write data lcd_rw=0; lcd_en=1; DQ=wrdata1; delayms(5); lcd_en=0; /=/写命令函数/= void writecom(uc
11、har comd) /写命令函数 while(lcdbusy(); lcd_rs=0; lcd_rw=0; lcd_en=1; DQ=comd; delayms(5); lcd_en=0; /*写字符串函数 *void writestr(uchar *p) /无地址,写之前要先写一个地址 uchar i; i=0; while (pi != 0) writedata(pi); i+; */-此函数没有调用过,故注释掉-/*初始化函数*void lcdinit(void) writecom(0x38); /5*8双行显示 delayms(5); writecom(0x06); delayms(5
12、); writecom(0x0c); delayms(5); writecom(0x01); /清屏 writecom(0x80);/=/ 显示清除/=void clearplay(uchar x) uchar i; if(x=1) for(i=0;i16;i+) pbuffer1i=0; else if(x=2) for(i=0;i16;i+) pbuffer2i=0; else if(x=3) for(i=0;i16;i+) pbuffer1i=0; pbuffer2i=0; pbuffer215=0x30; pflag=1; /=/刷全屏:进行一次全屏的刷写/=void displaya
13、ll(void) uchar i; if(pflag=1) writecom(0x0c); writecom(0x80+0x40); /第二行 for(i=0;i16;i+) writedata(pbuffer2i); writecom(0x80); for(i=0;i0;i-) pbuffer1i=pbuffer1i-1; pbuffer10=0; else if(flag=2) for(i=15;i0;i-) pbuffer2i=pbuffer2i-1; pbuffer20=0; /=/功能:结果显示传换/说明:显示的结果小数部分是六位的,显示的只是表像结果,/ 当进行连运算时,结果就不对
14、了,显示结果没有更改上一次的计算结果/=void jchangep(void) /结果显示传换 uchar i,p,q; /i循环变量,p整数位数,q小数位数 uchar n; long int j,m,xs; / float xsj,jguo1; if(jguo15-q;i-) pbuffer2i=xs%10+0x30; xs=xs/10; if(jguo6) n=q-6; for(i=0;in;i+) moveright(2); while(pbuffer215=0x30) /小数点后的0不显示 moveright(2); else if(xsj0.000000002)/-无小数- q=0
15、; for(i=0;i10;i+) m=(long int)pow(10,i); /p整数个数。q小数个数 if(j/m!=0) p=i+1; if(jguo15-p;i-) pbuffer2i=j%10+0x30; j=j/10; else /-小数和整数部分都有- p=1; q=9; xs=xsj*(long int)pow(10,9); while(xs%10=0) xs=xs/10; q-; /取小数个数 p=0; for(i=0;i15-q;i-) pbuffer2i=xs%10+0x30; xs=xs/10; pbuffer215-q=.; if(jguo15-q-p-1;i-) pbuffer2i=j%10+0x30; j=j/10; if(q6) n=q-6; for(i=0;in;i+) moveright(2); while(pbuffer215=0x30) /小数点后的0不显示 moveright(2); pflag=1; /刷屏标志置1/=/连运算的上下两行显示转换/=void exchangexx(void) uchar i,j; j=0; while(pbuffer2j=0) j+; for(i=0;i16;i+) if(j16) pbuffer1i=pbuffer2j+; else pbuffer1i=0; for(i=0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1