完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我想用4*4键盘做输入,控制4位共阳数码管显示,前两位输出字母(dc),后两位输出数字,然后步进值为1,但做出来却是步进值为0.1,只能显示0.0到9.9的数字,下面是我的代码和仿真图,各路大神看看我改怎么改,本人菜鸟一个,最近课程设计要用到,时间不够也来不及学习了,请大家帮帮忙吧 #include /*定义全局变量*/ unsigned char v,v1,v10; //定义电压v,个位v1,十位v10 unsigned char state;//定义状态:直流DC,方波SQ /* 定义4*4矩阵键盘键值 P1.0(e) 7 8 9 直流 P1.1(d) 4 5 6 方波 P1.2(b) 1 2 3 0 P1.3(7) 0 UP DOWN 0 P1.4(e) P1.5(d) P1.6(b) P1.7(7) */ unsigned char code keyword[16]={ 0xee,0xed,0xeb,0xe7, 0xde,0xdd,0xdb,0xd7, 0xbe,0xbd,0xbb,0xb7, 0x7e,0x7d,0x7b,0x77 }; /*定义P1.4-P1.7扫描码*/ unsigned char code ksp[4]={0xef,0xdf,0xbf,0x7f}; /* 键值码值转换表*/ unsigned char code keynum[16]={7,4,1,0,8,5,2,10/*上UP*/,9,6,3,11/*下DOWN*/,12/*直流DC*/,13/*方波SQ*/,0,0}; /*键盘扫描时间延迟函数*/ void delay_key() { unsigned char i,j; for (i=0;i<5;i++) for(j=0;j<255;j++); } /*数码管段选编码表*/ unsigned char code dpcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //不带小数点dp的显示编码 unsigned char code dpcodedp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点dp的显示编码 /*数码管扫描时间延迟函数*/ void delay_dp() { unsigned char i,j; for (i=0;i<2;i++) for(j=0;j<200;j++); } /*波形电压频率延迟函数*/ void delay_f1() { unsigned char i,j; for (i=0;i<100;i++) for(j=0;j<255;j++); } /*键盘、数码管、电压扫描函数*/ unsigned char keypad_scan() { unsigned char key,i; P1=0xf0; //P1赋值11110000 while (P1!=0xf0); //如果P1不等于11110000,则有键按下 do { /*数码管扫描*/ P3=0x01; P0=dpcode[v1]; delay_dp(); P3=0x02; P0=dpcodedp[v10]; delay_dp(); /*电压扫描*/ if (state==12) //直流 { P3=0x04; P0=0xa7; delay_dp(); P3=0x08; P0=0xa1; delay_dp(); P2=v; } else if(state==13) //方波 { P3=0x04; P0=0x92; delay_dp(); P2=v; delay_f1(); P3=0x08; P0=0x98; delay_dp(); P2=0; delay_f1(); } for(i=0;i<=3;i++) //循环扫描4次 { P1=ksp; //依次赋值扫描码11101111,11011111,10111111,01111111 if(P1!=ksp) //P1不等于以上4种状态就说明有键按下 { delay_key(); //延时去抖动 key=P1; //读入P1的状态 if(key!=ksp) //确定键是否真的按下 return(key); //返回扫描码 } } } while(1); } /*返回键值函数*/ unsigned char gotkey() { unsigned char temp,i; temp=keypad_scan(); for (i=0;i<16;i++) //与键值码逐一比较,直到相等就返回键的ID号(i),都不相等则说明没有键按下,返回16. { if(temp==keyword) return(keynum); } return(16); } /*主函数*/ void main() { unsigned char temp1,temp2; //键盘输入暂存 state=12; //状态默认为直流 P2=0; //给P2口置0,即输出电压为0 v=0; //电压V置0 v1=0;v10=0; //清空v1,v10 while(1) { temp1=gotkey(); if (temp1==12||temp1==13)//当按键为12(直流dc)或13(方波sq)时,标记state状态 state=temp1; else if (temp1==10)//当按键为10(上UP)时,标记v,v10,v1 { if (v==99) { v=0;v1=0;v10=0; } else { v=v+1; if (v1==9) { v1=0;v10=v10+1; } else { v1=v1+1; } } } else if (temp1==11)//当按键为11(下DOWN)时,标记v,v10,v1 { if(v==0) { v=99;v1=9;v10=9; } else { v=v-1; if (v1==0) { v1=9;v10=v10-1; } else { v1=v1-1; } } } else//当按键为其他数字时,标记为相应的v,v10,v1 { v10=temp1; v1=10; temp2=gotkey(); v1=temp2; v=v10*10+v1; } } } |
|
相关推荐
2个回答
|
|
我也遇到过这样问题,学习了
|
|
|
|
那应该就是数码管解码的问题了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
6178 浏览 3 评论
7445 浏览 1 评论
7685 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
9477 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1277 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 03:19 , Processed in 0.498078 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号