完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是第一个程序,开发板自带的。
/******************************************************************************* * 实验名 : 矩阵键盘实验 * 使用的IO : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3 * 实验效果 : 按矩阵键盘分别显示在数码管上面显示十六进制的0到F。 * 注意 : *******************************************************************************/ #include #define GPIO_DIG P1 #define GPIO_KEY P0 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(); //延时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();//延时10ms进行消抖 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下 { //测试列 GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=1;break; case(0X0d): KeyValue=2;break; case(0X0e): KeyValue=3;break; } //测试行 GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue;break; case(0Xb0): KeyValue=KeyValue+4;break; case(0Xd0): KeyValue=KeyValue+8;break; case(0Xe0): KeyValue=KeyValue+12;break; } while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测 { Delay10ms(); a++; } } } } /******************************************************************************* * 函数名 : Delay10ms * 函数功能 : 延时函数,延时10ms * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Delay10ms(void) //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } 下面是第二个程序,我自己写的。 #include #define GPIO_LED P1 #define GPIO_KEY P0 typedef unsigned char uint8; typedef unsigned int uint16; uint8 code SHUMA_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e} ; void delay10ms(void); main() { unsigned char i,j; GPIO_LED=~SHUMA_CODE[0]; GPIO_KEY=0xf0; while(1) { if(GPIO_KEY!=0xf0) { delay10ms(); if(GPIO_KEY==0x70) { i=0; GPIO_KEY=GPIO_KEY|0x0f; switch(GPIO_KEY&0x0f) { case 0x07:j=1;break; case 0x0d:j=2;break; case 0x0b:j=3;break; case 0x01:j=4;break; default:break; } GPIO_KEY=0xf0; } if(GPIO_KEY==0xd0) { i=1; GPIO_KEY=GPIO_KEY|0x0f; switch(GPIO_KEY&0x0f) { case 0x07:j=1;break; case 0x0d:j=2;break; case 0x0b:j=3;break; case 0x01:j=4;break; default:break; } } GPIO_KEY=0xf0; if(GPIO_KEY==0xb0) { i=2; GPIO_KEY=GPIO_KEY|0x0f; switch(GPIO_KEY&0x0f) { case 0x07:j=1;break; case 0x0d:j=2;break; case 0x0b:j=3;break; case 0x01:j=4;break; default:break; } } GPIO_KEY=0xf0; if(GPIO_KEY==0x10) { i=3; GPIO_KEY=GPIO_KEY|0x0f; switch(GPIO_KEY&0x0f) { case 0x07:j=1;break; case 0x0d:j=2;break; case 0x0b:j=3;break; case 0x01:j=4;break; default:break; } } GPIO_KEY=0xf0; P2=~SHUMA_CODE[4*i+j]; } } } ///&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& void delay10ms(void) { uint8 a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } 最后我想问一下,我的程序问什么没用,找了半天没有找到问题在哪?求高手帮忙看一下,指点指点。 |
|
相关推荐
5个回答
|
|
你的编译环境有REGX51.H这个头文件吗?如果这个头文件打不开的话就可能是在这里有问题
最佳答案
|
|
|
|
// 我自己写的一个矩阵键盘扫描程序,测试没有问题,可以直接使用
#define key_IO P2 unsigned char key,temp; /*--------------------矩阵键盘扫描--------------------*/ void keyscan(void) { key_IO=0xfe; temp=key_IO; temp&=0xf0; if(temp!=0xf0) { delay_ms(10); //延时10ms,按键防抖; temp=key_IO; temp&=0xf0; if(temp!=0xf0) { temp=key_IO; switch(temp) { case 0xee: key=0; break; case 0xde: key=1; break; case 0xbe: key=2; break; case 0x7e: key=3; break; default : break; } } } key_IO=0xfd; temp=key_IO; temp&=0xf0; if(temp!=0xf0) { delay_ms(10); temp=key_IO; temp&=0xf0; if(temp!=0xf0) { temp=key_IO; switch(temp) { case 0xed: key=4; break; case 0xdd: key=5; break; case 0xbd: key=6; break; case 0x7d: key=7; break; default : break; } } } key_IO=0xfb; temp=key_IO; temp&=0xf0; if(temp!=0xf0) { delay_ms(10); temp=key_IO; temp&=0xf0; if(temp!=0xf0) { temp=key_IO; switch(temp) { case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: key=10; break; case 0x7b: key=11; break; default : break; } } } key_IO=0xf7; temp=key_IO; temp&=0xf0; if(temp!=0xf0) { delay_ms(10); temp=key_IO; temp&=0xf0; if(temp!=0xf0) { temp=key_IO; switch(temp) { case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break; case 0x77: key=15; break; default : break; } } } } |
|
|
|
不习惯看大部分写在main里的程序。。。
|
|
|
|
你前面调用delay函数的部分好像有点问题,你再检查看看
|
|
|
|
谢谢了,我有个问题,你为什么要加上这几句啊?为什么不能直接对key_IO进行判断啊? temp=key_IO; temp&=0xf0; if(temp!=0xf0) |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 20:34 , Processed in 0.800093 second(s), Total 81, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号