1、中断定时1ms,那么一秒刷新一次应该是for(i<=1000)还是(i<999)?
2.
直接P1 等于一个值,P1^0对应的是这个值的二进制最低位还是最高位?
最低
3、下边代码为何能使小灯和一个数码管同时亮
#include<reg52.h> //控制数码亮还是小灯亮 sbit P20 = P2^0; sbit P21 = P2^1; sbit P22 = P2^2; sbit ENLED = P1^1; unsigned char T0RH = 0; unsigned char T0RL = 0; bit flagls =1; unsigned char code LedChar[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; unsigned char LedBuff[7] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ,0xff //0x11,0x12,0x14,0x24,0x12,0x44 }; //最后一位控制小灯 void ConfigTimer0(unsigned int ms); void LedScan(); void TrafficLight(); void main() { int i; ENLED = 0; //EA = 1; P20 = 1; P21 = 0; P22 = 1; //P0 = 127; ConfigTimer0(1); // while(1) // { // //if(flagls == 1) // if(flagls) // { // flagls=0; // TrafficLight() ; // } // } //测试代码 i=0; P2 = (P2&0xF8)|(~(i+1)); P0 = 0x00;//LedBuff[i]; }
电路图如下
找问题:
1 #include<reg52.h> 2 //控制数码亮还是小灯亮 3 sbit P20 = P2^0; 4 sbit P21 = P2^1; 5 sbit P22 = P2^2; 6 7 sbit ENLED = P1^1; 8 9 //unsigned char T0RH = 0; ////////////////// 10 //unsigned char T0RL = 0; ///////////// 11 12 //bit flagls =1; //////////////////// 13 // 14 //unsigned char code LedChar[] = { 15 // 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 16 // 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E 17 //}; 18 // 19 //unsigned char LedBuff[7] = { 20 // 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ,0xff 21 // //0x11,0x12,0x14,0x24,0x12,0x44 22 //}; //最后一位控制小灯 23 24 25 //void ConfigTimer0(unsigned int ms); 26 //void LedScan(); 27 //void TrafficLight(); 28 29 void main() 30 { int i; 31 ENLED = 0; 32 //EA = 1; 33 34 // P20 = 1; 35 // P21 = 0; 36 // P22 = 1; 37 //P0 = 127; 38 39 //ConfigTimer0(1); 40 // while(1) 41 // { 42 // //if(flagls == 1) 43 // if(flagls) 44 // { 45 // flagls=0; 46 // TrafficLight() ; 47 // } 48 // } 49 50 //测试代码 51 i=0; 52 P2 = (P2&0xF8)|(~(i+1)); 53 P0 = 0x00;//LedBuff[i]; 54 55 }
此时只有小灯亮;
如若不讲34、35、36代码注释,则小灯和一个数码管亮。
但是不管只有小灯亮还是数码管和小灯一起亮,显示亮度都比较暗,为了方便观看代码,下边将注释删掉
1 #include<reg52.h> 2 //控制数码亮还是小灯亮 3 sbit P20 = P2^0; 4 sbit P21 = P2^1; 5 sbit P22 = P2^2; 6 7 sbit ENLED = P1^1; 8 9 10 11 void main() 12 { int i; 13 ENLED = 0; 14 15 16 P20 = 1; 17 P21 = 0; 18 P22 = 1; 19 20 i=0; 21 P2 = (P2&0xF8)|(~(i+1)); 22 P0 = 0x00;//LedBuff[i]; 23 24 }
接下来查找是那行代码影响了数码管,经测试是第17行,P21不注释则小灯和一个数码管亮。注释则只有小灯亮;
接下来分析代码
P2 = (P2&0xF8)|(~(i+1));
0xF8二进制为1111 1000
与P2进行与操作,高五位不变,低三位置零
i=0,则i+1=1,二进制为0x0000 0001
进行非运算得二进制1111 1110
1111 1000与1111 1110进行或运算得
1111 1110,低三维为110,即P2^0 = 0, P2^1 = 1, P2^2 = 1.
查询三八译码器转换值
只有Y6输出低电平,即正常情况只有小灯会亮
分析失败!!!!!!!!!!!!!!!!
----------------------------------------------------分割线-------------------------------------------------------
问题解决,大佬说因为没加while,百度了下
不加的话,一直循环执行整个程序,所以会出现这种情况