单片机:按键(使用中断)控制数码管的数字加减(c语言实现)

本实验的目的:

使用中断实现通过编号为8和C的按键控制数码管数字的加减,加至15之后再循环到0,减到0之后保持0不变。

#include <reg52.h>


sbit WEI=P2^7;
sbit DUAN=P2^6;

void delay(int t)
{
    while(t--);
}
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码



unsigned char KeyScan(void)  //键盘扫描函数,使用行列逐级扫描法
{
 unsigned char Val;
 P3=0xf0;//高四位置高,低四位拉低
 if(P3!=0xf0)//表示有按键按下
   {
    //DelayMs(10);  //去抖
	if(P3!=0xf0)
	  {           //表示有按键按下
    	P3=0xfe; //检测第一行
		if(P3!=0xfe)
	  		{
			  Val=P3&0xf0;
	  	      Val+=0x0e;
	  		  while(P3!=0xfe);
		
			  while(P3!=0xfe); 
	     	  return Val;
	        }
        P3=0xfd; //检测第二行
		if(P3!=0xfd)
	  		{
			  Val=P3&0xf0;
	  	      Val+=0x0d;
	  		  while(P3!=0xfd);
		
			  while(P3!=0xfd);
	     	  return Val;
	        }
    	P3=0xfb; //检测第三行
		if(P3!=0xfb)
	  		{
			  Val=P3&0xf0;
	  	      Val+=0x0b;
	  		  while(P3!=0xfb);
		
			  while(P3!=0xfb);
	     	  return Val;
	        }
    	P3=0xf7; //检测第四行
		if(P3!=0xf7)
	  		{
			  Val=P3&0xf0;
	  	      Val+=0x07;
	  		  while(P3!=0xf7);
		
			  while(P3!=0xf7);
	     	  return Val;
	        }
     }
   }
  return 0xff;
}

/*------------------------------------------------
         按键值处理函数,返回扫键值
------------------------------------------------*/
unsigned char KeyPro(void)
{
 switch(KeyScan())
 {
  case 0xee:return 0;break;//0 按下相应的键显示相对应的码值
  case 0xde:return 1;break;//1
  case 0xbe:return 2;break;//2
  case 0x7e:return 3;break;//3
  case 0xed:return 4;break;//4
  case 0xdd:return 5;break;//5
  case 0xbd:return 6;break;//6
  case 0x7d:return 7;break;//7
  case 0xeb:return 8;break;//8
  case 0xdb:return 9;break;//9
  case 0xbb:return 10;break;//a
  case 0x7b:return 11;break;//b
  case 0xe7:return 12;break;//c
  case 0xd7:return 13;break;//d
  case 0xb7:return 14;break;//e
  case 0x77:return 15;break;//f
  default:return 0xff;break;
 }
}
  
//第一个参数i代表控制第几个数码管,n代表要显示的数字
void Screen1(int i,int n)
{
    int high;
     P0=0;
     DUAN=1;
	 DUAN=0;
     
	 
	 high=n/10;
    
      WEI=1;
     P0=dofly_WeiMa[i];
     WEI=0;
     
	 DUAN=1;
     P0=dofly_DuanMa[high]; 
         
     DUAN=0;

}

void Screen2(int i,int n)
{
      int lower;
      P0=0;
      DUAN=1;
	  DUAN=0;
     
	  lower=n%10;
	  WEI=1;  
     P0=dofly_WeiMa[i];
       
     WEI=0;
      
	 DUAN=1; 
     P0=dofly_DuanMa[lower]; 
        
     DUAN=0;

	
}

int num;
int Key_push;
int flag;
int main()
{
  	num=0;
  	WEI=0;
  	DUAN=0;

	EA=1;          
  	EX0=1;        
  	IT0=0;
        
    EX1=1;        
  	IT1=0;
	
	flag=0;
   while(1)
   {
        if(flag && num>9)
        {
		  Screen1(6,num);
		  flag=0;
		 }
		else
		{
		  Screen2(7,num);
		  flag=1;
		 }
        Key_push=KeyPro();
	}
   
      return 0;
}

//外部中断处理
void inter_sub() interrupt 0 using 1
{

   if(Key_push==8)
   {
     if(num>0)
	 num--;
   }
   Key_push=0;

}

void inter_add() interrupt 2 using 1
{

   if(Key_push==12)
   {
     num++;
	 if(num==16)
	 num=0;

   }
   Key_push=0;
}







  • 14
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值