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

来源:互联网 发布:淘宝全屏店招怎么做 编辑:程序博客网 时间:2024/05/17 04:18

本实验的目的:

使用中断实现通过编号为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~9unsigned 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;}


2 0
原创粉丝点击