第六集 IO输入输出 1. 什么是GPIO:General Purpose I/O Ports 通用输入输出端口;是单片机与外界交换信息的一种途径;通过端口引脚上高低电平的变化来传递和交换信息。高低电平是相对于系统的而言的,3.3v供电系统与5v的供电系统,其高低电平的电压值是不同的,需要特别注意,不同供电电压的系统之间在交换信息时,需要进行电平转换。 GPIO口的4种工作模式:1.准双向口 2.推挽输出 3.高阻输入 4.开漏模式 要注意各个模式的带负载能力是不同的! 2. 按键输入检测与按键消抖 单片机通过连接到GPIO口的按键在按下与弹起时IO口电平的变化,来检测按键。由于按键的机械特性决定了按键在按下与弹起时必然会有抖动,这个抖动会引起IO口电平的抖动,从而使得单片机产生错误动作,必须消除此抖动;通过科学的手段,测得这个抖动的时间约为20毫秒,可以通过编程延时来达到消除抖动的目的。 3. 课后小练
练习一 代码如下:
/* 实验板 - 擎天柱 */ #include "ai8051u.h" #include "ai_usb.h"
void Delay20ms(void) //@40.000MHz { unsigned long edata i;
_nop_(); _nop_(); i = 199998UL; while (i) i--; }
void main(void) { EAXFR = 1; WTST = 0; CKCON = 0; P0M0 = 0x00; P0M1 = 0x00; //初始化P0口为准双向口模式 P1M0 = 0x00; P1M1 = 0x00; //初始化P1口为准双向口模式 P2M0 = 0x00; P2M1 = 0x00; //初始化P2口为准双向口模式 P3M0 = 0x00; P3M1 = 0x00; //初始化P3口为准双向口模式 P4M0 = 0x00; P4M1 = 0x00; //初始化P4口为准双向口模式 P5M0 = 0x00; P5M1 = 0x00; //初始化P5口为准双向口模式 P6M0 = 0x00; P6M1 = 0x00; //初始化P6口为准双向口模式 P7M0 = 0x00; P7M1 = 0x00; //初始化P7口为准双向口模式 usb_init(); EA = 1; while(1) { if(P32==0) { Delay20ms(); //延时20ms按键消抖 if(P32==0) { P2=0xa5; //修改 0xfe 可以控制每次按P32键亮亮灯的方式 } } if(P33==0) { Delay20ms(); //延时20ms按键消抖 if(P33==0) { P2=0x5a; //修改 0xff 可以控制每次按P33键亮灭灯的方式 } } } }
练习二 代码如下:
/* 实验板 - 擎天柱 */ #include "ai8051u.h" #include "ai_usb.h" #include "intrins.h"
unsigned char cc=0xfe;
void Delay20ms(void) //@40.000MHz { unsigned long edata i;
_nop_(); _nop_(); i = 199998UL; while (i) i--; }
void main(void) { EAXFR = 1; WTST = 0; CKCON = 0;
P0M0 = 0x00; P0M1 = 0x00; //初始化P0口为准双向口模式 P1M0 = 0x00; P1M1 = 0x00; //初始化P1口为准双向口模式 P2M0 = 0x00; P2M1 = 0x00; //初始化P2口为准双向口模式 P3M0 = 0x00; P3M1 = 0x00; //初始化P3口为准双向口模式 P4M0 = 0x00; P4M1 = 0x00; //初始化P4口为准双向口模式 P5M0 = 0x00; P5M1 = 0x00; //初始化P5口为准双向口模式 P6M0 = 0x00; P6M1 = 0x00; //初始化P6口为准双向口模式 P7M0 = 0x00; P7M1 = 0x00; //初始化P7口为准双向口模式
usb_init(); EA = 1; while(1) { if(P33==0) { Delay20ms(); //延时20ms消抖 if(P33==0) { P2=cc; if(cc==0) { cc=0xff; //变量cc恢复初始值 } while(P33==0); //等待P33按键松开 cc<<=1; //变量cc左移一位,最右位补0 } } } }
KEY_LED1.rar
(73.87 KB, 下载次数: 3)
KEY_LED2.rar
(74.23 KB, 下载次数: 4)
|