51單片機數碼管顯示歷史鍵值
- 想說的話
- 單片機程式設計
- 實驗目的
- 實驗內容
- 實驗原理
- 矩陣鍵盤
- 數碼管動態顯示
- 實驗環境
- 實驗代碼
想說的話
這個單片機實驗要求是我的同學把別人的設計要求發給我,讓我幫忙做一下,但是做著做著發現自己設計的方案行不通,到現在原因也不知道在哪,只能是又想了一種方案,
方案是在按下鍵盤時,將按下的鍵值所對應的共陽值寫入對應的陣列中,在顯示時在P0口(數碼管段選口)寫入剛存盤完成的陣列,該陣列在未按下時所有數值均為 0xff (不顯示),
和最一開始的方案是相似的,但是我至今也沒想明白最一開始的方案例外的原因在哪,也沒有搜到類似的資源,于是就想著來CSDN隨便水一篇,
Proteus仿真圖和C代碼檔案可以參考我的另一篇資源,下載的話我應該設定的是0
51單片機數碼管顯示歷史鍵值
單片機程式設計
實驗目的
1、利用鍵盤作為輸入信號控制系統的輸出資訊
2、熟悉鍵盤的構造并撰寫相應的掃描的程式
實驗內容
利用Proteus搭建仿真電路圖,并完成如下鍵盤程式:
1、四個數碼管上分別顯示最近連續四次按鍵的值,例如連續四次按下3456,則顯示3456,再按下9,則顯示4569
2、在1的基礎上按下“F”鍵(第四行第四列),則所有數碼管清屏(即所有數碼管不顯示),按下“E”鍵,顯示“----”
實驗原理
矩陣鍵盤
行列掃描:通過高四位全部輸出低電平,低四位輸出高電平,當接收到的資料,低四位不全為高電平時,說明有按鍵按下,然后通過接收的資料值,判斷是哪一列有按鍵按下,然后再反過來,高四位輸出高電平,低四位輸出低電平,然后根據接收到的高四位的值判斷是那一行有按鍵按下,這樣就能夠確定是哪一個按鍵按下了,
數碼管動態顯示
動態顯示的特點是將所有數碼管的段選線并聯在一起,由位選線控制是哪一位數碼管有效,選亮數碼管采用動態掃描顯示,所謂動態掃描顯示即輪流向各位數碼管送出字形碼和相應的位選,利用發光管的余輝和人眼視覺暫留作用,使人的感覺好像各位數碼管同時都在顯示,
實驗環境
Keil開發環境,Proteus仿真環境
注意事項:
1、程式中需要4*4矩陣鍵盤以及4位數碼管
2、數碼管的編碼(0~F)如下所示
smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
3、Proteus仿真圖

實驗代碼
#include"reg52.h"
unsigned char smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned char cunchu[15]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
int k=3,Keyvalve=20,a=3,num=0;
/*延時函式*/
void delay(unsigned int l)
{
while(l--);
}
/*此只能記憶12個鍵值,如想記錄更多鍵值可擴大cunchu陣列*/
void Key_Scan()
{
P1=0xf0;
if(P1!=0xf0)
{
delay(200);
P1=0xf0;
switch(P1)
{
case 0xe0:Keyvalve = 0;break;
case 0xd0:Keyvalve = 1;break;
case 0xb0:Keyvalve = 2;break;
case 0x70:Keyvalve = 3;break;
}
P1=0x0f;
switch(P1)
{
case 0x0e:Keyvalve = Keyvalve;break;
case 0x0D:Keyvalve = Keyvalve + 4;break;
case 0x0B:Keyvalve = Keyvalve + 8;break;
case 0x07:Keyvalve = Keyvalve + 12;break;
}
if(Keyvalve!=14&&Keyvalve!=15)
{
cunchu[a] = smgduan[Keyvalve];
a=a+1;
if(a>=5)
{
k=k+1;
}
}
delay(30000);
}
}
/*歷史鍵值顯示*/
void display1(int e)
{
int j,u;
u=e;
for(j=0;j<4;j++)
{
switch(j)
{
case 0:P2=0x08;break;
case 1:P2=0x04;break;
case 2:P2=0x02;break;
case 3:P2=0x01;break;
}
P0=cunchu[u];
delay(100);
P0=0xff;
u=u-1;
}
}
/*所有數碼管不顯示*/
void display2()
{
int i;
for(i=0;i<4;i++)
{
switch(i)
{
case 0:P2=0x08;break;
case 1:P2=0x04;break;
case 2:P2=0x02;break;
case 3:P2=0x01;break;
}
P0=0xff;
delay(20);
//P0=0xFF;
}
}
/*顯示“----”*/
void display3()
{
int i;
for(i=1;i<5;i++)
{
switch(i)
{
case 1:P2=0x08;break;
case 2:P2=0x04;break;
case 3:P2=0x02;break;
case 4:P2=0x01;break;
}
P0=0xBf;
delay(20);
//P0=0xFF;
}
}
void main()
{
while(1)
{
Key_Scan();
if(Keyvalve==14)
{
display2();
}
else if(Keyvalve==15)
{
display3();
}
else
{
display1(k);
}
delay(500);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277505.html
標籤:其他
上一篇:面試必會演算法(1):排序演算法
