这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 坤创E-Geek/天科大新电社 » 求助!按键不能实现数码管卫位移

共5条 1/1 1 跳转至

求助!按键不能实现数码管卫位移

菜鸟
2019-01-26 20:25:27     打赏
//在数码管上显示字符6,按下外部按键中断0(S5)则8左移动,按下外部按键中断1(S4)则8右移动。
#include<reg52.h>
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char key,keyvalue,y,adress;
unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
//			       0	1     2   3    4     5    6    7   8
void delay(unsigned char n) 
{
	unsigned char j;
	while(n--)
	{
		for(j=0;j<123;j++);
	}	
}
void init0()
{
	IT0=1;
	EX0=1;
	IT1=1;
	EX1=1;
	EA=1;		
} 
void keyscan(void)//按键扫描
{
	key=0x0f;
	if(key!=0x0f)
	{
		delay(10);
		if(key!=0x0f)
		{
			key=0x0f;
			switch(key)//line
			{
				case(0x07):keyvalue=0;break;
				case(0x0b):keyvalue=1;break;
				case(0x0d):keyvalue=2;break;
				case(0x0e):keyvalue=3;break;
			}
			key=0xf0;
			switch(key)//
			{
				case(0x70):keyvalue=keyvalue;break;
				case(0xb0):keyvalue=keyvalue+4;break;
				case(0xd0):keyvalue=keyvalue+8;break;
				case(0xe0):keyvalue=keyvalue+12;break;
			}
			while((y<30)&&(key!=0xf0))
			{
				delay(10);y++;
			}
	
		}
			 		 	
	}		   
}
void weizhi(void)//数码管位选
{
	switch(adress)
	{
		case(0):LSC=0;LSB=0;LSA=0;break;
		case(1):LSC=0;LSB=0;LSA=1;break;
		case(2):LSC=0;LSB=1;LSA=0;break;
		case(3):LSC=0;LSB=1;LSA=1;break;
		case(4):LSC=1;LSB=0;LSA=0;break;
		case(5):LSC=1;LSB=0;LSA=1;break;
		case(6):LSC=1;LSB=1;LSA=0;break;
		case(7):LSC=1;LSB=1;LSA=1;break;
	}
}
void int0() interrupt 0	   //s5左移
{
	EX0=0;
	if(keyvalue==4)
	{
		delay(1);
		if(keyvalue==4)
		{
			adress++;	
		}
	}
	EX0=1;	
}
void int1() interrupt 2	   //s4右移
{	
	EX1=0;
	if(keyvalue==3)
	{
		delay(1);
		if(keyvalue==3)
		{
			adress--;	
		}
	}
	EX1=1;
}
void main()
{	
	
	init0();
	adress=0;
	while(1)
	{	
		keyscan();
		weizhi();
		P0=smgduan[6];	
	}	
}




菜鸟
2019-01-26 21:13:57     打赏
2楼

还在用51啊


菜鸟
2019-01-26 21:23:53     打赏
3楼

if语句,key=0x0f;你不减不加,怎么能 != 0x0f;。


高工
2019-01-26 23:01:24     打赏
4楼

刚刚我试了试你写的程序,根本问题就是keyvalue这个变量你没有清零。在你按下按键之后你得程序一直认为他是3或者是4.所以才会失灵。你可以这样写

  1. if(keyvalue==3)  

  2.     {  

  3.         delay(1);  

  4.         if(keyvalue==3)  

  5.         {  

  6.             keyvalue=0;

  7.             adress--;     

  8.         }  

  9.     }  

加上这一句就可以了。剩下的你应该就懂了


院士
2019-01-27 09:38:22     打赏
5楼

楼主 还是把串口先调试出来吧!

毕竟 51单片机没有在线调试器来输出运行变量


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]