本實驗的目的:
使用中斷實現通過編號為8和C的按鍵控制數碼管數字的加減,加至15之後再循環到0,減到0之後保持0不變。
代碼中有詳細的注釋:
#includesbit 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; }