单片机C语言-第3章51单片机P0-P3口的C51编程3

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

3.3输入操作作为51单片机片内并行I/O口输入信号,属于数字信号的“高、低电平”或脉冲信号的“上升沿、下降沿”两大类,这两类信号可以通过:“闸刀型开关”、“按钮型开关”两类开关来模拟。3.3.1闸刀型输入信号•常见的闸刀型开关有拨码开关、自锁按钮开关、面板用数字式拨码开关、电路板用数字式拨码开关等。【例3-7】闸刀开关型输入信号。编程实现相应的开关闭合时,相应的灯亮。•#includereg51.h•sbitLED0=P1^0;•sbitLED1=P1^1;•sbitLED2=P1^2;•sbitLED3=P1^3;•sbitK0=P1^4;•sbitK1=P1^5;•sbitK2=P1^6;•sbitK3=P1^7;•voidmain()•{while(1)•{K0=1;K1=1;K2=1;K3=1;•LED0=K0;LED1=K1;•LED2=K2;LED3=K3;•}•}•思考:•为什么在读键状态之前要先置1?•修改:•(1)开关闭合时灯灭。•(2)K0控制LED3,K1控制LED2,K2控制LED1,K3控制LED0。3.3.2单个按钮型开关输入信号开关去抖动的处理分为硬件去抖动和软件去抖动。硬件去抖动增加硬件投入。单片机一般采用软件去抖动。软件去抖动是执行一段软件延时程序(10ms左右)。需关注两个问题:去抖动、判断按键是否抬起。【例3-8】按钮开关。编程实现S1按钮按一下,4个灯一组亮、灭交替。•#includereg51.h•#defineucharunsignedchar•#defineuintunsignedint•sbitS1=P3^2;•voiddlxms(uintxms)•{uintt1,t2;•for(t1=0;t1xms;t1++)•for(t2=0;t2110;t2++);•}•voidmain()•{P1=0x0f;•while(1)•{S1=1;•if(S1==0)•{dlxms(10);•if(S1==0)•{dlxms(10);•P1=~P1;•while(S1==0);•dlxms(10);•}•}•}•}【例3-9】开始是所有的灯都亮,按一下S1,灯变为500ms闪烁,再按一下,变为全亮。•分析:•相当于S1为一个控制开关,控制着灯的亮、灭闪烁;•与例题3-8不同。定义一个位单元,按键每动作一次,该位单元取反:该单元为0时,灯全亮,该单元为1时,灯闪烁。•includereg51.h•#defineucharunsignedchar•#defineuintunsignedint•sbitS1=P3^2;•bitkey=0;//定义一个位,存储按键的动作(偶、奇)•voiddlxms(uintxms)•{uintt1,t2;•for(t1=0;t1xms;t1++)•for(t2=0;t2110;t2++);•}•voidkeyscan()//键检索•{S1=1;•if(S1==0)•{dlxms(10);•if(S1==0)•{dlxms(10);•key=~key;//取反•while(S1==0);•}•}•}•voidmain()•{P1=0x00;•while(1)•{keyscan();//调用键检索•if(key==0)•{P1=0x00;•}•else•{dlxms(500);•P1=~P1;•}•}•}3.3.3多个按钮型开关—键盘1.键号、键值和键值表(1)键号:用户在设计键盘程序时,为每一个按键定义一个号码,该号码称为键号。(2)键值:用户在设计键盘程序时,每一个按键根据某种得法得到与其他按键不一样的值,该数值称为按键的键值。(3)键值表:用户在设计键盘程序时,将所有按键的键值,按照一定的顺利,在code区建立一个表格,该表格称为键值表。3.3.3多个按钮型开关—键盘2.独立式键盘接口技术当按键的数量比较少(≤8)时,可采用独立式按键硬件结构。独立式按键是指直接采用一根I/O口线构成的单个按键电路。每个独立式按键单独占用一根I/O口线,每根I/O口线上的按键的工作状态不会影响其他I/O口线的工作状态。【例3-10】独立式按键示例。P1口作为并行接口按键的输入口,P3口接共阳极LED显示器,编程显示按键的键号0~7。•分析:1位共阳极静态显示。0号键按下时,P1口的内容为11111110B;……;7号键按下时,P1口的内容为01111111B。•#includereg51.h•#defineucharunsignedchar•#defineuintunsignedint•uchardatakeycode=8;//键值的初值设为8•uchardatadir_buf;//显示缓冲区•codeuchardirtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xbf};//显示的代码表•codeucharkeytab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//键值表•voiddl_xms(uintxms)//延时xms毫秒•{uintt1,t2;•for(t1=xms;t10;t1--)•for(t2=110;t20;t2--);•}•voiddir()//显示函数•{P3=dirtab[dir_buf];•}•voidkeyscan()//键盘扫描函数•{ucharkey1;•P1=0xff;key1=P1;//读键盘的值•if(key1!=0xff)//如果有键按下•{dl_xms(10);//延时消抖动•P1=0xff;key1=P1;//再读键盘的值•if(key1!=0xff)//继续按下•{keycode=0;•while(key1!=keytab[keycode])//查表得键号•{keycode=keycode+1;•if(keycode==8)•break;•}•while(P1!=0xff);//等待键抬起•}•}•}•voidmain()•{dir_buf=8;//缓冲区送8,显示-•dir();•while(1)•{keyscan();•dir_buf=keycode;//键号送显示缓冲区•dir();•}•}3.矩阵键盘接口当按键的数量比较多时,采用行列式键盘。行列式键盘又称为矩阵式键盘。(1)行列式键盘的硬件结构:行列式键盘的结构比较简单,按键设置在行、列的交点上。(2)矩阵键盘行列扫描法分三步进行。1)第一步判断是否有按键按下。将全部行线置低电平,然后检测列线的电平状态。有且只有一列的电平为低电平,则表示键盘中有键按下。若所有列线均为高电平,则键盘中无键按下。2)第二步是判断闭合按键具体所在的位置。逐行将行线置低电平,然后检测列线的电平状态。低电平列线相连的按键就是闭合按键。3)第三步确定闭合按键的键值编码。将所有行线电平状态与所有列线电平状态进行组合,就可以得到该闭合按键的键值编码。有按键按下时,只有一条行线的电平是低电平,其余行线的电平是高电平;只有一条列线的电平是低电平,其余列线的电平是高电平。+行线P14、P15、P16、P17分别与单片机引脚P1.4、P1.5、P1.6、P1.7相连,列线P10、P11、P12、P13分别与单片机引脚P1.0、P1.1、P1.2、P1.3相连。•若采用行列扫描法,先判断是否有按键按下。给P1口赋值0x0f,所有列线置高电平,所有的行线置低电平,读列线的电平状态。若所有列线都是高电平,则表示没有按键按下;反之,有按键按下。再确定闭合按键具体的位置,采用逐行送低电平的方法。•(1)给P1口赋值0xef,然后读列线的电平状态。若有按键按下,则与该按键相连列线的电平为低电平。按键的键值编码就是行线和列线的电平状态组合,即为P1口8个引脚的电平状态。由之可得,加号键的键值编码是11100111(0xe7),数字3的键值编码是11101011(0xeb),数字2的键值编码是11101101(0xed),数字1的键值编码是11101110(0xee)。•(2)若第一行没有按键按下,列线的电平状态都是高电平,P1口的值没有变化,还是0xef。这时检测第二行是否有按键按下。给P1口赋值0xdf,若有按键按下,通过读列线的电平状态可确定按键具体位置。减号键的键值编码是11010111(0xd7),数字6的键值编码是11011011(0xdb),数字5的键值编码是11011101(0xdd),数字4的键值编码是11011110(0xde)。•(3)若第一行和第二行都没有按键按下,给P1口赋值0xbf,检测第三行是否有按键按下。第三行按键按下时的编码分别是:乘号键的键值编码是10110111(0xb7),数字9的键值编码是10111011(0xbb),数字8的键值编码是10111101(0xbd),数字7的键值编码是10111110(0xbe)。•(4)若第一行、第二行和第三行都没有按键按下,给P1口赋值0x7f,检测第四行是否有按键按下。第四行的按键按下时的编码分别是:除号键的键值编码是01110111(0x77),等于号键值编码是01111011(0x7b),数字0的键值编码是01111101(0x7d),CE清除键键值编码是01111110(0x7e)。•线翻转发法主要分分三步进行。•第一步将所有列线置低电平,所有行线置高电平,然后读所有行线电平状态。如果所有行线电平状态是高电平,则表示没有按键按下;反之,则表示有按键按下,保留所有行线电平状态。行线电平状态即为行线相关的闭合按键的键值编码高半部分或低半部分。有且只有一条行线的电平由高电平变为低电平,这种现象称为电平翻转,这是这种方法命名由来。•第二步将所有行线置低电平,所有列线置高电平,然后读所有列线电平状态。如果所有列线电平状态是高电平,则表示没有按键按下。如果存在一条列线的电平由高电平变为低电平,则表示有按键按下,保留所有列线电平状态。列线电平状态即为列线相关的闭合按键的键值编码的低半部分或高半部分。•第三步确定闭合按键的键值编码。将第一步得到的行线相关键值编码的高半部分或低半部分与第二步得到的列线相关的键值编码低半部分或高半部分进行组合,就得到了闭合按键完整的键值编码。•若采用线翻转发法,先给P1口赋值0xf0,所有行线置高电平,所有的列线置低电平,读行线的电平状态。若有按键按下,有且只有一条行线的电平是低电平,行线电平状态即为与行线相关的闭合按键的键值编码高4位。高4位键值编码键号编码键号编码键号编码键号编码111102111031110加号1110411015110161101减号1101710118101191011乘号1011清除键011100111等于号0111除号0111•再给P1口赋值0x0f,所有列线置高电平,所有的行线置低电平,读列线的电平状态。若有按键按下,有且只有一条列线的电平是低电平,列线电平状态即为与列线相关的闭合按键的键值编码低4位。键号编码键号编码键号编码键号编码111102110131011加号0111411105110161011减号0111711108110191011乘号0111清除键111001101等于号1011除号0111低4位键值编码•将闭合按键键值高4位编码和低4位编码进行组合,就可得到闭合按键键值的编码。与行列扫描法相比,线翻转发法会占用更多的数据储存空间。但是,行列扫描法实现代码较长,线反转法实现程序较简单。•闭合按键键值编码键号高4位低4位键号高4位低4位键号高4位低4位键号高4位低4位111101110211101101311101011加号111001110xee0xed0xeb0xe7411011110511011101611011011减号110101110xde0xdd0xdb0xd7710111110810111101910111011乘号101101110xbe0xbd0xbb0xb7清除键01111110001111101等于号01111011除号01

1 / 40
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功