编好了一个控制流水灯的程序,思路是在没有开关闭合的时候P1的灯是流水灯状态,如果开关闭合,控制P1处的灯以两种不同的模式交替点亮,
这个程序在keil的编译中没有错误,但是在Proteus仿真中,我发现P1的灯并不会对按键有反应,始终保持流水灯的状态,就算是长时间保持开关闭合,也并不会发生P1口的灯改变闪烁模式的情况,这个问题困扰了我很长时间,我认为既然开关按下,在if中就可以根据P3.3,P3.2口的状态进行相应的函数调用,但是在仿真中这没有发生,谁知道是为什么吗?
从这个视频中可以看出,P1的灯对开关没有反应
单片机源程序如下:
- #include<reg51.h>//头文件
- #include<intrins.h>
- #define uchar unsigned char
- void delay(unsigned int i)//控制灯亮时间的延时函数
- {
- uchar t;
- while(i--)
- {
- for(t=0;t<120;t++);
- }
- }
- void light_0()//控制灯亮的第一种模式
- {
- uchar m;
- for(m=0;m<5;m++)
- {
- P1=0x0f;//P1口高四位灯亮
- delay(500);
- P1=0xf0;//p1口第四位灯亮
- delay(500);
- }
- }
- void light_1()//灯亮的第二种模式
- {
- uchar n;
- for(n=0;n<5;n++)
- {
- P1=0xff;//P1口全为高电平,灯灭
- delay(500);
- P1=0x00;//P1口全为低电平,灯亮
- delay(500);
- }
- }
- void main()//主程序
- {
- uchar temp_0,temp_1;
- P1=0xfe;
- while(1)
- {
- temp_0=P3&0x40;//将P3.2口的电位值赋给temp_0
- temp_1=P3&0x80;//将P3.3口的电位值赋给temp_1
- P1=_crol_(P1,1);循环左移
- delay(500);//保持灯亮
- if(temp_0==0)//判断P3.2口的电位大小
- light_0();//如果是低电平,执行灯亮模式一的函数
- if(temp_1==0)//检查P3.3口的电平
- light_1();//如果P3.3口是低电平,执行灯亮模式二的函数
-
- }
- }
复制代码
|