helloyf helloyf
关注数: 16 粉丝数: 23 发帖数: 515 关注贴吧数: 4
各位大神帮忙看看,为什么矩阵键盘不能用,哪里出毛病了? 大神看看这个程序为什么不能操作,按下矩阵键盘S6~S9,数码管显示4~1。 #include<reg52.h>//52头文件 #define uint unsigned int//宏定义 #define uchar unsigned char uchar code table[]={//共阴数码管代码0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,0x49}; uchar num,temp; sbit EN=P3^3;//锁存器使能端口 sbit dula=P3^7;//锁存允许端口 void delay(uint z)//延时子程序 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void keyscan();//声明键盘扫描函数 void display(uchar num);//声明显示函数 void main()//主函数 { while(1) { keyscan();//不停调用键盘扫描程序 } } void display(uchar num) //显示子程序 { EN=0; //锁存器使能 dula=1; //允许锁存 P1=table[num]; //段选 P2=0x00; //位选 } void keyscan() //键盘扫描子程序 { EN=1; //锁存器去使能,74HC573输出为高阻态不受控 P2=0xfe; //令P2.0为低电平,也就是键盘第一行的行线为低电平 temp=P2; //将P2值0xfe赋于temp temp=temp&0xf0; //temp与0xf0进行与运算,结果赋给temp if(temp!=0xf0) //判断temp是否不等于0xf0 { //如果temp不等于0xf0,说明高4位有0,也就是某一列为零,即第一行的某一按键被按下 delay(5); //延迟5秒去抖后再检测 temp=P2; //重新读一次P2口数据 temp=temp&0xf0; //重新进行一次与运算 if(temp!=0xf0) //如果temp仍然不等于0xfe,这次确认第一行确实有键被按下 { temp=P2; //将P2口数据赋于temp switch(temp) //判断temp值 { case 0xee:num=1; //temp为0xee,说明是第1个按键被按下,将1赋于num。 break; //退出switch语句 case 0xde:num=2; //temp为0xde,说明是第2个按键被按下,将2赋于num。 break; case 0xbe:num=3; //temp为0xbe,说明是第3个按键被按下,将3赋于num。 break; case 0x7e:num=4; //temp为0x7e,说明是第4个按键被按下,将4赋于num。 break; } while(temp!=0xf0) //等待按键释放 { //否则不停检测按键是否被释放 temp=P2; //继续将P2赋于temp temp=temp&0xf0; //继续将temp与0xf0进行与运算,结果赋给temp } display(num); } } }
定时器为什么用方式1可以,方式2就不行,哪儿出问题了? 程序要求:在P2.3口(个位),P2.2口(十位)实现59s循环计时。 我的电路跟郭天祥的有些区别,但是原理一样,现在是方式1可以完成功能,方式2却总只显示两个00,无法递增,是什么问题? 这个是方式1: #include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void display(uchar,uchar); void delayms(uint); uchar t1,t2,shi,ge; void main() { P3=0x80; TMOD=0x01; //定时器0方式1 TH0=15536/256; //初值,12M晶振 计数值50000,即50ms TL0=15536%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0 while(1) //不停扫描数码管并等待中断发生 { display(shi,ge); } } void display(uchar shi,uchar ge) //显示子函数 { P1=table[ge]; P2=0xff; P2=0xf7; //显示个位 delayms(5); P1=table[shi]; P2=0xff; P2=0xfb; //显示十位 delayms(5); } void delayms(uint xms) //延时 { uint x,y; for(x=91;x>0;x--) for(y=xms;y>0;y--); } void time() interrupt 1 //定时器0中断 { TH0=(65536-50000)/256; //重装初值 TL0=(65536-50000)%256; t1++; if(t1==20) //如果到了20次,说明1秒时间到 { t1=0; //清0重新计20次 t2++; if(t2==60) //到60后归0 t2=0; shi=t2/10; //将2位数分离送数码管显示。 ge=t2%10; } } 方式2就是更改了 TMOD=0x02 //定时器0方式2 TH0=6; //初始值为250,即250us TL0=6; 中断子程序里的 TH0和TL0语句去掉,因为重装初值。 if(t1==20)改成if(t1==4000),也还是1秒。 但是这样修改了后,就是不能正常显示,why?
1 下一页