完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
` #include #include #define uint unsigned int #define uchar unsigned char #define dig P0 #define key P1 uchar code DIG_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管显示编码 void keyscan(); //检测按键子程序 uchar keyvalue; //存放读取的键值 void Delay10ms(unsigned int c); //误差 0us 延时10ms void main() { while(1) { keyscan(); //读取键值 dig=DIG_code[keyvalue]; } } void keyscan() { uchar i; i=0; while(key!=0x0f) { Delay10ms(1); //去抖 while(key!=0x0f) { key=0x0f; //给每一列赋高电平,如果有一个按下则那一列会变低电平 switch(key) //switch函数开始的时候会实时读取变量的值 { case(0x07): keyvalue=0; break; case(0x0b): keyvalue=1; break; case(0x0d): keyvalue=2; break; case(0x0e): keyvalue=3; break; default: break; } key=0xf0; //同理 检测行 switch(key) { case(0x70): keyvalue+=0; break; case(0x0b): keyvalue+=4; break; case(0x0d): keyvalue+=8; break; case(0x0e): keyvalue+=12; break; default: break; } while(i<50&&key!=0x0f) { Delay10ms(1); i++; } } } } void Delay10ms(unsigned int c) //误差 0us 延时10ms { unsigned char a, b; //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--// for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } ` |
|
相关推荐
14个回答
|
|
看你最后的描述,应该是你的程序在检查按键释放时没退出来,按键值时存在KeyValue,是全局变量,所以按键扫描程序不需要返回值,if和while的区别是if只判断一次,while是不满足条件才会退出来,既然改成if可以显示,也就是你的while没退出来,死循环了。
最佳答案
|
|
|
|
|
|
|
|
一个是接线图 还有两个是原理图 我确实用的是普中的开发板 但是我的程序并不是原来的程序 而是我理解了他给的例子后我自己写的。将他给的例程烧进去数码管会有显示,但是还是会有错误,下一楼是他给的例程,请您看下,谢谢了。 |
|
|
|
#include //--定义使用的IO口--// #define GPIO_DIG P0 #define GPIO_KEY P1 //--定义全局变量--// unsigned char code DIG_CODE[17]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码 unsigned char KeyValue; //用来存放读取到的键值 //--声明全局函数--// void Delay10ms(unsigned int c); //延时10ms void KeyDown(); //检测按键函数 /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main(void) { while(1) { KeyDown(); GPIO_DIG = ~DIG_CODE[KeyValue]; } } /******************************************************************************* * 函 数 名 : KeyDown * 函数功能 : 检测有按键按下并读取键值 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void KeyDown(void) { char a = 0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { Delay10ms(1);//延时10ms进行消抖 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下 { //测试列 GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=4;break; case(0X0d): KeyValue=8;break; case(0X0e): KeyValue=12;break; } //测试行 GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue+3;break; case(0Xb0): KeyValue=KeyValue+2;break; case(0Xd0): KeyValue=KeyValue+1;break; case(0Xe0): KeyValue=KeyValue;break; } while((a<50) && (GPIO_KEY!=0xf0)) //检测按键松手检测 { Delay10ms(1); a++; } } } } /******************************************************************************* * 函 数 名 : Delay10ms * 函数功能 : 延时函数,延时10ms * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Delay10ms(unsigned int c) //误差 0us { unsigned char a, b; //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--// for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } |
|
|
|
分开测试吧,先显示一个固定的值,看是否能显示正确,然后可以循环显示DIG_code里的数值,等显示正确了,再加入键盘检测。
当组合功能调试不通时,最好是分开调试各个部分,然后再组合起来。 |
|
|
|
键盘扫描没有返回值吧
|
|
|
|
键盘扫描没有返回值吧
|
|
|
|
坚定目标一步一步 发表于 2017-10-9 18:44 键盘扫描没有返回值吧 |
|
|
|
人中狼 发表于 2017-10-9 20:02 好的 我试试 谢谢 |
|
|
|
并不是 例子里面的扫描子程序就是没有返回值的 但是数码管还是会有数字。我又仔细看了下例子发现去抖的时候他使用的是if语句 而我原来使用的是while语句 当我改成if语句的时候 数码管就有数字了 这是为什么呢 ? |
|
|
|
试试把键盘扫描程序里while里的a换一个名称吧
|
|
|
|
好的 通过你的回答我对while和if之间的区别有了一个新的认识 其实解决完这个问题后我又遇到了新的问题 但是就是判断键值的switch语句应该有问题 因为我将这个程序烧录板子上后按下按键显示的是乱码 于是我用if语句谢了一遍成功了 我先尝试再用switch语句再写一遍 如果还是有问题还请您不吝赐教 |
|
|
|
楼主 我刚才用板子测试通过了呀 正常显示
|
|
|
|
#include
typedef unsigned char uint8; typedef unsigned int uint16; uint8 keyvalue; uint8 smg[]={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; void delay(uint16 i) { uint8 j,k; for(;i>0;i--) for(j=38;j>0;j--) for(k=130;k>0;k--); } void keyscan() { P1=0x0f; if(P1!=0x0f) { delay(2); if(P1!=0x0f) { switch(P1) { case 0x07: keyvalue=12;break; case 0x0b: keyvalue=8;break; case 0x0d: keyvalue=4;break; case 0x0e: keyvalue=0;break; } P1=0xf0; switch(P1) { case 0x70: keyvalue=keyvalue+3;break; case 0xb0: keyvalue=keyvalue+2;break; case 0xd0: keyvalue=keyvalue+1;break; case 0xe0: keyvalue=keyvalue+0;break; } while(P1!=0xf0); } } } void main() { P0=smg[0]; while(1) { keyscan(); P0=smg[keyvalue]; } } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
157 浏览 0 评论
【每周推荐】采用11代Intel CPU,基于youyeetoo X1开发板搭建少儿AI智能STEAM积木平台
825 浏览 0 评论
2372 浏览 2 评论
【youyeetoo X1 windows 开发板体验】+ 影音处理和AI模型移植
2226 浏览 5 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 移植zbar的方法
1694 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
5730 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-24 00:19 , Processed in 0.724506 second(s), Total 85, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号