|
用按鍵矩陣顯示1-16位數(shù)碼
- #include<reg51.h> //包含51單片機(jī)寄存器定義的頭文件
- sbit P14=P1^4; //將P14位定義為P1.4引腳
- sbit P15=P1^5; //將P15位定義為P1.5引腳
- sbit P16=P1^6; //將P16位定義為P1.6引腳
- sbit P17=P1^7; //將P17位定義為P1.7引腳
- unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數(shù)字0~9的段碼
- unsigned char keyval; //定義變量?jī)?chǔ)存按鍵值
- /**************************************************************
- 函數(shù)功能:數(shù)碼管動(dòng)態(tài)掃描延時(shí)
- **************************************************************/
- void led_delay(void)
- {
- unsigned char j;
- for(j=0;j<200;j++)
- ;
- }
- /**************************************************************
- 函數(shù)功能:按鍵值的數(shù)碼管顯示子程序
- **************************************************************/
- void display(unsigned char k)
- {
- P2=0xbf; //點(diǎn)亮數(shù)碼管DS6
- P0=Tab[k%10]; //顯示個(gè)位
- led_delay(); //動(dòng)態(tài)掃描延時(shí)
- P2=0x7f; //點(diǎn)亮數(shù)碼管DS7
- P0=Tab[k/10]; //顯示十位
- led_delay(); //動(dòng)態(tài)掃描延時(shí)
- }
- /**************************************************************
- 函數(shù)功能:軟件延時(shí)子程序
- **************************************************************/
- void delay20ms(void)
- {
- unsigned char i,j;
- for(i=0;i<100;i++)
- for(j=0;j<60;j++)
- ;
- }
- /**************************************************************
- 函數(shù)功能:主函數(shù)
- **************************************************************/
- void main(void)
- {
- EA=1; //開(kāi)總中斷
- ET0=1; //定時(shí)器T0中斷允許
- TMOD=0x01; //使用定時(shí)器T0的模式1
- TH0=(65536-500)/256; //定時(shí)器T0的高8位賦初值
- TL0=(65536-500)%256; //定時(shí)器T0的高8位賦初值
- TR0=1; //啟動(dòng)定時(shí)器T0
- keyval=0x00; //按鍵值初始化為0
-
- while(1) //無(wú)限循環(huán)
- {
- display(keyval); //調(diào)用按鍵值的數(shù)碼管顯示子程序
- }
- }
- /**************************************************************
- 函數(shù)功能:定時(shí)器0的中斷服務(wù)子程序,進(jìn)行鍵盤(pán)掃描,判斷鍵位
- **************************************************************/
- void time0_interserve(void) interrupt 1 using 1 //定時(shí)器T0的中斷編號(hào)為1,使用第一組寄存器
- {
- TR0=0; //關(guān)閉定時(shí)器T0
- P1=0xf0; //所有行線置為低電平“0”,所有列線置為高電平“1”
- if((P1&0xf0)!=0xf0) //列線中有一位為低電平“0”,說(shuō)明有鍵按下
- delay20ms(); //延時(shí)一段時(shí)間、軟件消抖
- if((P1&0xf0)!=0xf0) //確實(shí)有鍵按下
- {
- P1=0xfe; //第一行置為低電平“0”(P1.0輸出低電平“0”)
- if(P14==0) //如果檢測(cè)到接P1.4引腳的列線為低電平“0”
- keyval=1; //可判斷是S1鍵被按下
- if(P15==0) //如果檢測(cè)到接P1.5引腳的列線為低電平“0”
- keyval=2; //可判斷是S2鍵被按下
- if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
- keyval=3; //可判斷是S3鍵被按下
- if(P17==0) //如果檢測(cè)到接P1.7引腳的列線為低電平“0”
- keyval=4; //可判斷是S4鍵被按下
- P1=0xfd; //第二行置為低電平“0”(P1.1輸出低電平“0”)
- if(P14==0) //如果檢測(cè)到接P1.4引腳的列線為低電平“0”
- keyval=5; //可判斷是S5鍵被按下
- if(P15==0) //如果檢測(cè)到接P1.5引腳的列線為低電平“0”
- keyval=6; //可判斷是S6鍵被按下
- if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
- keyval=7; //可判斷是S7鍵被按下
- if(P17==0) //如果檢測(cè)到接P1.7引腳的列線為低電平“0”
- keyval=8; //可判斷是S8鍵被按下
-
- P1=0xfb; //第三行置為低電平“0”(P1.2輸出低電平“0”)
- if(P14==0) //如果檢測(cè)到接P1.4引腳的列線為低電平“0”
- keyval=9; //可判斷是S9鍵被按下
- if(P15==0) //如果檢測(cè)到接P1.5引腳的列線為低電平“0”
- keyval=10; //可判斷是S10鍵被按下
- if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
- keyval=11; //可判斷是S11鍵被按下
- if(P17==0) //如果檢測(cè)到接P1.7引腳的列線為低電平“0”
- keyval=12; //可判斷是S12鍵被按下
- P1=0xf7; //第四行置為低電平“0”(P1.3輸出低電平“0”)
- if(P14==0) //如果檢測(cè)到接P1.4引腳的列線為低電平“0”
- keyval=13; //可判斷是S13鍵被按下
- if(P15==0) //如果檢測(cè)到接P1.5引腳的列線為低電平“0”
- keyval=14; //可判斷是S14鍵被按下
- if(P16==0) //如果檢測(cè)到接P1.6引腳的列線為低電平“0”
- keyval=15; //可判斷是S15鍵被按下
- if(P17==0) //如果檢測(cè)到接P1.7引腳的列線為低電平“0”
- keyval=16; //可判斷是S16鍵被按下
- }
- TR0=1; //開(kāi)啟定時(shí)器T0
- TH0=(65536-500)/256; //定時(shí)器T0的高8位賦初值
- TL0=(65536-500)%256; //定時(shí)器T0的高8位賦初值
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|