求助大神,51dz60单片机电平类型程序量很大,低电平检测按键没反应。怎么办?

51单片机软件方式按键消抖_百度知道
51单片机软件方式按键消抖
编写消抖程序,我的思路是这样子的:使用定时器0延时10ms
程序在初始化之后,执行的就是判断p1.0引脚电平状态的指令,如果p1,0是低电平,那么就启动定时器0,开始计时,那么此时主程序应该干什么呢?是原地等待还是继续检测p1.0的状态呢?
定时时间到之后,...
我有更好的答案
编写消抖程序,我的思路是这样子的:使用定时器0延时10ms程序在初始化之后,执行的就是判断p1.0引脚电平状态的指令,如果p1,0是低电平,那么就启动定时器0,开始计时,那么此时主程序应该干什么呢?是原地等待还是继续检测p1.0的状态呢?--P1.0,可以不检测了,因为已经启动了定时器。--可以检测其它接口。--如:串口、AD转换接口、温度检测、烟雾报警接口、红外输入接口...--也可以输出,动态数码管显示...定时时间到之后,在中断服务程序中检测p1.0的状态,如果是低电平,则说明按键按下了,就执行相应的子程序,执行完子程序之后呢?程序是否返回了中断服务程序的位置,继续执行呢?--回到发生中断的地方。如果是高电平的话,就退出中断服务程序,那么退出之后怎么办?--回到发生中断的地方。--没有了定时,应该继续执行检测p1.0状态。
看一下我在下面的追问中贴出的程序,在MAIN中,检测到p1.0是低电平的时候,启动定时器,然后就进入了原地等待的指令;定时时间到了之后,如果p1.0为低电平,就执行相应的程序,如果是高电平,就退出中断了,但是退出之后,执行的依然是原地等待命令,我希望是继续检测p1.0的状态;使用定时器延时的时候,这个程序就存在这个问题,但是如果使用空循环延时的话,就能够写出来了,希望能针对我的程序给出几点建议;
检测到p1.0是低电平的时候,启动定时器,然后就进入了原地等待的指令;----老等那行?还得循环的检测。前面已经说了:--P1.0,可以不检测了,因为已经启动了定时器。--可以检测其它接口。--如:串口、AD转换接口、温度检测、烟雾报警接口、红外输入接口...上面说的,已经包括检测定时器是否停止。当定时中断结束后,应有令 TR0 为零的语句。当 TR0 为零后,就继续检测 P1.0。
采纳率:64%
你对自己设计的框架都不是非常清晰啊……开始计时,那么主程序应该干嘛——这不是你自己要设计的内容嘛,我们怎么会知道你主程序里面要干嘛呢? 我建议你把设计的功能说清楚,要实现什么说明白一些,这样大家就好给你思路了。或者你把你的程序弄上来,大家帮你看看你的程序有什么样的缺陷。 按照正常中断来说,退出中断后肯定是会继续往下执行任务的,这个不用怀疑,除非你的系统跑飞了,或者存在别的BUG。
说的也是;ORG 0000HLJMP MAINORG 000BHLJMP DELAYMAIN:SETB EASETB ET0MOV TMOD,#00HMOV TH0,#00HMOV TL0,#00HJB P1.0,$SETB TR0LJMP $DELAY:CLR TR0MOV TH0,#00HMOV TL0,#00HJNB P1.0,LEDRETILED:CPL P2.0END字数限制 追问中?
老师一般这样教.假设没有按键按下时是低电平,有按键按下是高电平.当程序读取到IO口为高电平时,延时一段时间,再一次读取IO口电平,如果还是高电平,则认为是有效按键,进入按键处理程序.此时一般还有一个处理,即如果按键不松开,则不会再次处理.
实际上当我采用空循环进行延时的时候,是可以写出按键消抖的程序的,但是当我使用定时器进行定时的时候,就产生了很多的疑问,就如问题中所说的那样,这是我要解决的问题;
原地等待10MS的话,会耽误你的程序运行。如果你程序本身不在乎,那就为所谓。但是,单片机都是死循环程序。你完全可以利用程序本身一次循环的时间,来模糊计算延时。例如,程序本身循环一次要1MS,那么计数10次,就是10MS,就行了
实际上当我采用空循环进行延时的时候,是可以写出按键消抖的程序的,但是当我使用定时器进行定时的时候,就产生了很多的疑问,就如问题中所说的那样,这是我要解决的问题;
新手的问题,建议你画出逻辑图。别空想
其他1条回答
为您推荐:
其他类似问题
按键消抖的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。[问题]51单片机是怎么判断输入的?输入前为什么先置于高电平?_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:149,378贴子:
[问题]51单片机是怎么判断输入的?输入前为什么先置于高电平?收藏
不太明白...51单片机管脚平时给赋值1或者0都是输出去的那我在准备输入的时候 要先给管脚个高电平1这一步起的什么作用? 是必须的吗?通常C语言怎么写检测输入的?(除了按键以外)比如说怎么获取的光敏电阻的阻值,或者红外测量的后传回的数据...望前辈们给解答下...真心感谢!!!!
同步整流升压芯片,小封装升压芯片,大电流升压芯片,免费提供样品及DEM板测试,快充3V升12V/1.5A升压方案 免费提供样品板联系:
这个。这个。。。。如果io口是低电平状态的话。即使有高电平信号也会呗IO口拉低呀。所以只会读取低电平信号。。。。如果是高电平责高低电平都会读取。。。。如果你IO口直接接的VCC的话会把芯片烧坏。
传统51芯片是没有输入输出控制寄存器的 你可以去网上搜下有这方面的介绍的 现在好多新的51芯片都有输入输出控制寄存器和上拉控制寄存器 比如中颖的Flash芯片如果做输出 把对应的输出控制寄存器置1就行如果做输入 把对应的输出控制寄存器置0就行 如果不打开上拉寄存器 那么平时就为悬浮口如果打开上拉寄存器 那么平时就为高 此时你接个按键对地的话 按下按键端口就为低了对于传统的51
即可做输出高 也可以用作按键检测 不必特别设置就行
初始默认高电平记住就行也没必要钻牛角。
建议楼主去看看单片机内部结构,在那里你能找到答案
I/O口在上电后,内部硬件便已将I/O口置为高电平了,如果初始为低电平,那么高电平就无法读取。
写入低电平时引脚内部的mos管接通,将引脚直接接到地,此时外部输入任何电平,引脚上永远都为低电平
因为51是弱上拉,强下拉。所以当51输出高电平后,它的上拉(把电平拉高)的能力差,外围电路可以很容易的把电平拉低。当外围是0是,电平被外围拉低。51读取到0。当外围是1时,没有啥去拉低电平,就还是高电平。51读取到1。
如何编程序让P1口高电平有效
io口初始为高电平,怎么通过程序读取它的信号?比如说:#include &reg52.h&
//此文件中定义了51的一些特殊功能寄存器sbit KEY=P3^1;sbit led=P3^0;void Delay10ms(unsigned int c);
//延时10msint i=0;void main(){ KEY=1;while(1){
if(KEY=0){led=0; //置P0口为低电平Delay10ms(15);led=1;Delay10ms(15);led=1;
Delay10ms(240);
}}}我没给P3.1口低电平信号,它照样执行if后的语句,为何啊?
超低功耗,256KB-512KB闪存,可扩展存储器,备有开发板
好像要两个等号吧。。
电平只能由高拉低,如果赋低电平,即使接上高电平也会直接被拉低,端口还是低电平
登录百度帐号单片机吧-百度贴吧--单片机爱好者园地 [本吧禁止留邮箱]--单片机吧,不管你是新手还是老手,不管你是小盆友还是大盆友,这里都欢迎你们!单片机贴吧是一个云集了很多高手,技术宅的地方,大家互帮互助,
签到排名:今日本吧第个签到,
本吧因你更精彩,明天继续来努力!
本吧排名:
本吧签到人数:371
可签7级以上的吧50个
本月漏签0次!
成为超级会员,赠送8张补签卡
连续签到:天&&累计签到:天
超级会员单次开通12个月以上,赠送连续签到卡3张
单片机爱好者园地 [本吧禁止留邮箱]
求助大神,51单片机程序量很大,低电平检测按键没反应。怎么办? 51实现按键输入有几种啊?其他方式反
本人专业玩单片机,51,STM32,DSP, MSP430等,参加多次竞赛,并为队长带队获得多次国家级省级奖项,有问
想用超声波测距,但不能实时显示,开一次单片机测一次,并不是随着距离的变化而变化,求指导
说实话,现在有些学生素质真的不敢恭维!本来打算整理的资料,为了方便各位同学的学习,每个人提供
哪位大神知道哪里出问题了吗?程序对的,就是仿真不出来,第一次弄这个,实在不知道哪出问题了
声音传感器怎么收集数据?
单片机控制移动搬运机器人有了解的大神么,求教
stc52单片机要实现掉电存储功能必须要加外部器件么?法拉电容或纽扣电池
甲机摁键控制乙机LED闪烁,乙机摁键控制甲机数码管计数(附上仿真电路图) 现在的问题是甲机能控制乙
上海博通bk系列芯片选型大全,iot-wifi模块,BLE蓝牙模块,产品解决方案,欢迎交流 我司是上海博通BK芯片
keil c51里面,bit、uchar、uint、void函数有什么区别
rt,求助大神,二楼程序
求一个用到了S2和S3(分别是P3^0和P3^1端口)矩阵键盘控制蜂鸣器(P2^3)和LED灯(P1)的程序,现象是需要
自制炮机,各部件图解
求dalao讲解一下,主要是程序问题
跪求一个单片机秒表时钟程序,上电显示23-59-55,会依次增加(用中断来写),谢谢谢谢谢谢
有大神会模糊控制编程么,有偿
基于单片机的空调控制单元设计,要有制热,制冷,停机三种模式,求大佬给点资料,最好有系统框图,
各位大神。你们好。我是一名大三的学生 马上大四面临着毕业论文。我选了我们院的单片机老师。我是个
求助! 有人做过labview和单片机联系控制小车吗,在labview前面板实现控制小车 启动 加速 减速 后退 停止的
遇到瓶颈了。 我循环使用滴答定时器延时函数delay_us(),输出高电平,延迟一会,再输出低电平,延迟一
问下,,基于单片机的智能充电器就是电充满了会自动切断电源,然后报警提示,就这么多么????
淘宝买毕业设计的成品的,把程序重新编译下载进去,如果没有现象,说明你被骗了,给你的是假程序!
求个会编程模糊控制的大神,有偿,私聊我
有大神能帮我看看程序指导我一下吗?
单片机编程,指导,论文代笔
有没有吧友在使用DHT11时,拉低2脚18ms以上是,用示波器发现DHT11有波形输出,但是波形的低电平和高电平
各位大神 我想问一下光敏电阻模块lm393 的检测光强度怎么计算。阈值怎么设置
电火花震源控制系统的资料有吗?有偿
void addfinger() { uchar IDa1,IDa2,IDa3; LcmClearTXT(); PutStr(1,2,&请按手指&); SFG_getimage(); while(querenma!=0) SFG_getimag
大佬们求助啊 ,有没有人有外文文献啊 需要外国人写的 要钱都行 某宝 不靠谱 关键词在哪呢 实在找不到
问一下哪个超声波测距一般是几位,?
有哪个大神有烧录软件,AT系列的,有这个线!单片机是AT89S51
求基于Proteus的加热控制器的电路和程序,蟹蟹,帅哥美女大神!
有没有大佬做过温控的心形流水灯。。otz,我们老师留得课设,可是还没学太多就直接让做。。救急啊。
有偿,报告,需要英语基础,
对51单片机非常熟悉,非常希望免费分享自己的一些经验给大家,或者我们一起讨论问题,这样能够共同提
从去年的年底开始,除了上班时间,其他的休息时间基本上都是花在了课设和毕设上!找的学生很多,实
有没有大佬求编程 在第二张的基础上加一点
由于之前的资料网盘失效,不方便更新,重新开一贴 资料介绍 1:从零开始学习单片机教程 2:单片机学习
你可能感兴趣的吧...
发贴红色标题
签到六倍经验
兑换本吧会员
赠送补签卡1张,获得
助攻总额: 43W
贴吧热议榜
发表后自动分享本贴
使用签名档&51单片机红外控制程序,有问题,按了按键没有反应啊。_百度知道
51单片机红外控制程序,有问题,按了按键没有反应啊。
#include &reg52.h&
#define uchar unsigned char
#define uint unsigned int
sbit IR=P3^2;
sbit wela=P2^7;
sbit dula=P2^6;
uchar irtime,irok,irpro_
uchar irdata[4];
uchar irvalue[33];
uchar code table[]={0x3f,0x06,0x5b,0x4f,
太长了,没写下,详细地址链接:
我有更好的答案
简单的仿真实例 供参考
你帮我看看嘛,我也有一个可以用的代码。。
你接收的编码,和你所能显示的编码不符合,就是没有正确解码。当然不能显示了。
为啥呢?求详解
没有为啥,你首先要知道发送的是什么编码你不要用条件比较把接收到的数据直接显示。
嗯,上面的程序不全,字数限制,我上了贴吧的链接了。。
你把接收到的数据直接显示。因为和你接收到的红外编码有关。你接收用条件比较,因为接收到的没有一个和你已有的编码相同。
采纳率:60%
为您推荐:
其他类似问题
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。21ic官方微信-->
51单片机4X4矩阵键盘检测。。。为啥不行啊。。求大神
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
本帖最后由 hunxiyi 于
12:13 编辑
4X4矩阵键盘,四行依次与P3口的0、1、2、3口相连。。
四列依次与4、5、6、7口相连
编写下列程序。。。感觉没有什么问题。。但是烧进板子里,只有0、4、8、c可以显示,其它12个键都没效果、、
想了N天都没办法。。。请大神出马、、、
#include&reg52.h&
#define uchar unsigned char
#define uint unsigned int
sbit weix =&&P2^7;
sbit duanx = P2^6;
uchar code table[] = {0x3f,0x06,0x5b,0x4f,
& && && && && && && && && && && && && & 0x66,0x6d,0x7d,0x07,
& && && && && && && && && && && && && & 0x7f,0x6f,0x77,0x7c,
& && && && && && && && && && && && && & 0x39,0x5e,0x79,0x71
& && && && && && && && && && && && && & };
void init();
void keyscan();
void display();
void delay(uint x);
uchar i,key,k = 88;
void main()
& && &&&init();& && && && && && && && &//初始化
& && &&&while(1)& && && && && &
& && && && && & keyscan();& && && && && && && && &//矩阵键盘扫描
& && && && && & display();& && && && && && && && &//显示
void init()& && && && && && && && && &//初始化
& && &&&weix = 1;
& && &&&P0=0
& && &&&weix = 0;
& && &&&P0 = 0x00;
& && &&&duanx = 1;
& && &&&P0 = 0x00;
& && &&&duanx = 0;
void keyscan()& && && && && && && && & //矩阵键盘扫描
& && &&&uchar i,
& && &&&P3 = 0x0f;
& && &&&if(P3 != 0x0f)& && && && && &&&
& && && && && & delay(10);& && && && && && && && && && &&&//按键是否按下检测延时
& && && && && & if(P3 != 0x0f)& && && && && && &
& && && && && & {
& && && && && && && && &P3 = 0& && && && && && && && &
& && && && && && && && &for(i = 0;i & 4;i++)
& && && && && && && && &{
& && && && && && && && && && &&&key = P3&&& 0x0f;& && && &//屏蔽高四位,只对比检测到的第四位
& && && && && && && && && && &&&switch(key)
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & case 0x0e:k = i + 0;& && && && && && && && && && && && &
& && && && && && && && && && && && && & case 0x0d:k = i + 4;
& && && && && && && && && && && && && & case 0x0b:k = i + 8;
& && && && && && && && && && && && && & case 0x07:k = i + 12;break& && && && && && && && & & && && && && && &
default:k = 88;& &
//经15楼朋友提示,加上这句话,程序就没问题了& && && && && && && && && && &&&}
& && && && && && && && && && &&&P3&&= (P3 &&1) + 1;& && && && && &&&//P3口数据左移一位 再加1
& && && && && && && && && && &&&if(k != 88)& && && && && &&&//在此次for循环中 switch中如果匹配到
& && && && && && && && && && && && && && && && && && &&&//k被重新赋值,则退出for循环
& && && && && && && && &}
& && && && && && && && &P3&&= 0x0f;& && && && && && && && &&&//松手检测
& && && && && && && && &while(P3 != 0x0f)& && && & //未松手则一直在此等待
& && && && && && && && && && &&&;& && && && && && && && && && && & //松手则退出
& && && && && & }
void display()& && && && && && && && && && && &&&//显示
& && &&&duanx = 1;
& && &&&P0 = table[k];
& && &&&duanx = 0;
void delay(uint x)
& && &&&while(x--)
& && && && && & for(j=110;j&0;j--);
满意回复+4
if(k != 88)
//在此次for循环中 switch中如果匹配到
//k被重新赋值,则退出f ...
void scan_key(void)
P3 = 0x0f;
P3 = 0xf0;
if(k == 0xff){
key_delay = 0 ...
问题似乎不在于只能检测到那四个键吧?
本帖子中包含更多资源
才可以下载或查看,没有帐号?
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
期盼大神。。。我实在是无能为力了。。感觉思路很清晰啊
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
我用这个键盘扫描程序替换就可以。。。这是为什么啊。。。这两个道理是一模一样的啊
void matrix_keyscan()
& & & & P3 = 0x0f;
& & & & if(P3 != 0x0f)
& & & & & & & & delay(10);& & & & & & & & & & & & & & & & //键盘是否按下 检测延时
& & & & & & & & if(P3 != 0x0f)
& & & & & & & & {& & & & & & & & & & & &
& & & & & & & & & & & & P3=0xf0;& & & & & & & & //检测高4位,因低4位被拉低
& & & & & & & & & & & &&&switch(P3)& & & & //此时按键被按下,高位必有1位也被拉低
& & & & & & & & & & & &&&{
& & & & & & & & & & & & & & & &&&case 0xe0: key1=0;
& & & & & & & & & & & & & & & &&&case 0xd0: key1=1;
& & & & & & & & & & & & & & & &&&case 0xb0: key1=2;
& & & & & & & & & & & & & & & &&&case 0x70: key1=3;
& & & & & & & & & & & &&&}
& & & & & & & & & & & &&&P3=0x0f;& & & & & & & & //再检测低4位
& & & & & & & & & & & &&&switch(P3)& & & & //为何加0—12可画图理解
& & & & & & & & & & & &&&{
& & & & & & & & & & & & & & & &&&case 0x0E: key=key1+0;
& & & & & & & & & & & & & & & &&&case 0x0D: key=key1+4;
& & & & & & & & & & & & & & & &&&case 0x0B: key=key1+8;
& & & & & & & & & & & & & & & &&&case 0x07: key=key1+12;
& & & & & & & & & & & &&&}
& & & & & & & & & & & & P3 = 0x0f;
& & & & & & & & & & & & while(P3 != 0x0f)& & & & // 松手检测
& & & & & & & & & & & & & & & & ;
& & & & & & & & }
技术总监, 积分 41098, 距离下一级还需 8902 积分
技术总监, 积分 41098, 距离下一级还需 8902 积分
技术总监, 积分 41098, 距离下一级还需 8902 积分
技术总监, 积分 41098, 距离下一级还需 8902 积分
void scan_key(void)
& & & & U8 x,k;
& & & & P3 = 0x0f;
& & & & x = P3;
& & & & P3 = 0xf0;
& & & & k = P3;
& & & & k = x +
& & & & if(k == 0xff){
& & & & & & & & key_delay = 0;
& & & & & & & &
& & & & if((key_delay & 100) && (++key_delay == 3)){
& & & & & & & & key_number =& & & & & & & & // 此处设置断点,用于记录按键号
间隔5~100MS调用即可,在 “key_number =”处设置断点,按下按键记录按键号,按键号等于k值。
初级工程师, 积分 2812, 距离下一级还需 188 积分
初级工程师, 积分 2812, 距离下一级还需 188 积分
初级工程师, 积分 2812, 距离下一级还需 188 积分
初级工程师, 积分 2812, 距离下一级还需 188 积分
& && && && && && && && && && && && && && && && && && &&&//k被重新赋值,则退出for循环
& && && && && && && && &}
& && && && && && && && &temp = 0x0f;& && && && && && && && &&&//松手检测
//这里的temp被赋值,下面的while表达式括号内的条件就一直为False,temp不会自动同步P3的
& && && && && && && && &while(temp != 0x0f)& && && & //未松手则一直在此等待
& && && && && && && && && && &&&;& && && && && && && && && && && & //松手则退出复制代码
问题似乎不在于只能检测到那四个键吧?
初级工程师, 积分 2812, 距离下一级还需 188 积分
初级工程师, 积分 2812, 距离下一级还需 188 积分
初级工程师, 积分 2812, 距离下一级还需 188 积分
初级工程师, 积分 2812, 距离下一级还需 188 积分
两种代码的差异就在于你在前一种代码中设置了一个变量temp,您好好分析一下你的代码流程
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
yirongfu 发表于
两种代码的差异就在于你在前一种代码中设置了一个变量temp,您好好分析一下你的代码流程 ...
早上问老师,他接到个电话有事,急急忙忙的就看了一下说把P3用个变量代替试试。。。所以我才加了temp
之前是没有temp直接用变量p3的。。。仍然是不能正常工作,只能检测到0、4、8、12。。。
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
ayb_ice 发表于
这程序也太简洁了吧。。。。。。好高级。。。可惜没看懂。。。。:Q
中级工程师, 积分 4751, 距离下一级还需 249 积分
中级工程师, 积分 4751, 距离下一级还需 249 积分
中级工程师, 积分 4751, 距离下一级还需 249 积分
中级工程师, 积分 4751, 距离下一级还需 249 积分
键扫描要求变输出脚电平读输入脚电平再来判断,可是你在变temp这时输出脚电平会变吗?
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
xuyaqi 发表于
键扫描要求变输出脚电平读输入脚电平再来判断,可是你在变temp这时输出脚电平会变吗? ...
我错了。。这个temp是后来加的。。。之前是直接用P3的。。。仍然是只能检测4个键。。
上面的代码我已经改过来了。。。麻烦你再劳神下
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
把P3改成按位操作可能才行
初级工程师, 积分 2812, 距离下一级还需 188 积分
初级工程师, 积分 2812, 距离下一级还需 188 积分
初级工程师, 积分 2812, 距离下一级还需 188 积分
初级工程师, 积分 2812, 距离下一级还需 188 积分
可能你的思路真的是清晰的,可是你对51单片机的操作看来还比较混沌
1. 像 P3&&= (P3 &&1) + 1; 这样的操作是在直接操作IO口的输入输出寄存器,而你的P3口一半是输入一半是输出,假设某个输入口被外部按键动作拉到地,你又同时给该口输出高电平,这个电气上比较危险。所以,建议输入口就是输入,输出口就是输出,不要变来变去,51跟其他单片机不一样,你往Port写数据,就直接变成输出并反映到引脚电平,不需要另外设置为输入或输出方向。回头来说,你这句的本意是前面赋的扫描初值的移位,但运行到这一步,左移符号前的P3实际是去读取口的当前状态,而不是原来的那个定值了(P3 = 0xef以及你所设想的移位后的值)。你的老师让你加个中间变量,估计他也是初步发现了这里的问题,所以,建议你在这里再自己细细分析一下,用单步调试跟踪一下应该能很快找到问题,也能让你更好地掌握。
2. 1楼和3楼的代码要实现的按键布局我理解是不一样的,好像硬件原理也不尽相同。楼主你要实现的是矩阵扫描16键,3楼是简单按键扫描,或者说是IO口扫描,仅8键。所以,不要被3楼的代码所牵引。如果实在没理解透按键扫描的原理,建议你就直接找些4×4的C代码贴过来改造一下,网上很多的。
3. 提问应该描述尽量详细些,比如哪几个口作为输入哪几个口作为输出(行和列都可以作为输入或输出),你的设计思路,同时最好把接口的电路贴上来,详细的描述可以节省大家的时间,也能尽快帮你找到问题。
以上意见仅供参考,希望对你有用。
很耐心的讲解 赞一个
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
pc1969 发表于
把P3改成按位操作可能才行
麻烦讲清楚点啊。。。。。我是菜鸟。。。。:(
技术总监, 积分 41098, 距离下一级还需 8902 积分
技术总监, 积分 41098, 距离下一级还需 8902 积分
技术总监, 积分 41098, 距离下一级还需 8902 积分
技术总监, 积分 41098, 距离下一级还需 8902 积分
hunxiyi 发表于
这程序也太简洁了吧。。。。。。好高级。。。可惜没看懂。。。。
typedef unsigned char U8;
资深工程师, 积分 11062, 距离下一级还需 8938 积分
资深工程师, 积分 11062, 距离下一级还需 8938 积分
资深工程师, 积分 11062, 距离下一级还需 8938 积分
资深工程师, 积分 11062, 距离下一级还需 8938 积分
if(k != 88)& && && && && &&&//在此次for循环中 switch中如果匹配到
& && && && && && && && && && && && && && && && && && &&&//k被重新赋值,则退出for循环
问题在这儿,至于为什么,其实你用笔在纸上按程序执行顺序,写下各个变量的值,就清楚了,不知道是没掌握这个方法还是懒,如果养成用纸笔模拟程序运行的习惯,很多问题都会发现,不需要仿真器,也不需要问别人,熟练了速度还不慢
深说一点,你的按键扫描程序中的循环每次只执行了一次就结束了,至于为什么,还是自己发现吧
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
扫描键盘时,分别置位P3.0,P3.!,P3.2,P3.3,然后再检测P3.4,P3.5,P3.6,P3.7
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
本帖最后由 hunxiyi 于
10:49 编辑
yirongfu 发表于
可能你的思路真的是清晰的,可是你对51单片机的操作看来还比较混沌
1. 像 P3&&= (P3&&...
非常感谢你花这么多时间来为我解答,真的很感谢。。。
我确实是刚刚开始学。。感觉这个程序思路是很清晰的,但对于操作是一点头绪都没有
你说的单步调试跟踪,我还不会,现在去百度上学学。。。去
这个程序是我在网上找到的。。。最容易理解的矩阵键盘程序是书上写的,但太长了。。于是上网搜搜简单的。。。&&发现了这个文件里最后一个程序感觉不错。。。于是按照我的这个线路加以改动
3楼那个也是我在网上看见的,稍微改一下确实可以运行。。。0——15都可以正常检测,你说的仅8键不太懂什么意思。。。
最后,这个帖子是第一次在这论坛发帖。。。不足之处你已指出,已经做出了一些修改。。以后绝对不会再犯!谢谢。。
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
pc1969 发表于
扫描键盘时,分别置位P3.0,P3.!,P3.2,P3.3,然后再检测P3.4,P3.5,P3.6,P3.7
那你的意思就是3楼那代码。。。对吧?
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
hunxiyi 发表于
那你的意思就是3楼那代码。。。对吧?
直接用汇编写,直观又容易理解
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
pc1969 发表于
直接用汇编写,直观又容易理解
汇编不会;。。。。。比C难多了、、
扫描二维码,随时随地手机跟帖
技术新星奖章
人才类勋章
时间类勋章
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
欢快之小溪
发帖类勋章
技术导师奖章
人才类勋章
精华达人奖章
等级类勋章
时间类勋章
湍急之河流
发帖类勋章
突出贡献奖章
等级类勋章
您需要登录后才可以回帖
热门推荐 /5

我要回帖

更多关于 单片机高低电平 的文章

 

随机推荐