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