从题主的问题概述来看,问题应该是:51单片机的引脚在读取之前为什么要先输出高电平?
GPIO_KEY=0x0f; //这个不是为了配置输出模式,而是为了下面的读取输入做准备。这是个值得探讨的问题,当时我学51单片机的时候,也曾有过这个疑问,不过我是百度解决的哈!
首先,51单片机的端口可以同时输入和输出吗?
答案是,可以的。我猜题主已经学习了其他比较高级一点的单片机,如 ** R、MSP430、STM32等,这些单片机的GPIO在使用之前都是需要配置输入输出功能的。51单片机的GPIO使用起来比较简单,不需要使能时钟,不需要配置输入输出,可以直接使用。51单片机的有4个端口,这4个端口都是双向的I/O端口,其中P0口是开漏输出,即内部没有上拉电阻,而P1、P2、P3口内部都有上拉电阻,所以很多原理图的P0口都会加上拉电阻。
51单片机读取输入时,为什么要先写高电平呢?
就像题主的程序那样,
GPIO_KEY=0x0f; //低四位输出高电平,准备读取 if(GPIO_KEY!=0x0f) //读取低四位状态 { ........ }以P1口为例,下面这个图是51单片机P1口的内部结构,
51单片机P1口内部结构如下图,在读取之前,先输出1,Q' = 0,T截止,此时输入的是什么,单片机读取到的就是什么。
如果读取之前,不先写1会怎么样呢?
如果之前由于其他原因,输出过0,读取之前没有输出1,那么Q' = 1,T导通,引脚输出一直为0,无论外部输入为0或者1,单片机读取到的一直为0,如下图所示。所以为了保险起见,不管之前是否输出过0,在读取之前都先输出1,然后读取,这样就能保证读取到正确的输入状态了。
怎么样?题主理解了吗?欢迎私信交流哈!
以下是广告时间,可以忽略哈!
我的其他回答:
你有什么有单片机或开源硬件做的有意思的作品吗?想寒假自学下单片机,求教要实现图一二的功能,图三的那些零件够用吗,不够的话还缺什么?我的专栏:电子电路开发学习
精选文章:
Jlink使用技巧系列教程索引Jlink使用技巧之J-Scope虚拟示波器功能Jlink使用技巧之读取STM32内部的程序Jlink使用技巧之虚拟串口功能Jlink使用技巧之单独下载HEX文件到单片机使用Keil下载单独的Hex文件到单片机内两个HC-05蓝牙模块互相绑定构成无线串口模块Keil开发环境如何生成BIN文件Keil开发环境下添加AStyle插件对C代码进行格式化处理我的微信公众号:mcu149
我的公众号欢迎大家关注我的个人博客