完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我现在在做一个电压控制仪,硬件有51单片机,4位数码管,4个按键。P0口是数码管段位(低电平有效),P2口低四位位选(P20千位,P21百位,P22十位,P23各位)(低电平有效)。P1口按键位(P14 s1,P15 s2,P16 s3,P17 s4)(低电平有效),s1是设定/确认键,s2是位选键,s3是减小键、参数向上选择键,s4是增加键、参数向下选择键。 附件中有方框图,按照方框图来做。因为这是通过多次按键扫描和显示,我不知道应该怎样避免按下s1键进入了另外的子程序 下面是我编写的程序,还未编完,但这部分做仿真的时候总是出现进错子程序的问题,求各位大哥大姐帮帮忙吧,谢谢了。 #include #define uint unsigned int #define uchar unsigned char uchar code table[]={0xab,0x12,0xbf,0x8c,0x21,0x0b,0xc0, 0xc7,0x41,0x09,0x07,0x23,0xcf,0x0e, 0xfc,0x08}; uint num,num1,num2,num3,num4,ge,shi,bai,qian; ***it s1=P1^4;//按键 ***it s2=P1^5; ***it s3=P1^6; ***it s4=P1^7; ***it d1=P2^0;//位选位 ***it d2=P2^1; ***it d3=P2^2; ***it d4=P2^3; void init() { s1=s2=s3=s4=1; d1=d2=d3=d4=1; num=num1=num2=num3=num4=0;ge=shi=bai=qian=0; } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void keyscan()//参数增加,减小 { if(s1==0) { delay(5); if(s1==0) { while(!s1); num++; } } if(num!=0) { if(s2==0)//先移位,再加减 { delay(5); if(s2==0) { num1++; while(!s2); if(num1==1) P2=0xf7;//选定个位 if(num1==2) P2=0xfb;//选定十位 if(num1==3) P2=0xfd;//选定百位 if(num1==4) { P2=0xfe;//选定千位 num1=0; } } } if(s4==0) { delay(5); if(s4==0) { while(!s4); if(num1==1) { ge++; } if(num1==2) { shi++; } if(num1==3) { bai++; } if(num1==4) { qian++; } } } if(s3==0) { delay(5); if(s3==0) { while(!s3); if(num1==1) { ge--; } if(num1==2) { shi--; } if(num1==3) { bai--; } if(num1==4) { qian--; } } } } } void diskplay(uchar a,uchar b,uchar c,uchar d)//4位数码管分别显示 { P2=0xf7;//开位选并选择ge位 P0=table[a];//送数据 // P2=0xff;//关位选 // P0=0xff;//数据清0 delay(1); P2=0xfb;//开位选并选择shi位 P0=table;//送数据 // P2=0xff;//关位选 // P0=0xff;//数据清0 delay(1); P2=0xfd;//开位选并选择bai位 P0=table[c];//送数据 // P2=0xff;//关位选 // P0=0xff;//数据清0 delay(1); P2=0xfe;//开位选并选择qian位 P0=table[d];//送数据 // P2=0xff;//关位选 // P0=0xff;//数据清0 delay(1); } void main() { init(); P2=0xf0;//开位选 0000 P0=0xc0;//送数据 P2=0xff;//关闭位选 P0=0xff;//数据位清0 delay(1); while(1) { keyscan();//输入密码 if(shi==8)//0089 { if(ge==9) { // if(bai==qian==0) // { if(s1==0) { delay(5); if(s1==0) { while(!s1); diskplay(0,1,2,3);//P-Sn keyscan();//输入选择信号 if(s1==0) diskplay(0,1,2,3);//P-Sn if(s4==0) { delay(5); if(s4==0) { while(!s4); diskplay(4,0,5,6);//End if(s3==0) { delay(5); if(s3==0) { while(!s3); diskplay(0,1,2,3);//P-Sn } } } } } // } } } } if(shi==3)//0036 { if(ge==6) { if(s1==0) { delay(5); if(s1==0) { while(!s1); diskplay(7,8,3,6);//PVL keyscan();//设定零值 if(s1==0) diskplay(7,8,3,6);//PVL if(s4==0) { delay(5); if(s4==0) { num2++; while(!s4); if(num2==1) { diskplay(9,8,3,6);//PVH keyscan();//设定满量程 if(s1==0) diskplay(9,8,3,6);//PVH } if(num2==2) { diskplay(10,11,4,6);//dot if(s1==0)//设定小数点 { delay(5); if(s1==0) { while(!s1); if(s2==0)//移位 { delay(5); if(s2==0) { num4++; while(!s2); if(num4==1) { P2=0xf7;P0=0x7f;}//选定个位 if(num4==2) { P2=0xfb;P0=0x7f;}//选定十位 if(num4==3) { P2=0xfd;P0=0x7f;}//选定百位 if(num4==4) { P2=0xfe;P0=0x7f;//选定千位 num4=0; } } } } } if(s1==0) diskplay(10,11,4,6);//dot } if(num2==3) { diskplay(10,7,12,13);//FILt keyscan();//设定滤波系数 if(s1==0) diskplay(10,7,12,13);//FILt } if(num2==4) { diskplay(4,0,5,6);//End num2=0; } } } } } } } } }
|
|
相关推荐 |
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
7 浏览 0 评论
26 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
13 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
644 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1000 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11771 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 21:49 , Processed in 0.487596 second(s), Total 36, Slave 27 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号