独立键盘流水灯,为什么多了P2 = 0xf0;就不能工作?
P2为独立键盘,P0接流水灯,为什么主函数下多了P2 = 0xf0;就不能工作(按下键盘后立即熄灭),而去掉P2 = 0xf0;反而正常工作呢?请大虾帮忙分析下,谢谢。这个问题想了好久还是没想通,特此来求教。
# include <reg51.h>
# include <intrins.h>
sbit sw1 = P2^4;
sbit sw2 = P2^5;
unsigned int n=0, val=0;
void delay(unsigned int i)
{
unsigned int j;
for(j=0; j<i; j++);
}
int main ()
{
P0 = 0xfe;
P2 = 0xf0;
TMOD = 0x01;
TH0 = ( 65536-50000)/256;
TL0 = ( 65536-50000)%256;
TR0 = 1;
ET0 = 1;
EA = 1;
while(1)
{
switch(val)
{
case 1: for(n=0; n<8; n++){P0 = _crol_(P0, 1);delay(10000);} break;
case 2: for(n=0; n<8; n++){P0 = _crol_(P0, 1);delay(30000);} break;
}
}
}
void T() interrupt 1
{
if(sw1 == 0)
val = 1;
if(sw2 == 0)
val = 2;
}
不是复制的,自己写的。
还有unsigned int j;
for(j=0; j<i; j++);
j已经赋值了。
i 是delay(10000)的形参。
与你的按键有关吧,if(sw1==0)if(sw2==0) 为何又要给P2 0xf0;
因为我本来想这样的:
void T() interrupt 1
{
if((P2&0xf0) != 0xf0)
{
if(sw1 == 0)
{
val = 1;
}
if (sw2 == 0)
{
val = 2;
}
}
}
按下键就熄灭。还有我把P2=0xf0的高四位拉高来检测键盘,理论上没错啊。低四位是扫描用的。
你的按键应该是每个都有接地;若是扫描键盘,检测完P2!=0XF0后,应该有个把低4位逐个为0来判断哪个键按下的函数
1、main函数无返回值,为什么用int型的?
2、sw1==0的时候val=1;当再使sw2==0的时候,貌似sw1还是0,并没有给P2重新赋值?
我刚试了,可以啊,都可以正常运行和闪亮额、、、
就我的单片机而言,
P2=0xf0;对程序没有影响。
因为单片机刚上电时,端口都为高点平,即P2口为:1111 1111 。
而:P2=0xf0->1111 0000,P2口的高四位没有改变,直到人为按下才会改变,执行。
(Ps:我的P2口高四位为独立键盘、、板子为Tx-1C)
程序已经好了,是硬件问题。 当然变量 i 最好先赋值,谢谢。
软件是好的,是硬件的问题,谢谢。
