历年的蓝桥杯单片机组比赛都会考到数码管模块;对于省赛以及国赛来说,动态数码管都是必考模块!
现在来给大家介绍动态数码管的使用方法
1、对数码管进行操作,无需改变跳帽的位置
2、数码管相关原理图如下
-
在这里我只展示了数码管显示模块的主要部分。其他是一些门电路,大家可以参照官方给定的PDF。
-
注意CT017D开发版上的数码管是共阳数码管。
-
打开段选有关锁存器的代码为:P2=0XE0;打开位选有关锁存器的代码为:P2=0XC0;关闭段选和位选有关锁存器的代码均为:P2=0X00;
-
动态数码管扫描的一般操作:一、先打开位选锁存器,将0x00送入锁存器中并保存。(消隐)二、打开段选锁存器,将需要的数值送入对应数码管中并保存。三、再次打开位选锁存器,将相应位选代码送入对应锁存器并保存。
3、如下,附上动态数码管扫描代码块。
#include "STC15F2K60S2.h"
#define u8 unsigned char
u8 code t_display[]={ //段选代码,stc—isp可生成,但注意使用时应取反
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位选代码,stc—isp可生成
void Timer0Init(void) //配置定时器0,1ms中断
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0xCD;
TH0 = 0xD4;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
}
u8 test_display[8]={0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66};//编辑要进行数码管显示的数组
void main()
{
P0=~0X00;P2=0X80;P2=0X00; //关闭led外设
P2=0XA0;P0=0X00;P2=0X00; //关闭蜂鸣器以及寄存器外设
Timer0Init();
while(1)
{
//循环执行任务
}
}
void Timer0() interrupt 1 //定时器0中断
{
static int smg_count=0,i=0;
smg_count++;
if(smg_count==2)//2ms扫描一次,人眼分辨不出扫描先后
{
smg_count=0;
P2=0XC0;P0=0X00;P2=0X00;//消隐
P2=0XE0;P0=~test_display[i];P2=0X00;//对第i+1个数码管赋值,注意取非号
P2=0XC0;P0=T_COM[i];P2=0X00;//选通第i+1个数码管
i++;
if(i==8){i=0;}//从第八个数码管回到第一个数码管
}
}