目錄
數(shù)碼管:
1.靜態(tài)數(shù)碼管:第二位數(shù)碼管顯示0
2.動態(tài)數(shù)碼管:每一位數(shù)碼管依次顯示對應(yīng)位數(shù)
按鍵:
1.獨立按鍵:按下按鍵對應(yīng)LED亮滅
矩陣按鍵:
1.矩陣按鍵:按下的每個按鍵,數(shù)碼管顯示對應(yīng)鍵碼
數(shù)碼管:
????????數(shù)碼管按段數(shù)可分為七段數(shù)碼管和八段數(shù)碼管,八段數(shù)碼管多一個DP(小數(shù)點)二極管。也可分為CA共陽極數(shù)碼管(低電平點亮)和CC共陰極數(shù)碼管(高電平點亮)。本開發(fā)板上使用的是2個四位一體共陰極數(shù)碼管。數(shù)碼管靜態(tài)顯示是控制數(shù)碼管的每一個引腳,輸入一次電平之后可以一直顯示直到再一次改變電平,靜態(tài)顯示會增加IO口的使用,結(jié)構(gòu)復(fù)雜成本高,但是會減少占用CPU的時間。數(shù)碼管動態(tài)顯示通過位選—段選—清零(消影)來通過發(fā)光管余輝和人的視覺暫留是我們感覺出每一位同時顯示。 通過74HC138譯碼器(C為高位B為次高位A為低位)輸入高電平輸出低電平進(jìn)行位選,然后通過74HC245驅(qū)動數(shù)碼管段選(a為低位,DP為高位)。
//共陰極數(shù)碼管段碼表
0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X00
0 1 2 3 4 5 6 7 8 9 A B C D E F 空
//共陽極數(shù)碼管段碼表
0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0XFF
0 1 2 3 4 5 6 7 8 9 A B C D E F 空
1.靜態(tài)數(shù)碼管:第二位數(shù)碼管顯示0
#include <REGX52.H>
void main()
{
P2_2=0;//位選 LED7
P2_3=1;
P2_4=1;
P0=0x3f;//段選 顯示0
while(1)
{
}
}
2.動態(tài)數(shù)碼管:每一位數(shù)碼管依次顯示對應(yīng)位數(shù)
????????數(shù)碼管函數(shù)1
#include <REGX52.H>
unsigned char code NixieNum[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//共陰極段碼
void shumaguan(unsigned char wei,duan)
{
P0=0x00;//清零消影 采用delay函數(shù)亮度增強(qiáng)
switch(wei)//位選
{
case 1:P2_2=1;P2_3=1;P2_4=1;break;//P2_4為高位
case 2:P2_2=0;P2_3=1;P2_4=1;break;
case 3:P2_2=1;P2_3=0;P2_4=1;break;
case 4:P2_2=0;P2_3=0;P2_4=1;break;
case 5:P2_2=1;P2_3=1;P2_4=0;break;
case 6:P2_2=0;P2_3=1;P2_4=0;break;
case 7:P2_2=1;P2_3=0;P2_4=0;break;
case 8:P2_2=0;P2_3=0;P2_4=0;break;
}
P0=NixieNum[duan];//段選
}
? ? ? ? 數(shù)碼管函數(shù)2
#include <REGX52.H>
#include "DELAY.h"
unsigned char code NixieNum[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//段碼
void shumaguan(unsigned char wei,duan)
{
switch(wei)//位選
{
case 1:P2_2=1;P2_3=1;P2_4=1;break;//P2_4為高位
case 2:P2_2=0;P2_3=1;P2_4=1;break;
case 3:P2_2=1;P2_3=0;P2_4=1;break;
case 4:P2_2=0;P2_3=0;P2_4=1;break;
case 5:P2_2=1;P2_3=1;P2_4=0;break;
case 6:P2_2=0;P2_3=1;P2_4=0;break;
case 7:P2_2=1;P2_3=0;P2_4=0;break;
case 8:P2_2=0;P2_3=0;P2_4=0;break;
}
P0=NixieNum[duan];//段選
delay(1);//延時1ms穩(wěn)定圖像 清零消影 靜態(tài)關(guān)閉消影
P0=0x00;//清零消影 靜態(tài)關(guān)閉消影
}
????????主函數(shù)
#include <REGX52.H>
#include "shumaguan.h"
void main()
{
while(1)
{
shumaguan(1,0);
shumaguan(2,1);
shumaguan(3,2);
shumaguan(4,3);
shumaguan(5,4);
shumaguan(6,5);
shumaguan(7,6);
shumaguan(8,7);
}
}
按鍵:
????????兩端距離長的表示默認(rèn)是導(dǎo)通狀態(tài),距離短的默認(rèn)是斷開狀態(tài)。如果按鍵按下,初始導(dǎo)通狀態(tài)變?yōu)閿嚅_,初始斷開狀態(tài)變?yōu)閷?dǎo)通。通常的按鍵都是機(jī)械彈性開關(guān),由于彈性作用,在閉合時不會馬上穩(wěn)定的接通,在斷開時也不會馬上斷開,一般會抖動5-10ms。所以為了消抖,一般由軟件消抖20ms。IO口既可以輸出也可以輸入,當(dāng)按鍵按下時IO口電平會被接地,所以我們只需要檢測按鍵什么時候被拉低就可以。
1.獨立按鍵:按下按鍵對應(yīng)LED亮滅
? ? ? ? 按鍵函數(shù)
#include <REGX52.H>
#include "DELAY.h"
unsigned char anjian()
{
unsigned char jianwei=0;
if(P3_1==0){delay(20);while(P3_1==0);delay(20);jianwei=1;}//檢測按鍵是否為0,消抖,檢測是否松手,消抖
if(P3_0==0){delay(20);while(P3_0==0);delay(20);jianwei=2;}
if(P3_2==0){delay(20);while(P3_2==0);delay(20);jianwei=3;}
if(P3_3==0){delay(20);while(P3_3==0);delay(20);jianwei=4;}
return jianwei;
}
????????主函數(shù)
#include <REGX52.H>
#include "anjian.h"
void main()
{
unsigned char i;
while(1)
{
i=anjian();
if(i==1){P2_0=~P2_0;}//如果第一個按下,第一個燈狀態(tài)取反
if(i==2){P2_1=~P2_1;}
if(i==3){P2_2=~P2_2;}
if(i==4){P2_3=~P2_3;}
}
}
矩陣按鍵:
????????每一個獨立按鍵都需要借一個IO口,但是矩陣按鍵會大大減少IO資源的使用。開發(fā)板上將 16 個按 鍵排成 4 行 4 列,第一行將每個按鍵的一端連接在一起構(gòu)成行線,第一列將每 個按鍵的另一端連接在一起構(gòu)成列線,這樣便一共有 4 行 4 列共 8 根線,我們將 這 8 根線連接到單片機(jī)的 8 個 I/O 口上,通過程序掃描鍵盤就可檢測 16 個 鍵。用這種方法我們也可實現(xiàn) 3 行 3 列 9 個鍵、?5 行 5 列 25 個鍵、 6 行 6 列 36 個鍵甚至更多。跟獨立按鍵相同,我們只需要檢測按鍵什么時候被拉低就可以。本次我們采用行掃描的方法使用矩陣按鍵,并且不要忘記消抖。
1.矩陣按鍵:按下的每個按鍵,數(shù)碼管顯示對應(yīng)鍵碼
? ? ? ? 矩陣函數(shù)文章來源:http://www.zghlxwxcb.cn/news/detail-817107.html
#include <REGX52.H>
#include "DELAY.h"
unsigned char juzhen()//行掃描
{
unsigned char juzhenNum;
P1=0x7f;
if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=1;}
if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=2;}
if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=3;}
if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=4;}
P1=0xbf;
if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=5;}
if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=6;}
if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=7;}
if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=8;}
P1=0xdf;
if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=9;}
if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=10;}
if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=11;}
if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=12;}
P1=0xef;
if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=13;}
if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=14;}
if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=15;}
if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=16;}
return juzhenNum;
}
? ? ? ? 主函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-817107.html
#include <REGX52.H>
#include "shumaguan.h"
#include "juzhen.h"
void main()
{
unsigned char i=0;
while(1)
{
i=juzhen();
shumaguan(1,i);
}
}
到了這里,關(guān)于51單片機(jī)——數(shù)碼管、按鍵、矩陣按鍵C語言入門編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!