數(shù)碼管代碼部分
源碼倉庫
倉庫地址:https://gitee.com/EricsT/51_microcontrollers/tree/master/DigitalTube
數(shù)碼管真值表
#include <reg52.h>
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;
void main(void)
{
ENLED = 0;
ADDR3 = 1; // U3 74HC138芯片使能
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = 0xf9; //數(shù)字1
while (1);
}
單個數(shù)碼管倒計(jì)時
#include <reg52.h>
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;
unsigned char code LedChar[] =
{
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};//真值表
void main(void)
{
char i = 15; // 真值表下標(biāo)
char cnt = 0; // 定時器溢出次數(shù)
ENLED = 0;
ADDR3 = 1; // U3 74HC138芯片使能
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
TMOD = 1; // 設(shè)置定時器0為模式1
TH0 = 0xB8;
TL0 = 0x00; // 設(shè)置定時器0的初始值
TR0 = 1; // 定時器0開始工作
P0 = LedChar[i];
while (1) {
if (1 == TF0) // 定時器溢出
{
TF0 = 0;//將溢出標(biāo)志恢復(fù)初值,再次定時
TH0 = 0xB8;
TL0 = 0x00; // 設(shè)置定時器0的初始值
cnt++;
if (cnt >= 50)
{
cnt = 0;
if (i < 0)
i = 15;
P0 = LedChar[i--];
}
}
}
}
6段數(shù)碼管動態(tài)顯示
#include <reg52.h>
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;
unsigned char code LedChar[] =
{
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
unsigned char LedBuff[] =
{
0xFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF
};
void main(void)
{
unsigned char i = 0;//當(dāng)前工作的數(shù)碼管下標(biāo)
unsigned int cnt = 0;//溢出次數(shù)
unsigned long sec = 0; // 秒
ENLED = 0;
ADDR3 = 1; // U3 74HC138芯片使能
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
TMOD = 1; // 設(shè)置定時器0為模式1
TH0 = 0xFC;
TL0 = 0x67; // 設(shè)置定時器0的初始值
TR0 = 1; // 定時器0開始工作
while (1)
{
if (1 == TF0) // 定時器溢出
{
TF0 = 0; // 將溢出標(biāo)志恢復(fù)初值,再次定時
TH0 = 0xFC;
TL0 = 0x67; // 設(shè)置定時器0的初始值
cnt++;
if (cnt >= 1000) //1s
{
cnt = 0;
sec++;
if (sec >= 999999)
sec = 0;
LedBuff[0] = LedChar[sec % 10];
LedBuff[1] = LedChar[(sec / 10) % 10];
LedBuff[2] = LedChar[(sec / 100) % 10];
LedBuff[3] = LedChar[(sec / 1000) % 10];
LedBuff[4] = LedChar[(sec / 10000) % 10];
LedBuff[5] = LedChar[(sec / 100000) % 10];
}
switch (i)
{
case 0:
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[0];
i++;
break;
case 1:
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[1];
i++;
break;
case 2:
ADDR2 = 0;
ADDR1 = 1;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[2];
i++;
break;
case 3:
ADDR2 = 0;
ADDR1 = 1;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[3];
i++;
break;
case 4:
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[4];
i++;
break;
case 5:
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[5];
i = 0;
break;
}
}
}
}
動態(tài)顯示的數(shù)碼管顯示消隱
#include <reg52.h>
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;
unsigned char code LedChar[] =
{
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
unsigned char LedBuff[] =
{
0xFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF
};
void main(void)
{
unsigned char i = 0;//當(dāng)前工作的數(shù)碼管下標(biāo)
unsigned int cnt = 0;//溢出次數(shù)
unsigned long sec = 0; // 秒
ENLED = 0;
ADDR3 = 1; // U3 74HC138芯片使能
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
TMOD = 1; // 設(shè)置定時器0為模式1
TH0 = 0xFC;
TL0 = 0x67; // 設(shè)置定時器0的初始值
TR0 = 1; // 定時器0開始工作
while (1)
{
if (1 == TF0) // 定時器溢出
{
TF0 = 0; // 將溢出標(biāo)志恢復(fù)初值,再次定時
TH0 = 0xFC;
TL0 = 0x67; // 設(shè)置定時器0的初始值
cnt++;
if (cnt >= 1000) //1s
{
cnt = 0;
sec++;
if (sec >= 999999)
sec = 0;
LedBuff[0] = LedChar[sec % 10];
LedBuff[1] = LedChar[(sec / 10) % 10];
LedBuff[2] = LedChar[(sec / 100) % 10];
LedBuff[3] = LedChar[(sec / 1000) % 10];
LedBuff[4] = LedChar[(sec / 10000) % 10];
LedBuff[5] = LedChar[(sec / 100000) % 10];
}
P0 = 0xFF;//顯示消隱處理
switch (i)
{
case 0:
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[0];
i++;
break;
case 1:
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[1];
i++;
break;
case 2:
ADDR2 = 0;
ADDR1 = 1;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[2];
i++;
break;
case 3:
ADDR2 = 0;
ADDR1 = 1;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[3];
i++;
break;
case 4:
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[4];
i++;
break;
case 5:
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[5];
i = 0;
break;
}
}
}
}
采用中斷的動態(tài)顯示
#include <reg52.h>
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;
unsigned char code LedChar[] =
{
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};//數(shù)碼管真值表
unsigned char LedBuff[] =
{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};//數(shù)碼管顯示緩沖區(qū)
unsigned char i = 0;//動態(tài)掃描的索引
unsigned int cnt = 0;//記錄T0中斷次數(shù)
unsigned char flag1s = 0;//1s定時標(biāo)志
void main(void)
{
unsigned long sec = 0;//記錄經(jīng)過的秒數(shù)
EA = 1;//使能總中斷
ENLED = 0;
ADDR3 = 1;//U3 74HC138芯片使能
TMOD = 0x01;//設(shè)置定時器T0模式1
TH0 = 0xFC;
TL0 = 0x67;//設(shè)置定時器T0的初值
ET0 = 1;//使能定時器T0中斷
TR0 = 1;//啟動定時器T0
while (1)
{
if (1 == flag1s)//判斷1s定時標(biāo)志
{
flag1s = 0;//1s定時標(biāo)志清零
sec++;//秒數(shù)加1
//設(shè)置數(shù)碼管的值
LedBuff[0] = LedChar[sec % 10];
LedBuff[1] = LedChar[(sec / 10) % 10];
LedBuff[2] = LedChar[(sec / 100) % 10];
LedBuff[3] = LedChar[(sec / 1000) % 10];
LedBuff[4] = LedChar[(sec / 10000) % 10];
LedBuff[5] = LedChar[(sec / 100000) % 10];
}
}
}
void InterruptTimer0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x67;//設(shè)置定時器T0的初值
cnt++;//中斷次數(shù)+1
if (cnt >= 1000)//中斷1000次即1秒
{
cnt = 0;//中斷次數(shù)清零
flag1s = 1;//設(shè)置1s定時標(biāo)志為1
}
P0 = 0xff;//顯示消隱
switch (i)
{
case 0:
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[0];
i++;
break;
case 1:
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[1];
i++;
break;
case 2:
ADDR2 = 0;
ADDR1 = 1;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[2];
i++;
break;
case 3:
ADDR2 = 0;
ADDR1 = 1;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[3];
i++;
break;
case 4:
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[4];
i++;
break;
case 5:
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[5];
i = 0;
break;
default:
break;
}
}
動態(tài)顯示時不顯示高位0-采用中斷
#include <reg52.h>
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;
unsigned char code LedChar[] =
{
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};//數(shù)碼管真值表
unsigned char LedBuff[] =
{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};//數(shù)碼管顯示緩沖區(qū)
unsigned char i = 0;//動態(tài)掃描的索引
unsigned int cnt = 0;//記錄T0中斷次數(shù)
unsigned char flag1s = 0;//1s定時標(biāo)志
unsigned long sec = 0;//記錄經(jīng)過的秒數(shù)
void main(void)
{
//unsigned long sec = 0;//記錄經(jīng)過的秒數(shù)
EA = 1;//使能總中斷
ENLED = 0;
ADDR3 = 1;//U3 74HC138芯片使能
TMOD = 0x01;//設(shè)置定時器T0模式1
TH0 = 0xFC;
TL0 = 0x67;//設(shè)置定時器T0的初值
ET0 = 1;//使能定時器T0中斷
TR0 = 1;//啟動定時器T0
while (1)
{
if (1 == flag1s)//判斷1s定時標(biāo)志
{
flag1s = 0;//1s定時標(biāo)志清零
sec++;//秒數(shù)加1
//設(shè)置數(shù)碼管的值
LedBuff[0] = LedChar[sec % 10];
LedBuff[1] = LedChar[(sec / 10) % 10];
LedBuff[2] = LedChar[(sec / 100) % 10];
LedBuff[3] = LedChar[(sec / 1000) % 10];
LedBuff[4] = LedChar[(sec / 10000) % 10];
LedBuff[5] = LedChar[(sec / 100000) % 10];
}
}
}
void InterruptTimer0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x67;//設(shè)置定時器T0的初值
cnt++;//中斷次數(shù)+1
if (cnt >= 1000)//中斷1000次即1秒
{
cnt = 0;//中斷次數(shù)清零
flag1s = 1;//設(shè)置1s定時標(biāo)志為1
}
P0 = 0xff;//顯示消隱
switch (i)
{
case 0:
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[0];
i++;
break;
case 1:
i++;
if (sec < 10)
break;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[1];
break;
case 2:
i++;
if (sec < 100)
break;
ADDR2 = 0;
ADDR1 = 1;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[2];
break;
case 3:
i++;
if (sec < 1000)
break;
ADDR2 = 0;
ADDR1 = 1;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[3];
break;
case 4:
i++;
if (sec < 10000)
break;
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[4];
break;
case 5:
i = 0;
if (sec < 100000)
break;
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[5];
break;
default:
break;
}
}
采用中斷且調(diào)用函數(shù)顯示
#include <reg52.h>
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;
unsigned char code LedChar[] =
{
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};//數(shù)碼管真值表
unsigned char LedBuff[] =
{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};//數(shù)碼管顯示緩沖區(qū)
unsigned char flag1s = 0;//1s定時標(biāo)志
void setLedValue()
{
static unsigned long sec = 0;//記錄經(jīng)過的秒數(shù)
flag1s = 0;//1s定時標(biāo)志清零
sec++;//秒數(shù)加1
//設(shè)置數(shù)碼管的值
LedBuff[0] = LedChar[sec % 10];
LedBuff[1] = LedChar[(sec / 10) % 10];
LedBuff[2] = LedChar[(sec / 100) % 10];
LedBuff[3] = LedChar[(sec / 1000) % 10];
LedBuff[4] = LedChar[(sec / 10000) % 10];
LedBuff[5] = LedChar[(sec / 100000) % 10];
}
void FlashLed()
{
static unsigned char i = 0;//動態(tài)掃描的索引
switch (i)
{
case 0:
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[0];
i++;
break;
case 1:
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[1];
i++;
break;
case 2:
ADDR2 = 0;
ADDR1 = 1;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[2];
i++;
break;
case 3:
ADDR2 = 0;
ADDR1 = 1;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[3];
i++;
break;
case 4:
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 0; // 三極管導(dǎo)通
P0 = LedBuff[4];
i++;
break;
case 5:
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 1; // 三極管導(dǎo)通
P0 = LedBuff[5];
i = 0;
break;
default:
break;
}
}
void main(void)
{
EA = 1;//使能總中斷
ENLED = 0;
ADDR3 = 1;//U3 74HC138芯片使能
TMOD = 0x01;//設(shè)置定時器T0模式1
TH0 = 0xFC;
TL0 = 0x67;//設(shè)置定時器T0的初值
ET0 = 1;//使能定時器T0中斷
TR0 = 1;//啟動定時器T0
while (1)
{
if (1 == flag1s)//判斷1s定時標(biāo)志
setLedValue();
}
}
void InterruptTimer0() interrupt 1
{
static unsigned int cnt = 0;//記錄T0中斷次數(shù)
TH0 = 0xFC;
TL0 = 0x67;//設(shè)置定時器T0的初值
cnt++;//中斷次數(shù)+1
if (cnt >= 1000)//中斷1000次即1秒
{
cnt = 0;//中斷次數(shù)清零
flag1s = 1;//設(shè)置1s定時標(biāo)志為1
}
P0 = 0xff;//顯示消隱
FlashLed();
}
本文來自博客園,作者:EricsT,轉(zhuǎn)載請注明原文鏈接:http://www.rzrgm.cn/EricsT/p/19005915

浙公網(wǎng)安備 33010602011771號