单片机教材 - 第4章I-O接口及应用(2)
K0~K7的状态可以组成一个8位的二进制输入数。如图4-7所示,K7、K5、K2、K0断开,K6、K4、K3、K1闭合。
开关: K7 K6 K5 K4 K3 K2 K1 K0 状态: 开 闭 开 闭 闭 开 闭 开 输入值:1 0 1 0 0 1 0 1 所以,输入的二进制数为0xA5。
PD口作为输出口使用,每一位与Vcc之间接有一个限流电阻和一个发光管。当PD口的某位输出1时,引脚为高电平,发光管不亮;当PD口的某位输出0时,引脚为低电平,发光管点亮。如果输出二进制数10100101,结果如下:
位数: 7 6 5 4 3 2 1 0 输出: 1 0 1 0 0 1 0 1 灯: 灭 亮 灭 亮 亮 灭 亮 灭
所以,可以用灯的亮和灭来表示二进制数。
例如:8个灯从高位到低位的状态为:灭灭亮亮亮灭灭灭,则二进制数为11000111。 现要求输入变化时,输出显示输入的结果,则程序如下:
#include
{DDRC=0x00; //定义PC口为输入口 PORTC=0x00; //不使用内部上拉电阻 DDRD=0xFF; //定义PD口为输出口
while(1) PORTD=PINC; //无限循环,把输入送到输出 }
4.2.4 实验指导2
按上述程序进行实验,观察拨动开关状态与发光管的状态关系,当改变某开关状态时,看发光管的变化,并写出二进制数。然后,定义PA口为输入,PB口为输出,改变实验电路进行实验,说明其道理。
4.3 位检测与位控制
4.3.1 位检测与位控制
在前面介绍的并行接口的输入与输出都是按字节操作的。在实际应用中,并不总是采用并行输入和并行输出,有时只需要检测8位中的某一位的状态变化。同样的,有时只控制某一位的输出,而不让其它位变化。例如在图6-8所示的电路中,如我们只希望检测PC口的第3位,并把第3位的结果送到PD口的第0位,而不要影响其他位。这就是位检测与位控制的问题。
1. 位变量
在CodeVisionAVR中可以直接定义位变量为全局变量,例如:
bit on;
也可以在定义时赋初值: bit on=1,off=0;
需要定义多少位变量,应在project->configure->C Compile菜单选项下设置bit Variables Size的数量。
在mega16.h头文件中定义的很多特殊变量是能进行位操作的,不需要专门进行位定义,就可以进行位运算。在使用时,只要在这些变量后跟一个小数点和一个范围在0~7的数字。这个数就是要操作的位。例PINE.0表示变量PINE的第0位。
2. 位检测
位检测具有位读取的含义,根据C语言中赋值语句的含义,等号右边的为读取值。所以等号右边出现位变量,就是对位的检测。如果我们要检测某个输入引脚的状态,可以在赋值语句的右边使用接口输入变量的位操作符。
例如读取C口的第0位到位变量weib1,可以编程如下: bit weib1; weib1=PINC.0;
3. 位控制
位控制具有把一个位变量输出到某个引脚的含义。所以位控制时,赋值语句的左边为接口输出变量的位操作符。例如把C口的第0位控制为高电平,可编写程序如下:
DDRC=0xff; PORTC.0=1; 第一条语句定义C口为输出口,第二条语句把C口的第0位控制为高电平。
再例如,我们只希望检测C口的第3位,并把第3位的结果送到D口的第0位,而不要影响其他位。可用PORTD.0=PINC.3实现。如果我们想把输出到D口(已定义为输出口)第一位的结果送到D口的第五位。与上例不同的是,D口的第一位是输出而不是输入。应表达为:PORTD.5=PORTD.1。等号右边的变量是输出变量,而不是输入变量。
4. 位运算
位运算一般有:置1、清0、取反、与、或、非、异或等运算。 置1:位变量=1; 清0:位变量=0;
取反:位变量=!位变量;
与运算:位变量3=位变量1&位变量2; 或运算:位变量3=位变量1|位变量2; 异或运算:位变量3=位变量1^位变量2; 非运算:位变量2=!位变量1;
以上是位与位之间的运算。但有时我们希望把字符变量或整型变量的某些位改变而其它位不变。这种改变有置位、清零、取反。其操作方法如下:
(1)置位
按逻辑或运算规则,某位与0或,本位不变,与1或,本位变1。所以把一个变量与一个同长度的二进制数做按位或运算,可以使某些位不变,某些位变1。例如把字符型变量AA的0位、5位置1,其它位不变,则操作为:
AA=AA|0b00100001; (2)清零
按逻辑与运算规则,某位与1与,本位不变,与0与,本位变0。所以把一个变量与一个同长度的二进制数做按位与运算,可以使某些位不变,某些位变0。例如把字符型变量AA的0位、5位清0,其它位不变,则操作为:
AA=AA&0b11011110; (3)取反
按逻辑异或运算规则,某位与1异或,本位取反,与0异或,本位不变。所以把一个变量与一个同长度的二进制数做按位异或运算,可以使某些位不变,某些位取反。例如把字符型变量AA的0位、5位取反,其它位不变,则操作为:
AA=AA^0b00100001;
5. 位测试
在很多应用中需要知道一个变量的某一位的状态。例如某一运算为:如果字符变量AA的第2位为0时,变量BB清0;AA的第2位为1时,BB加10。这个运算要测试变量AA的第2位。“按位与”运算规则,某位与1“与”,本位不变,与0“与”,本位变0。所以把一个变量与一个同长度的测试位为1其它位为0的二进制数做“按位与”运算,可以使测试位不变,其它位变0。如果被测试位是0,则整个运算结果是0;如被测试位为1,则整个结果为非0。通过判断结果是否为非0,就能测试需要的位。对上例可以用下面的程序实现:
if(AA&0b00000100)BB=BB+10; else BB=0;
4.4 位操作应用举例
为进一步说明其使用方法,现给出几个应用实例。 4.4.1 例3:按键处理
如图4-7所示的电路图,PC3口的按键每按一次,PD3口的发光管的状态改变一次。
图4-7 键控指示灯电路
电路中,按键不按下时,在上拉电阻R1的作用下,PC3为高电平。按键按下时,引脚与地短接,为低电平状态。通常,按键所用开关为机械弹性开关,均利用了机械触点的合、断作用。一个电压信号通过机械触点的断开、闭合过程,其波形如图4-8所示。
由于机械触点的弹性作用,一个开关在按下时不会马上稳定地接通,在松手时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,抖动时间一般为5-10毫秒。如果我们每隔20毫秒检测一次按键的状态,就可以消除抖动的影响。
按键有断开、下按、接通和释放四种情况,对应为高电平、高电平到低电平的变化、低电平、低电平到高电平的变化四种状态。每按一次键都要经历这四种状态,我们检查是否按了一次键,可以检查高电平到低电平的变化或者检查低电平到高电平的变化。检查高电平到低电平的变化的方法是:上次检查如果是高电平,本次为低电平,则表示键按下。检查低电平到高电平的变化的方法是:上次检查如果是低电平,本次为高电平,则表示键释放。
下列程序段实现例3的功能。
char j;
DDRD=0xFF; //定义PD口为输出口 DDRC=0x00; DDRC=0X00;
j=PINC; //j存放PC口的上次值 while(1)
{if((PINC.3==0)&(j&0x08)==1))PORTD.3=!PORTD.3; //有键按下时指示灯改变状态
j=PINC; //保存本次键值,作为下次判断的上次值 delay_ms(20); //延时20 …… 此处隐藏:1686字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [建筑文档]2018年公需课:专业技术人员创新能力与
- [建筑文档]2013年福建教师招考小学数学历年真题
- [建筑文档]高中信息技术课flash知识点总结 - 图文
- [建筑文档]电工实训 - 图文
- [建筑文档]最高院公告案例分析100篇(民商篇)
- [建筑文档]南开中学高2017级14-15学年(上)期末
- [建筑文档]五粮液集团战略分析
- [建筑文档]鲁教版(2012秋季版)九年级化学 酸碱
- [建筑文档]超星尔雅2017中国哲学概论自整理题库答
- [建筑文档]关于成为海口金盘饮料公司材料独家供货
- [建筑文档]LNG学习资料第一册 基础知识 - 图文
- [建筑文档]四年级品社下册《好大一个家》复习资料
- [建筑文档]现阶段领导权力腐败的特点及发展趋势
- [建筑文档]魏晋南北朝诗歌鉴赏—嵇康
- [建筑文档]坚持追求真爱是理智的行为 正方一辩稿
- [建筑文档]湘西州刑释解教人员帮教安置工作存在的
- [建筑文档]园林工程试题库及答案
- [建筑文档]计算机长期没有向WSUS报告状态
- [建筑文档]日语最新流行语
- [建筑文档]B62-016 景观进场交底专题会议
- 2018年中考语文课内外古诗词鉴赏专题复
- 高考试题研究心得体会
- C语言基础题及答案
- 电气控制及PLC习题及答案
- 都昌小学家长学校汇报材料
- GMAT作文模板正确使用方法
- 俄军办坦克大赛:中国99式有望与豹2A6
- 成本会计练习题
- 酒店餐饮业最流行的5S管理方法
- 2014-2015学年山东省菏泽市高二(下)
- 《黄鹤楼送孟浩然之广陵》教案、说课、
- 2013年结构化学自测题 有答案版
- 2011西安世界园艺博览会游览解说词(附
- 窗口文明单位示范单位创建活动总结
- 2018满分超星尔雅就业课后练习期末答案
- 韶山市城市总体规划-基础资料
- 苏教版第三单元知识点归纳
- 第4章 曲轴模态分析
- 加大查办案件力度的思考
- 武汉CPC导轨介绍




