完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
本帖最后由 JankinHuang 于 2017-9-27 19:16 编辑
我打了一个矩阵键盘的静态显示代码 但烧录进单片机后 蜂鸣器一直响个不停(蜂鸣器和矩阵键盘的IO口有同时用到) 但我怎么改都改不好 不知道哪里疏漏了 想请大神帮我看看 代码如下: #include #define uchar unsigned char #define uint unsigned int #define DIG P0 #define KEY P1 uchar code dig[17]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(uint msec); void keyscan(); //子函数声明 uchar num; //定义全局变量 存储健值用于数码管显示 void main() { while(1) { keyscan(); DIG = dig[num]; } } void delay(uint msec) { uchar a,b; for(;msec>0;msec--) { for(a=38;a>0;a--) { for(b=130;b>0;b--); } } } void keyscan() { uint down = 0; KEY=0xf0; //检测列 if(KEY != 0x0f) { delay(1); //检测抖动 if(KEY != 0x0f) //0000 1111 { KEY = 0x0f; //IO口输入 switch(KEY) //IO口输出检测 { case (0x07):num=0;break; //第一列被检查出 0000 0111 case (0x0b):num=1;break; //第二列被检查出 0000 1011 case (0x0d):num=2;break; //第三列被检查出 0000 1101 case (0x0e):num=3;break; //第四列被检查出 0000 1110 } KEY = 0xf0; //检测行 1111 0000 switch(KEY) { case(0x70):num=num;break; //第一行被测出 //0111 0000 case(0xb0):num=num+4;break; //第二行被测出 //1011 0000 case(0xd0):num=num+8;break; //第三行被测出 //1101 0000 case(0xe0):num=num+12;break; //第四行被测出 //1110 0000 } while( (down<50) && (KEY != 0xf0) ) //松手检测 { delay(1); down++; } } } }
|
|
相关推荐
22个回答
|
|
|
/*******************************************************************************
* * 普中科技 -------------------------------------------------------------------------------- * 实 验 名 : 矩阵键盘显示试验 * 实验说明 : 静态数码管显示矩阵键盘键值 * 连接方式 : 见连接图 * 注 意 : *******************************************************************************/ #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--); } } } |
|
|
|
|
|
|
|
|
|
|
|
楼主说的取反是因为段码是共阴极 而一位数码管是共阳极的 你把段码改了吧 就不用取反了
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16901 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 08:20 , Processed in 0.727841 second(s), Total 45, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
9462