完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 蓝雨LOVE诗 于 2015-5-17 16:57 编辑
这是我自己画的图,程序还不完善。我现在的问题是,我的按键只能按一次,再按就没反应了。我做了很久,和苦恼。求神帮忙看看。也可以一起学习。这是我制作的按键功能。5*5的。 #include #include #include #define uint unsigned int // #define uchar unsigned char ***it lcden=P2^3; //定义引脚 ***it rs=P2^4; ***it rw=P2^0; ***it busy=P0^7; char i,j,temp,num,num_1,w; long a,b,c; //a,第一个数 b,第二个数 c,得数 float a_c,b_c; uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号 uchar code table2[]="sin"; uchar code table3[]="cos"; uchar code table4[]="tan"; uchar code table5[]="exp"; uchar code table6[]="sqrt" ; uchar code table[]={ 0,0,0,0,0, 7,8,9,0,0, 4,5,6,0,0, 1,2,3,0,0, 0,0,0,0,0}; uchar code table1[]={ 0,0,0,0,0, 7,8,9,0x2f-0x30,0x28-0x30, 4,5,6,0x2a-0x30,0x29-0x30, 1,2,3,0x2d-0x30,0, 0x2e-0x30,0,0x3d-0x30,0x2b-0x30,0}; void delay(uchar z) // 延迟函数 { uchar y; for(z;z>0;z--) for(y=0;y<110;y++); } void check() // 判断忙或空闲 { do{ P0=0xFF; rs=0; //指令 rw=1; //读 lcden=0; //禁止读写 delay(1); //等待,液晶显示器处理数据 lcden=1; //允许读写 }while(busy==1); //判断是否为空闲,1为忙,0为空闲 } void write_com(uchar com) // 写指令函数 { P0=com; //com指令付给P0口 rs=0; rw=0; lcden=0; check(); lcden=1; } void write_date(uchar date) // 写数据函数 { P0=date; rs=1; rw=0; lcden=0; check(); lcden=1; } void init() //初始化 { num=-1; lcden=1; //使能信号为高电平 write_com(0x38); //8位,2行 write_com(0x0c); //显示开,光标关,不闪烁*/ write_com(0x06); //增量方式不移位 显竟獗暌贫 柚? write_com(0x80); //检测忙信号 write_com(0x01); //显示开,光标关,不闪烁 num_1=0; i=0; j=0; a=0; //第一个参与运算的数 b=0; //第二个参与运算的数 c=0; w=0; flag=0; //flag表示是否有符号键按下, fuhao=0; // fuhao表征按下的是哪个符号 } void keyscan() // 键盘扫描程序 { while(1) { P3=0xfe; //扫描第1行 if(P1!=0xff) //有按键按下 { temp = P1; delay(5); if(P1!=0xff) //延时后确定有按键按下 { switch(temp) { case 0xfe:num=0; break; //第1行第1个按键按下 case 0xfd:num=1; break; //第1行第2个按键按下 case 0xfb:num=2; break; //第1行第3个按键按下 case 0xf7:num=3; break; //第1行第4个按键按下 case 0xef:num=4; break; //第1行第5个按键按下 } } while(temp!=0xff) //等待按键松手 { if(num==0) { init(); write_com(0x80); for(w=0;w<3;w++) { write_date(table2[w]); } //输出 “sin”; } if(num==1) { init(); write_com(0x80); for(w=0;w<3;w++) { write_date(table3[w]); } //输出 “sin”; } } } delay(5); } P3=0xfd; //扫描第二行 if(P1!=0xff) { delay(5); if(P1!=0xff) { temp=P1; switch(temp) { case 0xfe:num=5; break; case 0xfd:num=6; break; case 0xfb:num=7; break; case 0xf7:num=8; break; case 0xef:num=9; break; } } while(P1!=0xff); if(num==5||num==6||num==7)//如果按下的是'7','8'或 '9 { if(j!=0) { write_com(0x01); j=0; } if(flag==0)//没有按"/"符号键 { a=a*10+table[num]; } else if(flag==1&&num==8) //如果按过符号键"/" flag==1表示按了/ { b=b*10+table[num]; fuhao=1; //fuhao==1表示按了/ } } else //if(num=9)//如果按下的是'(' { flag=2; fuhao=2;//4表示"("已按 } i=table1[num]; write_date(0x30+i); } P3=0xfb; //3 if(P1!=0xff) { delay(5); if(P1!=0xff) { temp=P1; switch(temp) { case 0xfe:num=10; break; case 0xfd:num=11; break; case 0xfb:num=12; break; case 0xf7:num=13; break; case 0xef:num=14; break; } } while(P3!=0xff); if(num==10||num==11||num==12&&num!=13)//如果按下的是'4','5'或'6' { if(j!=0) { write_com(0x01); j=0; } if(flag==0)//没有按过符号键 { a=a*10+table[num]; } else//如果按过符号键 { b=b*10+table[num]; } } else//如果按下的是'/' { flag=1; fuhao=3;//3表示乘号已按 } i=table1[num]; write_date(0x30+i); } P3=0xfb; if(P3!=0xfb) { delay(5); if(P3!=0xfb) { temp=P1; switch(temp) { case 0xfe:num=15; break; case 0xfd:num=16; break; case 0xfb:num=17; break; case 0x70:num=18; break; case 0xef:num=19; break; } } while(P3!=0xfb); if(num==15||num==16||num==17)//如果按下的是'1','2'或'3' { if(j!=0) { write_com(0x01); j=0; } if(flag==0)//没有按过符号键 { a=a*10+table[num]; } else//如果按过符号键 { b=b*10+table[num]; } } else if(num==11)//如果按下的是'-' { flag=1; fuhao=2;//2表示减号已按 } i=table1[num]; write_date(0x30+i); } P3=0xf7; if(P3!=0xf7) { delay(5); if(P3!=0xf7) { temp=P1; switch(temp) { case 0xfe:num=20; break; case 0xfd:num=21; break; case 0xfb:num=22; break; case 0xf7:num=23; break; case 0xef:num=24; break; } } while(P3!=0xf7); switch(num) { case 24:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零" break; case 21:{ //按下的是"0" if(flag==0)//没有按过符号键 { a=a*10; write_date(0x30); P1=0; } else if(flag==1)//如果按过符号键 { b=b*10; write_date(0x30); } } break; case 22:{j=1; if(fuhao==1){write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处 write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格 c=a+b; while(c!=0) { write_date(0x30+c%10); c=c/10; } write_date(0x3d); //再写"=" a=0;b=0;flag=0;fuhao=0; } else if(fuhao==2){write_com(0x80+0x4f);//光标前进至第二行最后一个显示处 write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格(这个照理说顺序不对,可显示和上段一样) if(a-b>0) c=a-b; else c=b-a; while(c!=0) { write_date(0x30+c%10); c=c/10; } if(a-b<0) write_date(0x2d); write_date(0x3d); //再写"=" a=0;b=0;flag=0;fuhao=0; } else if(fuhao==3){write_com(0x80+0x4f); write_com(0x04); c=a*b; while(c!=0) { write_date(0x30+c%10); c=c/10; } write_date(0x3d); a=0;b=0;flag=0;fuhao=0; } else if(fuhao==4){write_com(0x80+0x4f); write_com(0x04); i=0; c=(long)(((float)a/b)*1000); while(c!=0) { write_date(0x30+c%10); c=c/10; i++; if(i==3) write_date(0x2e); } if(a/b<=0) write_date(0x30); write_date(0x3d); a=0;b=0;flag=0;fuhao=0; } } break; case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;} break; } } } void main() { init(); while(1) { keyscan(); } } |
|
相关推荐
4个回答
|
|
这个程序有问题。你能帮我看看吗?这是我自己画的图,程序还不完善。我现在的问题是,我的按键只能按一次,再按就没反应了。我做了很久,和苦恼。求神帮忙看看。也可以一起学习。 |
|
|
|
楼主的问题解决了吗,你的是什么芯片呢
|
|
|
|
|
|
|
|
不错的文档,值得收藏
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
377 浏览 0 评论
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
536 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
540 浏览 0 评论
950 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1403 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11760 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:29 , Processed in 0.584827 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号