资源预览内容
第1页 / 共43页
第2页 / 共43页
第3页 / 共43页
第4页 / 共43页
第5页 / 共43页
第6页 / 共43页
第7页 / 共43页
第8页 / 共43页
第9页 / 共43页
第10页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第五章 输入输出端口的用法数字端口用法数字端口用法【学习目标】&掌握输入输出端口方向的控制方法;掌握输入输出端口方向的控制方法;&熟练掌握数码管动态扫描的设计和编程;熟练掌握数码管动态扫描的设计和编程;&掌握矩阵式键盘设计思路和编程;掌握矩阵式键盘设计思路和编程;2第六章 输入输出端口的用法输入输入/ /输出端口原理输出端口原理1输出端口用法输出端口用法2矩阵小键盘的读取方法矩阵小键盘的读取方法4输入端口用法输入端口用法33第五章 输入输出端口的用法输入输入/ /输出端口原理输出端口原理1输出端口用法输出端口用法2矩阵小键盘的读取方法矩阵小键盘的读取方法4输入端口用法输入端口用法341 1 输入输入/ /输出端口原理输出端口原理5输入/输出端口简介&PIC16F877PIC16F877共有共有4040个引脚,其中有个引脚,其中有3333个个I/OI/O引脚、引脚、与五个端口相对应。与五个端口相对应。PORTAPORTA对应对应RA0RA0到到RA5RA5共共6 6个引脚、个引脚、PORTBPORTB对应对应RB0RB0到到RB7RB7共共8 8个引脚、个引脚、PORTCPORTC对应对应RC0RC0到到RC7RC7共共8 8个引脚、个引脚、PORTDPORTD对应对应RD0RD0到到RD7RD7共共8 8个引脚、个引脚、PORTEPORTE对应对应RE0RE0到到RE2RE2共共3 3个引脚。个引脚。6输入输入/ /输出端口原理输出端口原理7输入/输出端口的相关寄存器位位7 7位位6 6位位5 5位位4 4位位3 3位位2 2位位1 1位位0 0n n当当B B口处于口处于输出输出状态时,状态时,PORTBPORTB的的内容能决定其对应引脚的电平状态。内容能决定其对应引脚的电平状态。1 1对应高电平,对应高电平,0 0对应低电平。对应低电平。n n当当B B口处于口处于输入输入状态时,外部引脚状态时,外部引脚的电平能决定其对应寄存器位的值。的电平能决定其对应寄存器位的值。高电平对应高电平对应1 1,低电平对应,低电平对应0 0。8PIC的方向寄存器TRISX&TRISBTRISB是是PORTBPORTB的方向寄存器。的方向寄存器。&TRISATRISA是是PORTAPORTA的方向寄存器。的方向寄存器。&TRISCTRISC是是PORTCPORTC的方向寄存器。的方向寄存器。&TRISDTRISD是是PORTDPORTD的方向寄存器。的方向寄存器。&TRISETRISE是是PORTEPORTE的方向寄存器。的方向寄存器。&TRISTRISX X也是也是8 8位寄存器。位寄存器。&当当TRISTRISX X某二进制位为某二进制位为1 1时,时,PORTPORTX X对应位处于输入对应位处于输入(Input)(Input)状态。状态。&当当TRISTRISX X某二进制位为某二进制位为0 0时,时,PORTPORTX X对应位处于输出对应位处于输出(Output)(Output)状态。状态。9第五章 输入输出端口的用法输入输入/ /输出端口原理输出端口原理1输出端口用法输出端口用法2矩阵小键盘的读取方法矩阵小键盘的读取方法4输入端口用法输入端口用法310输出端口用法例题111输出端口用法例题1&编程实现跑马灯的运行效果,即编程实现跑马灯的运行效果,即D0D0到到D7D7循环被依循环被依次点亮,但同一时刻只有一个灯亮。单片机主频为次点亮,但同一时刻只有一个灯亮。单片机主频为4MHz4MHz。 12输出端口用法例题代码1.1.main()main()2.2. intint i=0 i=0,DelayCNTDelayCNT=0;=0;3.3. char Data=0; / char Data=0; / 用来记录向用来记录向PORTCPORTC输出内容的变量输出内容的变量 4.4. TRISC=0; / TRISC=0; / 把把C C口置为输出状态口置为输出状态5.5. while(1) / while(1) / 主循环必须是死循环主循环必须是死循环6.6. Data=0x01; / Data=0x01; / 循环的初始值循环的初始值7.7. for(ifor(i=0;i8;i+) /=0;i8;i+) /需要显示需要显示8 8次次8.8. PORTC=Data; / PORTC=Data; / 送送PORTCPORTC显示显示 9.9. for(DelayCNTfor(DelayCNT=0;DelayCNT10000;DelayCNT+) ; =0;DelayCNT10000;DelayCNT+) ; / / 延时延时10.10. Data=Data=DataData1; / 1; / 每显示一次后每显示一次后DataData左移一次左移一次 11.11. 12.12. 13.13. 13多数码管的显示控制 144数码管控制:Proteus原理图15动态扫描基本思想&只让第只让第1 1个数码管亮;个数码管亮;&显示个位显示个位; ;&延时延时20ms20ms;&只让第只让第2 2个数码管亮;个数码管亮;&显示十位显示十位; ;&延时延时20ms20ms;&只让第只让第3 3个数码管亮;个数码管亮;&显示百位显示百位; ;&延时延时20ms; .20ms; .16动态扫描代码的实现1.1.void delay10ms(int m) /void delay10ms(int m) /定义延时函数定义延时函数2.2. 3.3.intint i=0,j=0; i=0,j=0;4.4. for(ifor(i=0;i=0;im;im;i+)+)5.5. for(jfor(j=0;j67;j+) / =0;j67;j+) / 不同频率下不同频率下6767需要修改需要修改6.6. ;7.7. 8.8.const char const char TableNumberTableNumber=0b11000000,0b11111001,0b10100100,=0b11000000,0b11111001,0b10100100,9.9. 0b10110000,0b10011001,0b10010010,0b10000010,0b10110000,0b10011001,0b10010010,0b10000010,10.10. 0b11111000,0b10000000,0b10010000; 0b11111000,0b10000000,0b10010000; /字形码数组字形码数组17动态扫描代码的实现(续)&void void main(voidmain(void) )& TRISB=0x00; TRISB=0x00;& TRISC=0x00; TRISC=0x00;& while(1) while(1)& char i=0,j=0,k=0,Number5=0,0,0,0,0; char i=0,j=0,k=0,Number5=0,0,0,0,0; & Number1=2; Number1=2; Number2=9; Number3=1; Number2=9; Number3=1; Number4=3; Number4=3; &for(ifor(i=0;i10;i+)=0;i10;i+)& PORTC=k=0x01; / PORTC=k=0x01; / 每次循环不要忘记每次循环不要忘记k k赋初始值赋初始值& for(jfor(j=1;j=4;j+) / =1;j=4;j+) / 共需要刷新四个数码管位置共需要刷新四个数码管位置& PORTC=k; / PORTC=k; /设置要点亮的位置设置要点亮的位置& PORTB=PORTB=TableNumberNumberjTableNumberNumberj; /; /设置字形设置字形& delay10ms(1); / delay10ms(1); / 延时显示字形延时显示字形, ,造成视觉暂留现象造成视觉暂留现象& k=k1; / k=k1; / 左移为显示下一位置做准备左移为显示下一位置做准备& & & & 18将数码管扫描写成函数形式”seg4.h”&#ifndef _SEGMENT74_H_ / #ifndef _SEGMENT74_H_ / 防止重复编译本头文件防止重复编译本头文件&#define _SEGMENT74_H_#define _SEGMENT74_H_&#define SEG_BITSEL_PORT #define SEG_BITSEL_PORT PORTC / PORTC / 位选端口位选端口&#define SEG_BITSEL_PORT_DIR TRISC#define SEG_BITSEL_PORT_DIR TRISC / / 位选端口的方向寄存器位选端口的方向寄存器&#define SEG_FONT_PORT#define SEG_FONT_PORT PORTB / PORTB / 字形输出端口字形输出端口&#define SEG_FONT_PORT_DIR #define SEG_FONT_PORT_DIR TRISB TRISB / / 字形端口的方向寄存器字形端口的方向寄存器&void DisplayData(unsigned int iData);void DisplayData(unsigned int iData);19将数码管扫描写成函数形式”seg4.c”1.1.void void DisplayData(unsignedDisplayData(unsigned intint Data) Data)2.2. char i=0,j=0,k=0,Number5=0,0,0,0,0; /Number0char i=0,j=0,k=0,Number5=0,0,0,0,0; /Number0未用未用3.3. Number1=Data/1000; / Number1=Data/1000; / 千位千位4.4. Number2=Data%1000/100; / Number2=Data%1000/100; / 百位百位5.5. Number3=Data%100/10; / Number3=Data%100/10; / 十位十位6.6. Number4=Data%10; / Number4=Data%10; / 个位个位7.7.for(ifor(i=0;i10;i+)=0;i10;i+)8.8. 9.9. SEG_BITSEL_PORT=k=0x01; / SEG_BITSEL_PORT=k=0x01; / 每次循环不要忘记每次循环不要忘记k k赋初始值赋初始值10.10. for(jfor(j=1;j=4;j+) / =1;j=4;j+) / 共需要刷新四个数码管位置共需要刷新四个数码管位置11.11. 12.12. SEG_BITSEL_PORT=k; / SEG_BITSEL_PORT=k; /设置要点亮的位置设置要点亮的位置13.13. SEG_FONT_PORT=SEG_FONT_PORT=TableNumberNumberjTableNumberNumberj; /; /设置字形设置字形14.14. delay10ms(2); / delay10ms(2); / 延时显示字形延时显示字形, ,造成视觉暂留现象造成视觉暂留现象15.15. k=k1; / k=k1; / 左移为显示下一位置做准备左移为显示下一位置做准备16.16. 17.17. 18.18. 20在主程序中调用1.1./四位数码管动态扫描主程序,主频为四位数码管动态扫描主程序,主频为4MHz4MHz2.2.#include #include pic.hpic.h 3.3.#include #include delay.hdelay.h 4.4.#include seg74.h#include seg74.h5.5. _CONFIG(HS & WDTDIS & LVPDIS); _CONFIG(HS & WDTDIS & LVPDIS);/ / 设置用于设置用于ICD2ICD2调试的调试的控制字控制字6.6.void void main(voidmain(void) )7.7. intint Data=2913; Data=2913;8.8. SEG_BITSEL_PORT_DIR=0x00; / SEG_BITSEL_PORT_DIR=0x00; / 位选方向寄存器位选方向寄存器9.9. SEG_FONT_PORT_DIR=0x00; / SEG_FONT_PORT_DIR=0x00; / 字形方向寄存器字形方向寄存器10.10. while(1)while(1)11.11. 12.12. DisplayData(DataDisplayData(Data););13.13. 14.14. 21第五章 输入输出端口的用法输入输入/ /输出端口原理输出端口原理.1输出端口用法输出端口用法2矩阵小键盘的读取方法矩阵小键盘的读取方法4输入端口用法输入端口用法322输入端口基本用法&char char chTmpchTmp; ;&TRISB=0xFF; / BTRISB=0xFF; / B口全置为输入状态口全置为输入状态&chTmpchTmp=PORTB; =PORTB; / / 读取读取B B口当前状态并保存在变量口当前状态并保存在变量chTmpchTmp中中23单个按键状态的读取分析 &当当K1K1未按下时,未按下时,RB0RB0通过通过电阻电阻R9R9与电路中的供电电与电路中的供电电源信号源信号VCCVCC相连,使相连,使RB0RB0的的电位也为高电平。即电位也为高电平。即RB0RB0输输入值为入值为1 1。&当当K1K1按下时,按下时,RB0RB0与接地与接地信号信号GNDGND相连,使相连,使RB0RB0输入输入为低电平,即逻辑的为低电平,即逻辑的0 0。由。由于有于有R9R9的存在,即使的存在,即使K1K1按按下也不会使下也不会使VCCVCC和和GNDGND短路。短路。 24按键输入引脚电平抖动示意图 25单个按键输入例题&要求编程实现每按一次要求编程实现每按一次K1K1按键使数码管显示内容按键使数码管显示内容加一。加一。 26例题程序代码1.1.#define SW RD0 /#define SW RD0 /在程序中用在程序中用SWSW代表代表RD0RD02.2.void void main(voidmain(void) )3.3. intint Data=0; Data=0;4.4. TRISD0=1; / RD0 TRISD0=1; / RD0 置位输入状态置位输入状态5.5. SEG_BITSEL_PORT_DIR=0x00;SEG_BITSEL_PORT_DIR=0x00;6.6. SEG_FONT_PORT_DIR=0x00; SEG_FONT_PORT_DIR=0x00;7.7. while(1) while(1)8.8. if(SWif(SW=0) / =0) / 检测到检测到SWSW变化变化9.9. delay10ms(40); / delay10ms(40); /在在ISISISIS中的按钮按下到抬起过程比较长。中的按钮按下到抬起过程比较长。10.10. / / 如果是实际硬件的话,延时如果是实际硬件的话,延时1010毫秒即可。毫秒即可。11.11. if(SWif(SW=0) /=0) /这说明这说明SWSW真的按下了真的按下了12.12. Data+; Data+; 13.13. 14.14. DisplayData(DataDisplayData(Data); /); /在数码管上显示变量内容在数码管上显示变量内容15.15. 16.16. 27第五章 输入输出端口的用法输入输入/ /输出端口原理输出端口原理1输出端口用法输出端口用法2矩阵小键盘的读取方法矩阵小键盘的读取方法4输入端口用法输入端口用法328矩阵小键盘的读取方法 &在实际项目中可能会用到更多的按键输入,例如在实际项目中可能会用到更多的按键输入,例如银行密码输入按键需要十几个按键,计算机键盘需银行密码输入按键需要十几个按键,计算机键盘需要一百多个按键。如果每个按键都要独占一个要一百多个按键。如果每个按键都要独占一个I/OI/O引脚的话会很浪费单片机资源并且程序编写也非常引脚的话会很浪费单片机资源并且程序编写也非常冗长。冗长。&如何解决这个问题?如何解决这个问题?&工程中常用矩阵扫描法实现多按键输入的识别,工程中常用矩阵扫描法实现多按键输入的识别,用少量的用少量的I/OI/O引脚即可识别多个按键,这是一种典引脚即可识别多个按键,这是一种典型的软硬件结合设计。型的软硬件结合设计。 29 44矩阵式键盘与单片机连接原理图 30扫描式键盘简单示意图当当RC4输出输出0时,时,SW2状态能从状态能从RC3读入;读入;当当RC3输出输出0时,时,SW2状态能从状态能从RC4读入;读入;01 03144键盘矩阵原理图示意图RC4RC5RC6RC7RC0RC1RC2RC30000111101 0 1 13244键盘矩阵原理图示意图RC4RC5RC6RC7RC0RC1RC2RC31111000001 1 1 033基于C口的44键盘矩阵的扫描流程图C口高四位输出口高四位输出0 ,低四位输入,低四位输入C口低四位为口低四位为1111吗?吗?延时延时20ms左右消除抖动左右消除抖动NC口高四位为口高四位为1111吗?吗?YKeyH4=C口高四位口高四位NKeyL4=C口低四位口低四位C口高四位输入,低四位输出口高四位输入,低四位输出0KeyValue=KeyL4 | KeyH4;Y无按键无按键KeyValue=0;34基于C口的44键盘矩阵的扫描代码char char KeyValueKeyValue=0,keyH4=0,keyL4=0;=0,keyH4=0,keyL4=0;/ / KeyValueKeyValue保存键值,保存键值,KeyH4KeyH4保存高四位保存高四位,TRISC=0x0F; /TRISC=0x0F; /高四位输出,低四位输入高四位输出,低四位输入PORTC=0x00; /PORTC=0x00; /高四位输出高四位输出00000000asm(nopasm(nop); / ); / 延时等待输出稳定延时等待输出稳定asm(nopasm(nop); / ); / 延时等待输出稳定延时等待输出稳定keyL4=PORTC; / keyL4=PORTC; / 读取低四位内容读取低四位内容keyL4=keyL4&0x0F; /keyL4=keyL4&0x0F; /屏蔽高四位屏蔽高四位, ,书写格式?书写格式?if(keyL4!=0x0F) / if(keyL4!=0x0F) / 低四位不为低四位不为11111111说明有键按下说明有键按下 iDelayMS(20); iDelayMS(20); / / 软件消除抖动软件消除抖动 / / 未完待续未完待续 35基于C口的44键盘矩阵的扫描代码(续) TRISC=0xF0; / TRISC=0xF0; / 高四位输入,低四位输出高四位输入,低四位输出 PORTC=0x00; /PORTC=0x00; /低四位输出低四位输出00000000 asm(“nopasm(“nop”); / ”); / 延时等待输出稳定延时等待输出稳定 asm(“nopasm(“nop”); / ”); / 延时等待输出稳定延时等待输出稳定 keyH4=PORTC; / keyH4=PORTC; / 读取高四位内容读取高四位内容 keyH4=keyH4=keyH4keyH4 & 0xF0; / & 0xF0; /屏蔽低四位屏蔽低四位 if(keyH4 != 0xF0) /if(keyH4 != 0xF0) /不等于不等于11111111说明不是抖动说明不是抖动 KeyValueKeyValue=keyH4 | keyL4 ; =keyH4 | keyL4 ; / / 高低高低4 4位通过或运算组成一个字节位通过或运算组成一个字节 PORTD=PORTD=KeyValueKeyValue; / ; / 送送D D口显示口显示364*4键盘扫描电路图运行图示37如何写成函数形式(函数模块编写方法)?&明确函数的功能明确函数的功能: :&获得按键的键值获得按键的键值, ,即扫描码即扫描码( (高四位高四位+ +低四位低四位););&函数起名为函数起名为: :GetScanCodeGetScanCode&明确函数的输入明确函数的输入( (参数参数) )和输出和输出( (返回值返回值):):&输入参数输入参数: : 无无; ;&输出输出: : 按键的扫描码按键的扫描码, ,是是8 8位数据位数据,char,char型即可型即可. .&则函数声明为则函数声明为: :&char char GetScanCode(voidGetScanCode(void););&由于此函数功能相对独立由于此函数功能相对独立, ,所以建立一个所以建立一个.c.c文件保存函数内文件保存函数内容容, ,同时建立同时建立.h.h文件保存函数声明文件保存函数声明. .设分别为设分别为keyboard44.ckeyboard44.c和和keyboard44.hkeyboard44.h38函数内容编写(keyboard44.c)char char GetScanCode(voidGetScanCode(void) / ) / 函数首部函数首部 / /根据功能流程编写函数内容根据功能流程编写函数内容; ; / /函数结束时用函数结束时用returnreturn获得返回值获得返回值; ;return return KeyValueKeyValue; ; 头文件编写(keyboard44.h)char char GetScanCode(voidGetScanCode(void) ); ;39模块的使用方法&函数定义函数定义: keyboard44.c: keyboard44.c&函数声明函数声明: keyboard44.h: keyboard44.h&在项目中添加模块的定义文件在项目中添加模块的定义文件keyboard44.c :keyboard44.c :&在主程序中添加模块的声明文件在主程序中添加模块的声明文件keyboard44.h:keyboard44.h:&#include “keyboard44.h”#include “keyboard44.h”&main()main()& char char chDatachData=0; /=0; /临时变量临时变量& TRISD=0x00; / DTRISD=0x00; / D口输出口输出, ,控制控制LEDLED&while(1)while(1)& chDatachData= =GetScanCodeGetScanCode (); / (); /读取按键读取按键&if(chDataif(chData!=0) / !=0) / 不等不等0 0则显示按键值则显示按键值& PORTD=PORTD=chDatachData; /; /扫描码赋值扫描码赋值& & 40思考与练习&6.1 I/O6.1 I/O的全称是什么?的全称是什么?&6.2 6.2 简述简述4 4位数码管动态扫描输出原理。位数码管动态扫描输出原理。&6.3 6.3 单片机读取机械按键状态时为什么要消除抖单片机读取机械按键状态时为什么要消除抖动,如何消除抖动。动,如何消除抖动。&6.4 6.4 简述简述4444按键动态扫描输入原理。按键动态扫描输入原理。&6.5 6.5 电路如图电路如图 6.186.18所示。要求编程控制所示。要求编程控制LEDLED实现实现效果:效果:D0D0到到D7D7依次全被点亮,即先是依次全被点亮,即先是D0D0亮,过一会亮,过一会儿是儿是D0D0和和D1D1亮,再过一会儿是亮,再过一会儿是D0D0、D1D1、D2D2亮,亮,最后是,最后是D0D0到到D7D7全亮,而后是重新循环。全亮,而后是重新循环。41思考与练习&6.6 6.6 用用“Proteus ISIS”Proteus ISIS”设计单片机控制两只数码管的电设计单片机控制两只数码管的电路。并编程实现在数码管上循环加一的显示路。并编程实现在数码管上循环加一的显示0 0到到9999的数字。的数字。&6.7 6.7 请把请把【例例6.76.7】中基于矩阵键盘扫描的中基于矩阵键盘扫描的C C语言代码采用语言代码采用模块化的函数形式改写,函数名为模块化的函数形式改写,函数名为GetKeyGetKey,返回值为某个,返回值为某个按键的扫描码,并用此函数改写源程序相关部分。按键的扫描码,并用此函数改写源程序相关部分。42提问时间43
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号