單片機(jī):按鍵(使用中斷)控制數(shù)碼管的數(shù)字加減(c語(yǔ)言實(shí)
本實(shí)驗(yàn)的目的:
使用中斷實(shí)現(xiàn)通過(guò)編號(hào)為8和C的按鍵控制數(shù)碼管數(shù)字的加減,加至15之后再循環(huán)到0,減到0之后保持0不變。
#include
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};//分別對(duì)應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮,即位碼
unsigned char KeyScan(void) //鍵盤掃描函數(shù),使用行列逐級(jí)掃描法
{
unsigned char Val;
P3=0xf0;//高四位置高,低四位拉低
if(P3!=0xf0)//表示有按鍵按下
{
//DelayMs(10); //去抖
if(P3!=0xf0)
{ //表示有按鍵按下
P3=0xfe; //檢測(cè)第一行
if(P3!=0xfe)
{
Val=P3&0xf0;
Val+=0x0e;
while(P3!=0xfe);
while(P3!=0xfe);
return Val;
}
P3=0xfd; //檢測(cè)第二行
if(P3!=0xfd)
{
Val=P3&0xf0;
Val+=0x0d;
while(P3!=0xfd);
while(P3!=0xfd);
return Val;
}
P3=0xfb; //檢測(cè)第三行
if(P3!=0xfb)
{
Val=P3&0xf0;
Val+=0x0b;
while(P3!=0xfb);
while(P3!=0xfb);
return Val;
}
P3=0xf7; //檢測(cè)第四行
if(P3!=0xf7)
{
Val=P3&0xf0;
Val+=0x07;
while(P3!=0xf7);
while(P3!=0xf7);
return Val;
}
}
}
return 0xff;
}
/*------------------------------------------------
按鍵值處理函數(shù),返回掃鍵值
------------------------------------------------*/
unsigned char KeyPro(void)
{
switch(KeyScan())
{
case 0xee:return 0;break;//0 按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值
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;
}
}
//第一個(gè)參數(shù)i代表控制第幾個(gè)數(shù)碼管,n代表要顯示的數(shù)字
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;
}