PIC单片机-利用Timer2定时器的溢出中断实现动态扫描数码管
来源:互联网 发布:淘宝运动服童装 编辑:程序博客网 时间:2024/04/29 15:57
编写程序,令数码管的显示顺序为: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 <htc.h>#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; }}
0 0
- PIC单片机-利用Timer2定时器的溢出中断实现动态扫描数码管
- 51单片机使用定时器进行数码管动态扫描程序
- PIC单片机-七段数码管的使用
- PIC单片机-定时器的应用
- PIC单片机的中断过程
- 使用单片机的定时器0和中断实现9到0的倒计时功能,并用数码管显示
- 【程序】STM32F103单片机使用定时器DMA进行全自动8位数码管动态扫描
- 用中断方式,实现PIC单片机的串口传输
- 51单片机数码管动态扫描C程序
- 用单片机定时器和数码管实现的电子时钟
- 利用计时器实现扫描数码管
- 4.999计数器 数码管动态扫描(使用定时器)
- PIC中档单片机的中断总结
- lesson4~数码管的动态扫描
- PIC单片机(PIC16F877A)定时器
- 浅析PIC单片机定时器
- PIC单片机之中断
- 利用单片机的定时器中断,周期性输出矩形波
- 安卓drawText中的坑
- PIC单片机-定时器的应用
- Android6.0权限申请讲解及Demo实例
- Java中this和super的用法
- 287. Find the Duplicate Number
- PIC单片机-利用Timer2定时器的溢出中断实现动态扫描数码管
- 第五次CSS作业
- 2.1 493. Reverse Pairs (Divide and Conquer)
- MVC 基础和增删改、登录
- 不使用库函数 字符串与整型 转换
- 第六第七次css作业 企业站
- 基于IjkPlayer的视频播放器
- PIC单片机-AD转换
- (13)Air Band OpenCV2.4.13_改变图像对比度和亮度