有没有谁用单片机和按键LCD写过简单的计算器的呀?帮忙指导一下?

[复制链接]
查看11 | 回复4 | 2011-8-24 04:30:56 | 显示全部楼层 |阅读模式
需要1,2,3,4,5,6,7,8,9,0,以及,-,乘除,清零。
回复

使用道具 举报

千问 | 2011-8-24 04:30:56 | 显示全部楼层
用pic和lcd1602做过#includepic.h__CONFIG(0x1832);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#definersRA1#definerwRA2#defineeRA3constcharweb[]={\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'\',\'-\',\'*\',\'/\',\'=\',\'\',\'E\',\'r\',\'o\'};intresult;inta;intb;intj;intn;intp;unsignedlongk;unsignedlongm;voidinit();//申明I/O口初始化函数voidlcd_init();//申明LCD初始化函数voidscan();//按键扫描程序申明voidwrite(charx);//申明显示1字节数据函数voidlcd_enable();//申明LCD显示设置函数voiddelay();//申明延时函数voiddelay2();voidmain(){k=0;m=0;p=0;init();result=0xff;//调用I/O口初始化函数lcd_init();while(1){//调用LCD初始化函数if(j25){lcd_init();j=0;}elseif(j14){PORTD=0X07;//文字动,光标不动lcd_enable();}scan();if((result!=0xff)write(a);delay2();}}}//---------------------------------------//I/O口初始化函数voidinit(){ADCON1=0X07;//设置A口为普通I/O口TRISA=0X00;//设置A口为输出TRISD=0X00;//设置D口为输出TRISC=0XF0;//设置C口高4位为输入,低4位为输出}//---------------------------------------//LCD初始化函数voidlcd_init(){PORTD=0X1;//清除显示lcd_enable();PORTD=0X38;//8位2行5*7点阵lcd_enable();PORTD=0X0e;//显示开,光标开,闪烁lcd_enable();PORTD=0X06;//文字不动,光标右移lcd_enable();PORTD=0X80;/显示地址lcd_enable();}//写一个字节数据函数voidwrite(charx){PORTD=x;//待显示数据送PORTD口rs=1;//该字节数据为数据,而不是命令rw=0;//此次操作为写,而不是读e=0;//拉低使能信号delay();//保持使能信号为低一段时间e=1;//拉高使能信号,建立LCD操作所需要的上升沿}//--------------------------------------//LCD显示设置函数voidlcd_enable(){rs=0;//该字节数据为命令,而不是数据rw=0;//此次操作为写,而不是读e=0;//拉低使能信号delay();//保持使能信号为低一段时间e=1;//拉高使能信号,建立LCD操作所需要的上升沿}//--------------------------------------//延时函数voiddelay(){inti;for(i=0;i5000;i);}voidscan(){intl,z,c,v,t,aaa,y,ss,ww,rr;PORTC=0XF7;//C3输出低电平,其他三位输出高电平asm(\"nop\");//插入一定延时,确保电平稳定result=PORTC;//读回C口高4位结果result=result//清除低4位if(result!=0xf0)//判断高4位是否为全1(全1代表没按键按下)?{result=result|0x07;//否,加上低4位0x07,做为按键扫描的结果}else//是,改变低4位输出,重新判断是否有按键按下{PORTC=0XFb;//C2输出低电平,其他三位输出高电平asm(\"nop\");//插入一定延时,确保电平稳定result=PORTC;//读回C口高4位结果result=result//清除低4位if(result!=0xf0)//判断高4位是否为全1(全1代表没按键按下){result=result|0x0b;//否,加上低4位0xb,做为按键扫描的结果}else//是,改变低4位输出,重新扫描{PORTC=0XFd;//C1输出低电平,其他三位输出高电平asm(\"nop\");//插入一定延时,确保电平稳定result=PORTC;//读回C口高4位结果result=result//清除低4位if(result!=0xf0)//判断高4位是否为全1(全1代表没按键按下){result=result|0x0d;//否,加上低4位0x0d,做为按键扫描的结果}else//是,改变低4位的输出,重新扫描{PORTC=0XFe;//C0输出低电平,其他三位输出高电平asm(\"nop\");//插入一定延时,确保电平稳定result=PORTC;//读回C口高4位结果result=result//清除低4位if(result!=0xf0)//判断高四位是否为全1(全1代表没有按键按下){result=result|0x0e;//否,加上低4位0x0e,做为按键扫描的结果}else//是,全部按键扫描结束,没有按键按下,置无按键按下标志位{result=0xff;//扫描结果为0xff,做为没有按键按下的标志}}}}if((b==11)}switch(result){case0xe7:a=web[1];b=1;k=k*10b;break;//K1case0xeb:a=web[2];b=2;k=k*10b;break;//K2case0xed:a=web[3];b=3;k=k*10b;break;//K3case0xee:a=web[10];n=0;m=k;k=0;p;break;//K4case0xd7:a=web[4];b=4;k=k*10b;break;//K5case0xdb:a=web[5];b=5;k=k*10b;break;//K6case0xdd:a=web[6];b=6;k=k*10b;break;//K7case0xde:a=web[11];n=1;m=k;k=0;p;break;//K8case0xb7:a=web[7];b=7;k=k*10b;break;//K9case0xbb:a=web[8];b=8;k=k*10b;break;//K10case0xbd:a=web[9];b=9;k=k*10b;break;//K11case0xbe:a=web[12];n=2;m=k;k=0;p;break;//K12case0x77:lcd_init();result=0xff;j=0;m=0;k=0;p=0;break;//K13case0x7b:a=web[0];b=0;k=k*10b;break;//K14case0x7d:b=10;write(web[14]);j=0;break;//K15case0x7e:a=web[13];n=3;m=k;k=0;p;break;//K16case0xff:break;//无}if(b==10){if(p1){m=10000000000;}if(((n==0)}if((n==1)}if((n==2)}if((n==3)}k=0;PORTD=0XC0;//设置第2行显示地址lcd_enable();PORTD=0X0C;lcd_enable();if(m9999999999){write(web[16]);write(web[17]);write(web[17]);write(web[18]);write(web[17]);m=0;b=11;}//写“error”if(m!=0)//分解m{ww=m;m/=10;rr=m;m/=10;ss=m;m/=10;aaa=m;m/=10;v=m;m/=10;c=m;m/=10;z=m;m/=10;l=m;m/=10;t=m;m/=10;y=m;if((y==0)t=15;l=15;z=15;c=15;v=15;aaa=15;ss=15;rr=15;ww=15;}if((y==0)t=15;l=15;z=15;c=15;v=15;aaa=15;ss=15;rr=15;}if((y==0)t=15;l=15;z=15;c=15;v=15;aaa=15;ss=15;}if((y==0)t=15;l=15;z=15;c=15;v=15;aaa=15;}if((y==0)t=15;l=15;z=15;c=15;v=15;}if((y==0)t=15;l=15;z=15;c=15;}if((y==0)t=15;l=15;z=15;}if((y==0)t=15;l=15;}if((y==0)t=15;}if(y==0){y=15;}write(web[15]);write(web[15]);write(web[15]);write(web[15]);write(web[15]);write(web[15]);write(web[y]);//写结果write(web[t]);write(web[l]);write(web[z]);write(web[c]);write(web[v]);write(web[aaa]);write(web[ss]);write(web[rr]);write(web[ww]);m=0;delay2();b=11;p=0;}}}voiddelay2()//延时程序{unsignedlongi;//定义整形变量for(i=0x2000;i--;);//延时}
回复

使用道具 举报

千问 | 2011-8-24 04:30:56 | 显示全部楼层
我可以代做的需要的话可以联系我
回复

使用道具 举报

千问 | 2011-8-24 04:30:56 | 显示全部楼层
用51做过追问能不能把你的51程序和其中的思路分享一下呀,谢谢。我的邮箱是[email protected]
回复

使用道具 举报

千问 | 2011-8-24 04:30:56 | 显示全部楼层
程序已经发到邮箱,请查收
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行