鍵盤部分原理圖:
本文引用地址:http://m.butianyuan.cn/article/201611/321310.htm 歷程里面設(shè)計到數(shù)碼管,這個參考前面的文章《51單片機(jī) 數(shù)碼顯示數(shù)字》。
代碼如下: 注釋很詳細(xì)。
//按鍵key1顯示數(shù)字加1,按鍵key2顯示數(shù)字減1,按鍵key3清零,按鍵key4數(shù)字每秒加1.
#include //頭文件
#define uint unsigned int //宏定義
#define uchar unsigned char
//按鍵標(biāo)示聲明
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit duanxuan=P2^6;
sbit weixuan=P2^7;
uint number; //需要顯示的數(shù)字
uint time_number; //T0計時器方式一計滿次數(shù)
void delay(uint); //延時函數(shù)聲明
void init(); //T0定時器中斷初始化函數(shù)聲明
void display(uint); //顯示函數(shù)聲明
void keyscan();//按鍵檢測函數(shù)聲明
uchar code table[]={ //字符斷碼
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //C語言編碼定義
void main() //主函數(shù)入口
{
init(); //T0定時器方式一中斷初始化
while(1)
{
display(number); //顯示函數(shù)
keyscan(); //鍵盤掃描函數(shù)
}
}
//延時函數(shù)主體
void delay(uint s)
{
uint i,j;
for(i=s;i>0;i--)
{
for(j=110;j>0;j--)
{
}
}
}
//定時器T0方式一中斷初始化函數(shù)主體
void init()
{
TMOD=0x11; //TMOD賦值,確定T0/T1工作方式
TH0=(65536-46080)/256;//TH0/TL0;TH1/TL1計算初值
TL0=(65536-46080)%6;
EA=1; //總中斷打開
ET0=1; //開T0/T1中斷
//TR0=1; //TR0/TR1置位,啟動定時器(本程序當(dāng)key4按下之后TR=1)
}
//顯示函數(shù)主體
void display(uint number0)
{
uint no1,no2,no3,no4,no5;
no1=number0/10000;
no2=number0000/1000;
no3=number000/100;
no4=number00/10;
no5=number0;
//數(shù)碼管1顯示 ①送斷碼;②選擇要顯示數(shù)碼管
duanxuan=1; //打開段選鎖存器
P0=table[no1]; //送斷碼
duanxuan=0; //關(guān)閉(鎖住)鎖存器
P0=0xff; //必不可少的清屏
weixuan=1; //打開位選鎖存器
P0=0xfe; //選擇數(shù)碼管
weixuan=0; //關(guān)閉鎖存器
delay(2); //延時
//數(shù)碼管2顯示
duanxuan=1;
P0=table[no2];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xfd;
weixuan=0;
delay(2);
//數(shù)碼管3顯示
duanxuan=1;
P0=table[no3];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xfb;
weixuan=0;
delay(2);
//數(shù)碼管4顯示
duanxuan=1;
P0=table[no4];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xf7;
weixuan=0;
delay(2);
//數(shù)碼管5顯示
duanxuan=1;
P0=table[no5];
duanxuan=0;
P0=0xff;
weixuan=1;
P0=0xef;
weixuan=0;
delay(2);
}
void keyscan() //按鍵檢測函數(shù)主體
{
if(key1==0) //檢測key1按下
{
delay(10); //延時10us
if(key1==0)//檢測鍵盤依然是按下的
{
number++;//顯示數(shù)字加1
if(number==10000)//如果記滿10000
{
number=0; //清零重新開始
}
while(!key1); //等待按鍵放下
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
number--;
if(number==0)
{
number=10000;
}
while(!key2);
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
number=0;
while(!key3);
}
}
if(key4==0)
{
delay(10);
if(key4==0)
{
while(!key4);
TR0=~TR0;
}
}
}
//T0定時器方式一中斷服務(wù)函數(shù)主體
void R0_Time_no1() interrupt 1
{
TH0=(65536-46080)/256;//預(yù)裝值
TL0=(65536-56080)%6;
time_number++; //記滿次數(shù)
if(time_number==20) //20次為1s
{
time_number=0;
number++;
if(number==10000)
{
number=0;
}
}
}
以上,結(jié)束。
評論