一、实验目的
⑴ 简单I/O引脚的输出 ⑵ 掌握软件延时编程方法 ⑶ 简单按键输入捕获判断 二、实验实现的功能
⑴ 开机是点亮12发光二极管,闪烁三下 ⑵ 按照顺时针循环依次点亮发光二极管
⑶ 通过任意按键将发光二极管的显示改为顺逆时针方式
三、系统硬件设计
四、系统软件设计
#include unsigned char i,j,k; for(i=10;i>0;i--) for(j=132;j>0;j--) for(k=150;k>0;k--); } Scan_Key() { unsigned char FLAG=0; unsigned char n; n=(L1==0)||(L2==0)||(L3==0); if(n) { FLAG=1;} return FLAG; } main() { unsigned char y,n,s=0,b=1,m=0; unsigned char c=1; unsigned char a[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char h[]={0xff,0x38,0x34,0x2f,0x1f}; n=Scan_Key(); for(y=0;y<3;y++) //闪烁三次 { P2=0; P3=0; Delay(); Delay(); Delay(); P2=0xff; P3=0xff; Delay(); Delay(); Delay(); } while(1) { while(1) { m=m+n; P3=0x3f; while(1) //顺时针 { for(;b<9;b++) { n=Scan_Key(); m=m+n; if((P3==0x3f)&&(m%2==0)) {P2=a[b];Delay();} else { P2=0xff;break; } if(m%2==0) c=1; P2=0xff; } for(;c<5;c++) {n=Scan_Key(); m=m+n; if((P2==0xff)&&(m%2==0)) { P3=h[c];Delay();} else { P3=0x3f;break;} } if(m%2==0) b=1; break; } if(m%2==1) break; } while(1) { for(;b>0;b--) {n=Scan_Key(); m=m+n; if((P3==0x3f)&&(m%2==1)) {P2=a[b];Delay(); } else 逆时针 // {P2=0xff;break;} P2=0xff; } if(m%2==1) c=4; for(;c>0;c--) { n=Scan_Key(); m=m+n; if((P2==0xff)&&(m%2==1)) { P3=h[c]; Delay();} else { P3=0x3f;break;} P3=0x3f; } if(m%2==0) break; if(m%2==1) b=8; } } } 五、实验过程中遇到的问题及解决方法 1、用for循环执行顺逆时针循环按下开关后无法原地返回。 解决:在程序开始处为循环变量赋初值,不在for循环之中赋值。 2、检测按键的方式有:H1、H2置0,检测L1、L2、L3;L1、L2、L3置0,检测H1、H2。哪种方式更好? 解决:H1、H2置0更好,因为P3口其他端口用于控制流水灯发光,处于输出状态,若要H1、H2做按键扫描端,容易引起混淆。 3、按键按一下就松手,有时扫描不到。 解决:由于程序每执行一次for循环对按键扫描一次,而执行for循环需要一定时间,故按键时间大于执行一次for循环的时间即可,或者缩短每个灯亮的时间。 4、12个灯分别有P2、P3口控制,如何能实现灯的不间断依次点亮? 解决:以顺时针时为例,当P2口的8个灯亮过后,为其赋值0xff使其全部熄灭,同时将其作为条件使P3口开始点亮二极管。 5、keil不能识别端口名称。 解决:没有包含reg51.h头文件。 6、在main函数中间定义的变量无法识别。 解决:在main函数开头定义即可。 指导老师签字: 日期: 因篇幅问题不能全部显示,请点此查看更多更全内容