5.按键检测实验 第五章 GPIO输入输出 GPIO 简介 GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。 高电平就是指接近于电源正极电压的电平;也叫逻辑“1”; 单片机输出高电平就是输出VCC电压,输出低电平就是输出GND的电压。 按键输入检测 代码实现原理:程序直接读取按键的IO的电平即可,一般使用”==”即可 案例1 : 按下P32按钮灯亮,松开P32按钮灯灭; P40 = 0; if( P32 == 0 ) //判断P32按钮是否按下 { P00 = 0; } else { P00 = 1; } 案例2 : 按下P32按钮灯灭,松开P32按钮灯亮; P40 = 0; if( P32 == 1 ) //判断P32按钮是否按下 { P00 = 0; } else { P00 = 1; } 案例3 : 按一下灯亮,按一下灯灭; u8 state = 0; //初始状态 void Delay20ms(void) //@24.000MHz Delay20ms(); { unsigned long edata i;
_nop_(); _nop_(); i = 119998UL; while (i) i--; } P40 = 0; if( P32 == 0 ) //判断P32按钮是否按下 { Delay20ms(); //延时20ms消抖 if( P32 == 0 ) { state = !state; //变量取反 0 1 0 1 0 1 P00 = state; printf("state:%d\r\n",(int)state); while( P32 == 0 ); //松键检测 } } 机械按键按下或者松开有抖动,一般在20ms内。 WTST = 0; //设置程序指令延时参数, EAXFR = 1; //扩展寄存器(XFR)访问使能 CKCON = 0; //提高访问XRAM速度 案例4 : 按一下P32按钮灯亮,按一下P33按钮灯灭; u8 state = 0; //初始状态 void Delay20ms(void) //@24.000MHz Delay20ms(); { unsigned long edata i;
_nop_(); _nop_(); i = 119998UL; while (i) i--; } P40 = 0; if( P32 == 0 ) //判断P32按钮是否按下 { Delay20ms(); //延时20ms消抖 if( P32 == 0 ) { P00 = 0; //灯亮 while( P32 == 0 ); //松键检测 } } if( P33 == 0 ) //判断P33按钮是否按下 { Delay20ms(); //延时20ms消抖 if( P33 == 0 ) { P00 =1; //灯灭 while( P33 == 0 ); //松键检测 } }
案例5 : 按一下亮一颗灯,在按一下亮两颗灯,直到全亮(变量+加法和乘法) u8 state = 0; //初始状态 void Delay20ms(void) //@24.000MHz Delay20ms(); { unsigned long edata i;
_nop_(); _nop_(); i = 119998UL; while (i) i--; } P40 = 0; if( P32 == 0 ) //判断P32按钮是否按下 { Delay20ms(); //延时20ms消抖 if( P32 == 0 ) { state ++; //变量取反 灯亮数量自加 Switch( state ) { case 1 : P00 = 0; break//1灯亮 case 2 : P01 = 0; break//2灯亮 case 3 : P02 = 0; break//3灯亮 case 4 : P03 = 0; break//4灯亮 case 5 : P04 = 0; break//5灯亮 case 6 : P05 = 0; break//6灯亮 case 7 : P06 = 0; break//7灯亮 case 8 : P07 = 0; state =0;break//8灯亮 default : P00 = 1;P01 = 1;P02 = 1;P03 = 1;P04 = 1;P05 = 1;P06 = 1;P07 = 1; break//8灯灭 } printf("state:%d\r\n",(int)state); while( P32 == 0 ); //松键检测 } }
|