目錄
點(diǎn)亮一位數(shù)碼管
動態(tài)數(shù)碼管
100s倒計(jì)時(shí)
動態(tài)數(shù)碼管封裝代碼
點(diǎn)亮一位數(shù)碼管
段選:選中哪一位數(shù)碼管
位選:選中的數(shù)碼管要顯示的內(nèi)容
這是我對段選位選的理解,就是選中某個(gè)位置,賦值字形碼,顯示想要的圖形
如果只想讓第一個(gè)數(shù)碼管顯示,就只需要讓com1 = 1即可,其他comx都=0
如果想讓8個(gè)數(shù)碼管都亮,就讓com1~com8都賦值1,此時(shí)對數(shù)碼管賦值,8個(gè)數(shù)碼管都會顯示一致的內(nèi)容
如果想讓不同數(shù)碼管顯示不同的內(nèi)容且互不干擾,就需要不斷的段選、位選,段選、位選,段選、位選。
先打開段選的鎖存器(U8),用來選擇哪個(gè)數(shù)碼管亮,U8的Y6C = 1來控制
往前推導(dǎo)就是Y6 = 0;WR = 0(跳線帽鏈接)
Y6又由138譯碼器控制
P27 = 1; P26 = 1; P25 = 0;? ? ? ? //段選
?選中第一個(gè)數(shù)碼管 P00 = 1;
P27 = 1; P26 = 1; P25 = 1;? ? ? ? //位選
?第一個(gè)LED顯示個(gè)0? P0 = 0xC0;
代碼如下:
#include <STC15F2K60S2.H>
#include "smg.h"
void main()
{
P2 = 0xA0; P0 = 0x00; //初始化,關(guān)閉蜂鳴器繼電器
// P2 = 0x80; P0 = 0xFF; //Y4=0;選中LED,使其滅
//數(shù)碼管段選
P27 = 1; P26 = 1; P25 = 0; //Y6=0;Y6C=1; 使能鎖存器U8
P00 = 1; //選中第一個(gè)數(shù)碼管
//數(shù)碼管位選
P27 = 1; P26 = 1; P25 = 1; //Y7=0;Y7C=1; 使能鎖存器U7
P0 = 0xC0; //顯示0
while(1)
{ }
}
如果想讓第5個(gè)數(shù)碼管也顯示相同的內(nèi)容,就在段選的第二行代碼,將P04也選中
#include <STC15F2K60S2.H>
#include "smg.h"
void main()
{
P2 = 0xA0; P0 = 0x00; //初始化,關(guān)閉蜂鳴器繼電器
// P2 = 0x80; P0 = 0xFF; //Y4=0;選中LED,使其滅
//數(shù)碼管段選
P27 = 1; P26 = 1; P25 = 0; //Y6=0;Y6C=1; 使能鎖存器U8
P00 = 1; P04 = 1; //選中第一個(gè)數(shù)碼管
//數(shù)碼管位選
P27 = 1; P26 = 1; P25 = 1; //Y7=0;Y7C=1; 使能鎖存器U7
P0 = 0xC0; //顯示0
while(1)
{ }
}
動態(tài)數(shù)碼管
動態(tài)數(shù)碼管的工作原理及使用
動態(tài)顯示的特點(diǎn)是將所有位數(shù)碼管的段選線并聯(lián)在一起,由位選線控制是哪一個(gè)數(shù)碼管有效。這樣一來,就沒有必要每一位數(shù)碼管分配一個(gè)鎖存器,從而大大簡化硬件電路。選亮數(shù)碼管采用動態(tài)掃描顯示。所謂動態(tài)掃描顯示即輪流向各位數(shù)碼掛送出字形碼和相應(yīng)的位選,利用發(fā)光二極管的余暉和人眼視覺暫留作用,使人肉眼感覺各位數(shù)碼管同時(shí)都在顯示。動態(tài)顯示的兩幅比靜態(tài)顯示要差一些,所以在選擇限流電阻時(shí)應(yīng)略小于靜態(tài)顯示電路中的電阻。
明白了一位數(shù)碼管是怎么顯示的,就可以操作8個(gè)數(shù)碼管了
下面是一次操作8個(gè)數(shù)碼管動態(tài)顯示的代碼
第一個(gè)數(shù)碼管顯示1,第二個(gè)數(shù)碼管顯示2……第八個(gè)數(shù)碼管顯示8
#include "smg.h"
#include "intrins.h"
void Delay_ms(int xms) //15單片機(jī)延時(shí)函數(shù)@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
/*共陽極碼表 ABCDEF都是大寫*/
unsigned char wei[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x80, 0xC6, 0xC0, 0x86, 0x8E, 0xBF, 0xFF};
//0 1 2 3 4 5 6 7 8 9 A B C D E F - 滅
void SMG_Diaplay(void)
{
//第1個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x01; //選中第1個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[1];
Delay_ms(1);
//第2個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x02; //選中第2個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[2];
Delay_ms(1);
//第3個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x04; //選中第3個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[3];
Delay_ms(1);
//第4個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x08; //選中第4個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[4];
Delay_ms(1);
//第5個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x10; //選中第5個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[5];
Delay_ms(1);
//第6個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x20; //選中第6個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[6];
Delay_ms(1);
//第7個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x40; //選中第7個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[7];
Delay_ms(1);
//第8個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x80; //選中第8個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[8];
Delay_ms(1);
}
在while(1)里調(diào)用SMG_Diaplay即可
偷偷懶,用stc給的延時(shí)1ms代碼,延時(shí)1ms的目的是消影,即將本次的段選位選和上一次的段選位選分隔開,互不影響,否則數(shù)碼管會重影看不清,莎普愛思也沒用
函數(shù)中有_nop_();? ? 需要調(diào)用#include "intrins.h"頭文件
100s倒計(jì)時(shí)
用后三位數(shù)碼管依次顯示百十個(gè)位上的數(shù)字
我的思路是定義一個(gè)時(shí)間變量Time,初始化=100
在1s中斷的程序里讓Time--,這樣就實(shí)現(xiàn)了100s倒計(jì)時(shí)
如何讓這每一位都顯示在數(shù)碼管上呢?
我采用數(shù)位分離的方法,即將一個(gè)數(shù)的百位、十位、個(gè)位都分離出來,分別顯示
三位數(shù)數(shù)位分離方法
bai =?Time/100
shi =?Time/10%10
ge =?Time%10
?
?數(shù)碼管部分代碼
#include "smg.h"
#include "intrins.h"
void Delay_ms(int xms) //15單片機(jī)延時(shí)函數(shù)@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
/*共陽極碼表 ABCDEF都是大寫*/
unsigned char wei[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x80, 0xC6, 0xC0, 0x86, 0x8E, 0xBF, 0xFF};
//0 1 2 3 4 5 6 7 8 9 A B C D E F - 滅
void DJS_Show(unsigned char bai, unsigned char shi, unsigned char ge)
{
//第6個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x20; //選中第6個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[bai]; //顯示百位
Delay_ms(1);
//第7個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x40; //選中第7個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[shi]; //顯示十位
Delay_ms(1);
//第8個(gè)數(shù)碼管
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
P0 = 0x80; //選中第8個(gè)數(shù)碼管
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0 = wei[ge]; //顯示個(gè)位
Delay_ms(1);
}
#ifndef __SMG_H__
#define __SMG_H__
#include <STC15F2K60S2.H>
extern unsigned char wei[];
void SMG_Diaplay(void);
void DJS_Show(unsigned char bai, unsigned char shi, unsigned char ge);
#endif
主程序代碼
#include <STC15F2K60S2.H>
#include "smg.h"
#include "Timer0.h"
unsigned char Time = 100;
void main()
{
P2 = 0xA0; P0 = 0x00; //初始化,關(guān)閉蜂鳴器繼電器
P2 = 0x80; P0 = 0xFF; //Y4=0;選中LED,使其滅
Timer0_Init();
while(1)
{
DJS_Show(Time/100, Time/10%10, Time%10);
}
}
void Timer0_Rountine(void) interrupt 1
{ //5ms定時(shí)
static unsigned int Count0;
Count0++;
if(Count0 >= 200) //1s
{
Time--;
Count0 = 0; //軟件復(fù)位
}
}
這個(gè)100s是不精確的,因?yàn)榭刂茢?shù)碼管程序里時(shí)鐘有1ms延時(shí)
動態(tài)數(shù)碼管封裝代碼
改用一位一位單獨(dú)控制的數(shù)碼管,操作方便?文章來源:http://www.zghlxwxcb.cn/news/detail-547720.html
和51單片機(jī)數(shù)碼管程序差不多文章來源地址http://www.zghlxwxcb.cn/news/detail-547720.html
void Delay_ms(int xms) //15單片機(jī)延時(shí)函數(shù)@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_(); _nop_(); _nop_();
i = 11; j = 190;
do
{
while (--j);
} while (--i);
}
}
/*共陽極碼表 ABCDEF都是大寫*/
unsigned char NixieTable[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x80, 0xC6, 0xC0, 0x86, 0x8E, 0xBF, 0xFF};
//0 1 2 3 4 5 6 7 8 9 A B C D E F - 滅
void Nixie(unsigned char location, unsigned char number)
{
P2 = 0xC0; //Y6=0;Y6C=1; 使能鎖存器U8 P27 = 1; P26 = 1; P25 = 0;
switch(location)//選中LED位置,位選
{
case 1:P0 = 0x01;break;
case 2:P0 = 0x02;break;
case 3:P0 = 0x04;break;
case 4:P0 = 0x08;break;
case 5:P0 = 0x10;break;
case 6:P0 = 0x20;break;
case 7:P0 = 0x40;break;
case 8:P0 = 0x80;break;
}
P2 = 0xFF; //Y7=0;Y7C=1; 使能鎖存器U7 P27 = 1; P26 = 1; P25 = 1;
P0=NixieTable[number];//數(shù)字
Delay_ms(1);
P0=0xFF;//消影清零,否則重影
}
到了這里,關(guān)于【STC15單片機(jī)】動態(tài)數(shù)碼管的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!