历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2018年07月30日 | PIC单片机-利用Timer2定时器的溢出中断实现动态扫描数码管

2018-07-30 来源:eefocus

编写程序,令数码管的显示顺序为:0123,1230,2301,3012。


数码管显示分静态扫描和动态扫描,动态扫描显示一般分两种方式


1、选用一个数码管位,写断码显示,延时一定的时间,关闭显示,选择下一位,依次类推,完成数码管的多位扫描显示,这种方式比较耗CPU资源。


2、利用定时器,每隔一个固定的时间去选通,写断码,这种方式可以降低CPU的占用时间,同时,每个数码管显示时间固定,不存在“抖”的现象。


本程序中使用第二种方式,利用Timer2定时器的溢出中断实现动态扫描,Timer2包含一个周期控制寄存器,可以自动控制溢出周期。周期控制寄存器PR2的存在使得TIMER2的计数值有一个可以自由设定的上限。当TIMER2与PR2相等,就会清零。


若使数码管的显示顺序为:0123,1230,2301,3012,可对四个数码管分别设置四个数组:


const uint16 display1[] = {0, 1, 2, 3}; //第一位数码管显示顺序

const uint16 display2[] = {1, 2, 3, 0}; //第二位数码管显示顺序

const uint16 display3[] = {2, 3, 0, 1}; //第三位数码管显示顺序

const uint16 display4[] = {3, 0, 1, 2}; //第四位数码管显示顺序

使得各位分别循环显示相应数字。具体实现方法见源代码。


#include

 

#define uint8 unsigned char

#define uint16 unsigned int

 

__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位

//WDTE_OFF:disable watchdog timer       看门狗禁止

//LVP_OFF:low voltage programming disabled  低电压编程禁止

//FOSC_HS:high speed crystal/resonator  4M以上晶振选择HS高速

//PWRTDIS:disable power up timer

//BOREN_OFF:disable brown out reset

 

/*************************定义全局变量******************************************/

 

uint16 count = 0;

uint16 count2 = 0;

uint8 chosebit = 0;

const uint8 disp[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //0~9共阳数码管段码表

uint16 i = 0;

const uint16 display1[] = {0, 1, 2, 3}; //第一位数码管显示顺序

const uint16 display2[] = {1, 2, 3, 0}; //第二位数码管显示顺序

const uint16 display3[] = {2, 3, 0, 1}; //第三位数码管显示顺序

const uint16 display4[] = {3, 0, 1, 2}; //第四位数码管显示顺序

 

/*******************************************************************************

* 函 数 名: Time2_Init(void)

* 函数功能: 定时器2初始化

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void Time2_Init(void)

{

    T2CON = 0x01;   //postscale 1:1 prescale 1:4

    PR2 = 250;      //匹配寄存器   1*4*250*200ns = 200us

    TMR2 = 0x00;    //计数器清零

    TMR2IE = 1;

    TMR2IF = 0;

    PEIE = 1;           //开外设中断

    GIE = 1;            //开总中断

}

 

/*******************************************************************************

* 函 数 名: LED_Display_Init(void)

* 函数功能: 数码管显示初始化

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void LED_Display_Init(void)

{

    ADCON1 = 0x86;  //10000110  PORTA口设置为数字IO口

    TRISA &= 0xE3;  //RA2、RA3、RA4设置成输出模式

    TRISE &= 0xEF;  //配置PORTD为普通IO口,对PORTD的操作务必加上这句

    TRISD = 0x00;   //数据线配置为输出

}

 

/******************************************************************************

* 函 数 名: main(void)

* 函数功能: 利用定时器2进行计时

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void main(void)

{

    LED_Display_Init();

    Time2_Init();

    TMR2ON = 1;     //开始计数

    while(1)

    {

    }

}

 

/******************************************************************************

* 函 数 名: interrupt Time2(void)

* 函数功能: 中断处理程序

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void interrupt Time2(void)

{

    if(TMR2IF)              //定时器2计数值与pr2匹配

    {

        TMR2IE = 0;

        TMR2ON = 0;         //停止计数

        TMR2IF = 0;

        count++;            //计数器加1

        count2++;

        if(count >= 25)     //200us*25=5ms(200HZ)

        {

            count = 0;

            PORTD = 0xFF;

            switch(chosebit)

            {

            case 0:

                PORTA = (PORTA & 0xE3) | 0x0c;  //选通第一位数码

                PORTD = disp[display1[i]];      //送字型

                chosebit = 1;

                break;

            case 1:

                PORTA = (PORTA & 0xE3) | 0x10;  //选通第二位数码

                PORTD = disp[display2[i]];      //送字型

                chosebit = 2;

                break;

            case 2:

                PORTA = (PORTA & 0xE3) | 0x14;  //选通第三位数码

                PORTD = disp[display3[i]];      //送字型

                chosebit = 3;

                break;

            case 3:

                PORTA = (PORTA & 0xE3) | 0x18;  //选通第四位数码

                PORTD = disp[display4[i]];      //送字型

                chosebit = 0;

                break;

            default:

                break;

            }

        }

        if(count2 >= 5000) //当前显示数字驻留 5000/100*(4*5)mS=1S

        {

            i++;

            if(i == 4)

            {

                i = 0;

            }

            count2 = 0;

        }

        TMR2 = 0x00;    //计数器清零

        TMR2ON = 1;

        TMR2IE = 1;

    }

}


推荐阅读

史海拾趣

Holt Integrated Circuits公司的发展小趣事

Holt在CAN控制器领域也取得了重要突破。作为世界上第一家将CAN控制器和收发器集成在同一紧凑塑料封装中的公司,Holt的ARINC 825(CAN)数据总线产品为用户提供了极大的便利。这种集成设计不仅减小了产品的体积和重量,还提高了系统的可靠性和稳定性。Holt的这一创新成果,不仅推动了CAN总线技术在航空航天领域的广泛应用,也为其他行业的自动化控制提供了有力支持。

以上五个故事,从不同角度展现了Holt Integrated Circuits公司在电子行业中的发展历程和卓越成就。这些事实不仅证明了Holt在技术创新和市场拓展方面的实力,也为其在未来的发展中奠定了坚实的基础。

Anixter Inc公司的发展小趣事

在军事和商用航空领域,MIL-STD-1553标准是一项至关重要的通信协议。Holt的MIL-STD-1553解决方案以其小巧的体积和高性价比,在行业内脱颖而出。这些解决方案在单个芯片上集成了整个MIL-STD-1553接口,为用户提供了极大的便利。Holt的旗舰IC产品更是因其易用性和高性能而广受好评,成为业界内的标杆产品。

全鹏(CHAMPION)公司的发展小趣事

全鹏公司一直重视研发和创新。为了不断满足市场需求,公司投入大量资源用于新技术和新产品的研发。通过引进高素质、高学历的研发人员,建立先进的研发实验室和测试中心,全鹏公司在产品研发方面取得了显著成果。这些新技术和新产品的推出不仅提升了全鹏公司的市场竞争力,也为客户带来了更好的使用体验。

ACI [Applied Concepts, Inc.]公司的发展小趣事

为了进一步提升市场影响力,ACI公司积极寻求与其他行业领导者的战略合作。通过与知名电子产品制造商、芯片供应商等建立紧密的合作关系,ACI得以获取更优质的资源和技术支持。这些合作不仅提升了ACI的产品质量和技术水平,还扩大了公司的市场影响力,为公司的长远发展奠定了坚实基础。

Foxconn_Optical_Interconnect_Technologies__Inc.公司的发展小趣事

在电子行业的激烈竞争中,ACI公司凭借其卓越的技术创新能力脱颖而出。公司研发团队不断攻克技术难关,推出了一系列具有竞争力的电子产品。这些产品不仅性能卓越,而且设计独特,满足了消费者的多样化需求。通过技术创新,ACI成功打开了市场,赢得了消费者的青睐。

Dialog公司的发展小趣事

Dialog公司最初可以追溯到1972年,当时它是由美国洛克希德导弹航空公司所属的一个情报科学实验室负责建立的。这个实验室的初衷是探索和开发新的通信技术,以支持军事和情报领域的需求。随着时间的推移,这个实验室逐渐积累了丰富的技术经验和研发实力。

问答坊 | AI 解惑

基于单片机PIC16F74的电动按摩椅的研制

  本文介绍了一款采用PIC16F74单片机作为微处理芯片的电动按摩椅控制系统,具体包括有系统的组成和功能介绍、硬件电路的设计、软件功能实现以及抗干扰措施。   1:引言   随着我国经济的迅速发展和人们生活水平的不断提高,按摩椅等保健产 ...…

查看全部问答>

关于modbus协议

大家在做modbus通讯协议的时候,一般怎么判断接收数据的结束?…

查看全部问答>

关于ARM中的LDR与MOV的一个问题

对于LDR R1,=0x245这条伪指令,会被编译器自动转换为两条指令: 第一条是为0x245这个值在内存中分配一个地址 第二条是LDR R1,[Rn](Rn即为0x245这个值分配的地址) 我想请问,如果我使用两条指令: MOV R1,#0x240 ADD R1,R1,#0x5 同样也能够 ...…

查看全部问答>

用DDK和WriteFile读写U盘扇区的问题

最近在研究U盘过滤驱动,需要读取U盘扇区。 我用WriteFile向U盘第二个扇区写入一个标识,是我自己生成的一个序列号。 但是随后我用DDK读取第二个扇区时没有读取到这个标识。 然后我用DDK直接向U盘扇区写入一个标识,再用DDK读取时能读取到。 我 ...…

查看全部问答>

急求win 7下TC35Test测试程序

刚买了TC35开发板,系统是win 7的,配套的测试程序不能用 那位朋友有TC35Test程序啊,适合win 7的      394397573@qq.com   谢谢…

查看全部问答>

EMB-9459T的工业主板,装什么系统好?

   单位最近买了如题主板一块,配置:2G内存+4G SD卡。主频1.6Ghz。    我们先装了个XP精简版的,显然有点大材小用了,我感觉像这种配置的工控    主板是不是装个嵌入式系统比较好呢?       &nb ...…

查看全部问答>

怎样实现IIC和arm2410的通信

我现在做rtc驱动需要实现iic和cpu的通信 请问具体的步骤流程是什么?…

查看全部问答>

ZLG M0

说实话 周立功的TKSTUDIO 真的不怎么样 真的 很不爽用起来 而且载程序设置麻烦的一塌糊涂 很不人性化 经常同一个工程 过一段时间不用他 在DEBUG 他就不行了   还有各问题想请教:M0 左边一块是LPC1343 右边是LPC1114  两块是独立的吧 ...…

查看全部问答>

单片机入门,小霸王其乐无穷啊。。。

我是菜鸟。。。想入门单片机拆遍家里的东东,终于在老游戏机里找到了可以DIY一下的材料这个是8位机的卡带想来请教一下论坛里的高手1、照片里的三个芯片都有什么作用???2、有没有可能自己擦写烧录8位机的游戏进去???3、用这个入门合不合适?? ...…

查看全部问答>

cmd文件中的page0 和page1

本帖最后由 dontium 于 2015-1-23 13:23 编辑 cmd 文件中的page0和page1同地址分页中page0,page1是一会事吗? 地址分页中有page0 page1 .. page127 …

查看全部问答>