數碼管顯示在51單片機里面也是很經典的歷程。因為IO口有限,所以數碼管的數據端口與選通端口使用了同樣的IO端口,防止數據與選通信號混亂,這里使用了兩個鎖存器,用于區分選通信號與數據信號。在實際工程開發中,IO復用的情況還是很常見的,所以掌握復用IO的控制過程就顯得很重要了。 原理圖:
本文引用地址:http://www.104case.com/article/201611/321307.htm 

代碼如下:詳細說明見注釋。
//在6個數碼管上面顯示數字0-6,時間間隔是1s。數碼管1顯示1,1S關閉,數碼管2顯示2,1S關閉~~~~~~~~~~
#include //頭文件
#define uint unsigned int //定義宏--無符號整型
#define uchar unsigned char //定義宏--無符號字符型
sbit duanxuan=P2^6; //聲明P2.6端口為段選端
sbit pianxuan=P2^7; //聲明P2.7端口為片(位)選端
void delay_1s(uint); //聲明延時函數--延時一秒
uint xs; //延時函數用
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //C語言編碼定義
void main() //主函數入口
{
xs=20; //參數越小,就可以實現6個數碼管一起顯示數字
while(1)
{
pianxuan=1; //打開片選鎖存器
P0=0xfe; //執行片選,選擇第1個數碼管
pianxuan=0; //關閉鎖存器,鎖存器輸出端保持不變
P0=0x00;
duanxuan=1; //打開段選端
P0=table[1]; //顯示數字1
duanxuan=0; //關閉段選端,數字保持
delay_1s(xs); //延時xS
pianxuan=1;
P0=0xfd; //選擇第2個數碼管
pianxuan=0;
P0=0x00;
duanxuan=1;
P0=table[2]; //顯示數字2
duanxuan=0;
delay_1s(xs);
pianxuan=1;
P0=0xfb; //選擇第3個數碼管
pianxuan=0;
P0=0x00;
duanxuan=1;
P0=table[3]; //顯示數字3
duanxuan=0;
delay_1s(xs);
pianxuan=1;
P0=0xf7; //選擇第4個數碼管
pianxuan=0;
P0=0x00;
duanxuan=1;
P0=table[4]; //顯示數字5
duanxuan=0;
delay_1s(xs);
pianxuan=1;
P0=0xef; //選擇第5個數碼管
pianxuan=0;
P0=0x00;
duanxuan=1;
P0=table[5]; //顯示數字5
duanxuan=0;
delay_1s(xs);
pianxuan=1;
P0=0xdf; //選擇第6個數碼管
pianxuan=0;
P0=0x00;
delay_1s(xs);
duanxuan=1;
P0=table[6]; //顯示數字6
duanxuan=0;
delay_1s(xs);
}
}
void delay_1s(uint xs) //延時函數主體
{
uint i,j;
for(i=xs;i>0;i--)
{
for(j=10;j>0;j--)
{
}
}
}
以上,數碼管顯示結束。
評論