|
|
機(jī)頂盒常用74HC164、74HC595、TM1637等芯片實(shí)現(xiàn)數(shù)碼管驅(qū)動(dòng)和按鍵檢測(cè)功能,通過動(dòng)態(tài)掃描和分時(shí)復(fù)用技術(shù),利用人眼視覺暫留效應(yīng),讓同一組I/O口既控制數(shù)碼管顯示,又實(shí)現(xiàn)按鍵檢測(cè),有效的節(jié)省I/O端口。
分時(shí)復(fù)用原理:將按鍵并聯(lián)接到數(shù)碼管的A-H端,最多可以連接8個(gè)按鍵,由單片機(jī)一個(gè)IO口檢測(cè)按鍵狀態(tài)。在數(shù)碼管完成一個(gè)掃描周期后,關(guān)閉數(shù)碼管位碼,將按鍵碼輸出,此時(shí)數(shù)碼管段選端和按鍵都接收到這個(gè)數(shù)據(jù),但由于數(shù)碼管位碼關(guān)閉,數(shù)碼管并無顯示,未受到干擾。
按鍵碼為低電平有效,當(dāng)有按鍵被按下,單片機(jī)檢測(cè)端會(huì)接收到低電平,若在傳送0xfe時(shí)接收到低電平,則判斷為K1被按下,數(shù)碼管會(huì)顯示相應(yīng)的鍵值“01”,其它按鍵同理。
本案例只是顯示01-06鍵值,若需要實(shí)現(xiàn)其它的功能,可在此程序的基礎(chǔ)上自行修改。
參考程序:
/*******************************************
74HC164驅(qū)動(dòng)4位數(shù)碼管及解析按鍵碼
*******************************************/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數(shù)碼管0~9共陽(yáng)代碼
uchar code COM[]={0x01,0x02,0x04,0x08}; //數(shù)碼管位碼
uchar code KEY[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //按鍵碼
uchar buff[4]; //顯示緩存
uchar keynum; //按鍵消抖計(jì)時(shí)及按鍵鍵值
sbit DIO = P2^0; //HC164數(shù)據(jù)
sbit CLK = P2^1; //HC164時(shí)鐘
sbit Key_data = P2^2; //按鍵檢測(cè)位
/**********************************************
延時(shí)函數(shù) x*1ms
**********************************************/
void delay(uint xms)
{
uchar i;
while(--xms)
{
i=166;
while(--i);
}
}
/**********************************************
74HC164寫入數(shù)據(jù)函數(shù)
**********************************************/
void Wr_hc164(uchar dat)
{
uchar i;
for(i=0; i<8; i++)
{
dat<<=1;
DIO = CY;
CLK = 0;
CLK = 1;
}
}
/*********************************************
顯示函數(shù)
*********************************************/
void display()
{
uchar i;
buff[0]=0xc6;
buff[1]=0x89;
buff[2]=SEG[keynum/10];
buff[3]=SEG[keynum%10];
for(i=0;i<4;i++)
{
Wr_hc164(buff); //傳送段碼
P3 = COM; //傳送位碼
delay(3);
P3 = 0x00; //消隱
}
}
/**********************************************
按鍵掃描函數(shù)
**********************************************/
void keyscan()
{
uchar i;
for(i=0;i<6;i++) //循環(huán)6個(gè)按鍵
{
Wr_hc164(KEY); //傳送按鍵碼
if(Key_data==0)
{
keynum=i+1; //鍵值
} //若要使按鍵具有加、減功能,需加入松手檢測(cè)
}
}
/**********************************************
主程序
**********************************************/
void main()
{
while(1)
{
display();
keyscan(); //4個(gè)數(shù)碼管完成1個(gè)掃描周期共12ms,正好作為按鍵的延時(shí)消抖
}
}
仿真程序下載:
分時(shí)復(fù)用仿真(proteus8.17以上版本).zip
(21.9 KB, 下載次數(shù): 0)
2025-10-20 20:04 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|