二、蓝桥杯练习之数码管动态扫描和定时器

这篇博客介绍了如何将共阴数码管显示代码转换为共阳数码管显示,主要涉及数码管段码和位码的取反操作。同时,详细讲解了单片机中定时器的工作方式配置,包括T0和T1的模式设置,以及定时中断函数的实现。数码管的动态扫描显示函数被放置在定时中断函数内部,以确保稳定显示。此外,还提到了不同定时器的中断优先级和如何配置它们。
摘要由CSDN通过智能技术生成

        数码管显示:

        数码管显示分为段选和位选,数码管段码和位选可以在比赛提供的资源包内ISP软件内获取,以下以共阴为例:

STC-ISP范例程序

         数码管定义和显示函数:**共阴**

unsigned char code t_display[]={                       //标准字库
//   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

unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码

        上面的代码是共阴的代码,板子上的却是共阳的,那么怎么办呢?我们是不是将它取反就可以了。

void Set_Hc573(unsigned char Yx)    //锁存器选择
{
	P2 &= 0X1F;
	P2 |= Yx << 5;
	P2 &= 0X1F;      //关锁存
}

void Set_SMG(unsigned char Dat)      //设置显示
{
	P0 = T_COM[Dat];        //位选
	Set_Hc573(6);    //开位选
	
	P0 = ~ t_display[Dat];  //段选
	Set_Hc573(7);
	
	P0 = 0XFF;    //消隐
	Set_Hc573(7);    //开段选
}

void DisPlay()    //显示
{
    for(i = 0;i >= 8;i ++)
    {
        Set_SMG(i);
        Delay(500);    //延时
    }
}

        定时器配置:

        这里只需记住定时器的配置,知道怎么使用就可以了。首先有两个定时器,T0和T1,(也有的单片机有T2),定时器有4种工作方式0,1,2,3;其中最常用的是方式1(16位),其次是方式2(8位自动重装,串口通讯中断会用到)。

定时器需要配置:TMOD |= 0x01;配置成使用定时器0,工作方式为1;同理使用定时器1工作方式1:TMOD |= 0x10;则同时使用两个定时器且工作方式为1,那么可以:TMOD |=0x11;

定时器1配置成工作方式2:TMOD |= 0x20;

接着配置(以定时器0举例):

void Timer0Init(void)		//2毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x40;		//设置定时初始值
	TH0 = 0xA2;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
    ET0 = 1;
    EA = 1;
}

定时器1也是同理的,只不过0要改成1.

接着定时中断函数和优先级:

定时器0:

void Timer0(void) interrupt 1 //默认中断优先级 1
{
        TH0 = (65536-2000)/256;
        TL0 = (65536-2000)%256; //定时器重载
        DisPlay();
}

定时器1:

void Timer1(void) interrupt 3 //默认中断优先级 3
{
        TH0 = (65536-2000)/256;
        TL0 = (65536-2000)%256; //定时器重载
        DisPlay();
}

注意:定时器0优先级为1,定时器1为3,串口中断优先级为4,总共有5个中断源,后面还会介绍外部中断和串口中断。

数码管动态扫描,显示函数放在定时中断函数里面,2ms扫一次是最稳定的!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值