3.2.3.1 输入/输出接口
8051单片机的P0~P3口是“双向口”,既可以作为输入,也可以作为输出。前两章我们使用P0口作为输出,外接了8个发光二极管,并通过对P0口或其中某个位写1或写0实现对发光二极管的亮灭控制。本章要进行按键检测,毫无疑问,这时的I/O口只能作为输入口,通过判断相应位的信号状态,来实现对外接输入信号的高低判断。可以简单地理解成,如果把数据送给I/O口,则此时I/O口作为输出口;如果直接使用I/O口进行判断,则作为输入口。
以接在P3.2的按键为例,此时P3.2是作为输入口的,我们直接使用这个位,而不是给这个位写1或写0。这里我们先定义一下按键,如下所示:
sbit S1=P3^2;//定义按键S1,接在P3.2
此时,如果S1=0,则表示接在P3.2的按键S1为低电平;如果S1=1,则表示接在P3.2的按键S1为高电平。这样,根据按键检测原理,我们就可以检测按键有没有被按下了!
温馨提示
事实上,我们这里大大简化了I/O口的功能,同时也没有对I/O结构进行介绍。希望有心的读者,可以尽快进入“提高”层次,认真去分析I/O口的功能与结构。
3.2.3.2 一个简单示例
经过前面的学习,特别是通过图3-4所示流程的介绍,我们就可以对按键检测进行编程了。作为一个简单的示例,要求按键每按1次,指示灯的状态全部取反。请读者认真阅读图3-5所示的参考程序,并调试验证,观察程序执行效果。
图3-5 按键检测参考程序1
3.2.3.3 C语言标识符介绍
1.~和!
通过查阅附录B可知,“~”和“!”是两个常见的运算符。其中“~”是位取反运算符,将所有位都取反,所以一般用于字节及以上数据长度的操作。而“!”为逻辑取反,即取反后1变0,0变1,主要用于位变量。(www.xing528.com)
想一想
请读者完成如下填空。
1)若P1=1,则执行P1=~P1后,P1=____。
2)若P1=1,则执行P1=!P1后,P1=____。
3)若位变量Flag=1,则执行Flag=!Flag后,Flag=____。
4)图3-5的例程中,P0=~P0语句实现了对P0口所有位取反功能,若一开始P0=0xff,则执行P0=~P0后,P0=____;若执行P0=!P0,则P0=____。
2.=和==
“=”和“==”两个符号意思完全不一样,请读者务必清晰辨别和使用,否则可能导致程序错误或无法达到预期效果。其中“=”是赋值语句,将“=”右边的数值赋值给其左边的变量。注意:赋值语句的左右绝对不能是常数!“==”是一个逻辑运算符,意思是判断“==”左右两边的值是否相等,若相等则“==”运算后的结果为逻辑1(真),否则为逻辑0(假)。
想一想
请读者完成如下填空。
1)请说明if(S1=1)和if(S1==1)的区别?if(S1=1)的判断结果是什么?
2)请说明if(1==S1)和if(S1==1)是否一致?若不一致,是否都可行?
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。