版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 输入输出端口的用法,数字端口用法,第 2页,【学习目标】,掌握输入输出端口方向的控制方法; 熟练掌握数码管动态扫描的设计和编程; 掌握矩阵式键盘设计思路和编程;,第 3页,第六章 输入输出端口的用法,第 4页,第五章 输入输出端口的用法,第 5页,1 输入/输出端口原理,第 6页,输入/输出端口简介,PIC16F877共有40个引脚,其中有33个I/O引脚、与五个端口相对应。PORTA对应RA0到RA5共6个引脚、PORTB对应RB0到RB7共8个引脚、PORTC对应RC0到RC7共8个引脚、PORTD对应RD0到RD7共8个引脚、PORTE对应RE0到RE2共3个引脚。,第 7页,输
2、入/输出端口原理,第 8页,输入/输出端口的相关寄存器,当B口处于输出状态时,PORTB的内容能决定其对应引脚的电平状态。1对应高电平,0对应低电平。,当B口处于输入状态时,外部引脚的电平能决定其对应寄存器位的值。高电平对应1,低电平对应0。,第 9页,PIC的方向寄存器TRISX,TRISB是PORTB的方向寄存器。 TRISA是PORTA的方向寄存器。 TRISC是PORTC的方向寄存器。 TRISD是PORTD的方向寄存器。 TRISE是PORTE的方向寄存器。 TRISX也是8位寄存器。 当TRISX某二进制位为1时,PORTX对应位处于输入(Input)状态。 当TRISX某二进制位
3、为0时,PORTX对应位处于输出(Output)状态。,第 10页,第五章 输入输出端口的用法,第 11页,输出端口用法例题1,第 12页,输出端口用法例题1,编程实现跑马灯的运行效果,即D0到D7循环被依次点亮,但同一时刻只有一个灯亮。单片机主频为4MHz。,第 13页,输出端口用法例题代码,main() int i=0,DelayCNT=0; char Data=0; / 用来记录向PORTC输出内容的变量 TRISC=0; / 把C口置为输出状态 while(1) / 主循环必须是死循环 Data=0 x01; / 循环的初始值 for(i=0;i8;i+) /需要显示8次 PORTC=
4、Data; / 送PORTC显示 for(DelayCNT=0;DelayCNT10000;DelayCNT+) ; / 延时 Data=Data1; / 每显示一次后Data左移一次 ,第 14页,多数码管的显示控制,第 15页,4数码管控制:Proteus原理图,第 16页,动态扫描基本思想,只让第1个数码管亮; 显示个位; 延时20ms; 只让第2个数码管亮; 显示十位; 延时20ms; 只让第3个数码管亮; 显示百位; 延时20ms; .,第 17页,动态扫描代码的实现,void delay10ms(int m) /定义延时函数 int i=0,j=0; for(i=0;im;i+)
5、for(j=0;j67;j+) / 不同频率下67需要修改 ; const char TableNumber=0b11000000,0b11111001,0b10100100, 0b10110000,0b10011001,0b10010010,0b10000010, 0b11111000,0b10000000,0b10010000; /字形码数组,第 18页,动态扫描代码的实现(续),void main(void) TRISB=0 x00; TRISC=0 x00; while(1) char i=0,j=0,k=0,Number5=0,0,0,0,0; Number1=2; Number2=
6、9; Number3=1; Number4=3; for(i=0;i10;i+) PORTC=k=0 x01; / 每次循环不要忘记k赋初始值 for(j=1;j=4;j+) / 共需要刷新四个数码管位置 PORTC=k; /设置要点亮的位置 PORTB=TableNumberNumberj; /设置字形 delay10ms(1); / 延时显示字形,造成视觉暂留现象 k=k1; / 左移为显示下一位置做准备 ,第 19页,将数码管扫描写成函数形式”seg4.h”,#ifndef _SEGMENT74_H_ / 防止重复编译本头文件 #define _SEGMENT74_H_ #define
7、SEG_BITSEL_PORT PORTC / 位选端口 #define SEG_BITSEL_PORT_DIR TRISC / 位选端口的方向寄存器 #define SEG_FONT_PORT PORTB / 字形输出端口 #define SEG_FONT_PORT_DIR TRISB / 字形端口的方向寄存器 void DisplayData(unsigned int iData);,第 20页,将数码管扫描写成函数形式”seg4.c”,void DisplayData(unsigned int Data) char i=0,j=0,k=0,Number5=0,0,0,0,0; /Numb
8、er0未用 Number1=Data/1000; / 千位 Number2=Data%1000/100; / 百位 Number3=Data%100/10; / 十位 Number4=Data%10; / 个位 for(i=0;i10;i+) SEG_BITSEL_PORT=k=0 x01; / 每次循环不要忘记k赋初始值 for(j=1;j=4;j+) / 共需要刷新四个数码管位置 SEG_BITSEL_PORT=k; /设置要点亮的位置 SEG_FONT_PORT=TableNumberNumberj; /设置字形 delay10ms(2); / 延时显示字形,造成视觉暂留现象 k=k1;
9、 / 左移为显示下一位置做准备 ,第 21页,在主程序中调用,/四位数码管动态扫描主程序,主频为4MHz #include pic.h #include delay.h #include seg74.h _CONFIG(HS ,第 22页,第五章 输入输出端口的用法,第 23页,输入端口基本用法,char chTmp; TRISB=0 xFF; / B口全置为输入状态 chTmp=PORTB; / 读取B口当前状态并保存在变量chTmp中,第 24页,单个按键状态的读取分析,当K1未按下时,RB0通过电阻R9与电路中的供电电源信号VCC相连,使RB0的电位也为高电平。即RB0输入值为1。 当K
10、1按下时,RB0与接地信号GND相连,使RB0输入为低电平,即逻辑的0。由于有R9的存在,即使K1按下也不会使VCC和GND短路。,第 25页,按键输入引脚电平抖动示意图,第 26页,单个按键输入例题,要求编程实现每按一次K1按键使数码管显示内容加一。,第 27页,例题程序代码,#define SW RD0 /在程序中用SW代表RD0 void main(void) int Data=0; TRISD0=1; / RD0 置位输入状态 SEG_BITSEL_PORT_DIR=0 x00; SEG_FONT_PORT_DIR=0 x00; while(1) if(SW=0) / 检测到SW变化
11、delay10ms(40); /在ISIS中的按钮按下到抬起过程比较长。 / 如果是实际硬件的话,延时10毫秒即可。 if(SW=0) /这说明SW真的按下了 Data+; DisplayData(Data); /在数码管上显示变量内容 ,第 28页,第五章 输入输出端口的用法,第 29页,矩阵小键盘的读取方法,在实际项目中可能会用到更多的按键输入,例如银行密码输入按键需要十几个按键,计算机键盘需要一百多个按键。如果每个按键都要独占一个I/O引脚的话会很浪费单片机资源并且程序编写也非常冗长。 如何解决这个问题? 工程中常用矩阵扫描法实现多按键输入的识别,用少量的I/O引脚即可识别多个按键,这是
12、一种典型的软硬件结合设计。,第 30页,44矩阵式键盘与单片机连接原理图,第 31页,扫描式键盘简单示意图,当RC4输出0时, SW2状态能从RC3读入; 当RC3输出0时, SW2状态能从RC4读入;,第 32页,44键盘矩阵原理图示意图,0,1 0 1 1,第 33页,44键盘矩阵原理图示意图,0,1 1 1 0,第 34页,基于C口的44键盘矩阵的扫描流程图,C口高四位输出0 ,低四位输入,C口低四位为1111吗?,C口高四位为1111吗?,Y,KeyL4=C口低四位,C口高四位输入,低四位输出0,KeyValue=KeyL4 | KeyH4;,第 35页,基于C口的44键盘矩阵的扫描代
13、码,char KeyValue=0,keyH4=0,keyL4=0; / KeyValue保存键值,KeyH4保存高四位, TRISC=0 x0F; /高四位输出,低四位输入 PORTC=0 x00; /高四位输出0000 asm(nop); / 延时等待输出稳定 asm(nop); / 延时等待输出稳定 keyL4=PORTC; / 读取低四位内容 keyL4=keyL4 / 软件消除抖动 / 未完待续,第 36页,基于C口的44键盘矩阵的扫描代码(续),TRISC=0 xF0; / 高四位输入,低四位输出 PORTC=0 x00; /低四位输出0000 asm(“nop”); / 延时等待
14、输出稳定 asm(“nop”); / 延时等待输出稳定 keyH4=PORTC; / 读取高四位内容 keyH4=keyH4 / 送D口显示,第 37页,4*4键盘扫描电路图运行图示,第 38页,如何写成函数形式(函数模块编写方法)?,明确函数的功能: 获得按键的键值,即扫描码(高四位+低四位); 函数起名为:GetScanCode 明确函数的输入(参数)和输出(返回值): 输入参数: 无; 输出: 按键的扫描码,是8位数据,char型即可. 则函数声明为: char GetScanCode(void); 由于此函数功能相对独立,所以建立一个.c文件保存函数内容,同时建立.h文件保存函数声明.
15、设分别为keyboard44.c和keyboard44.h,第 39页,函数内容编写(keyboard44.c),char GetScanCode(void) / 函数首部 /根据功能流程编写函数内容; /函数结束时用return获得返回值; return KeyValue; ,头文件编写(keyboard44.h),char GetScanCode(void);,第 40页,模块的使用方法,函数定义: keyboard44.c 函数声明: keyboard44.h 在项目中添加模块的定义文件keyboard44.c : 在主程序中添加模块的声明文件keyboard44.h: #include “keyboard44.h” main() char chData=0; /临时变量 TRISD=0 x00; / D口输出,控制LED while(1) chData=GetScanCode (); /读取按键 if(chData!=0) / 不等0则显示按键值 PORTD=chData; /扫描码赋值 ,第 41页,思考与练习,6.1 I/O的全称是什么? 6.2 简述4位数码管动态扫描输出原理。 6.3 单片机读取机械按键状态时为什么要消除抖动,如何消除抖动。 6.4 简述44按键动态扫描输入原理。 6.5 电路如图 6.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论