/*******************************************************************************
* 标 题: PIC-ST2学习板演示程序--数码管移动显示
* 文 件 名: shumaguan
* 建立日期: 2009.8.8
* 修改日期: 2010.5.4
* 版 本: V1.0
* 作 者: simomli
********************************************************************************
* 功能描述: 显示0到3,并循环左移
********************************************************************************
*【版权】Copyright(C) 2009-2019 All Rights Reserved
*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*******************************************************************************/
//#include <pic1687x.h>
#include <htc.h>
#define uint8 unsigned char
#define uint16 unsigned int
__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位
//WDTDIS:disable watchdog timer
//LVPDIS:low voltage programming disabled
//HS:high speed crystal/resonator
//PWRTDIS:disable power up timer
//BORDIS:disable brown out reset
/*************************定义全局变量******************************************/
volatile uint8 runleft = 0;
volatile uint8 count = 0;
volatile uint8 counter = 0;
volatile uint8 chosebit = 0;
uint8 disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管段码表
/************************声明函数***********************************************/
void DelayMS(uint16 delay);
void Time2_Init(void);
/*******************************************************************************
* 函 数 名: DelayMS(uint delay)
* 函数功能: 毫秒延时 for 20MHZ
* 入口参数: delay
* 返 回: 无
*******************************************************************************/
void DelayMS(uint16 delay)
{
uint16 i;
for(;delay>0;delay--)
for(i=0;i<453;i++);
}
/*******************************************************************************
* 函 数 名: Time2_Init(void)
* 函数功能: 定时器2初始化
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void Time2_Init(void)
{
T2CON = 0x00;
TMR2 = 0x00;
PR2 = 250;
TMR2IF = 0; //定时器2中断标志位清零
GIE = 1; //开总中断
PEIE = 1; //开外设中断
TMR2IE = 1; //开定时器中断
}
/******************************************************************************
* 函 数 名: main()
* 函数功能: 显示0到3,并循环左移
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void main()
{
uint8 i,j;
Time2_Init();
TMR2ON = 1;
while(1)
{
}
}
/******************************************************************************
* 函 数 名: interrupt Counter(void)
* 函数功能: 中断处理程序
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void interrupt Counter(void)
{
if(TMR2IF == 1)
{
TMR2IE = 0; //关定时器0中断
TMR2IF = 0; //清标志位
count++; //计数值加1
if(count == 100) //200HZ的刷新频率
{
count = 0;
counter++;
if(counter == 200)
{
counter = 0;
runleft++;
if(runleft == 4)
{
runleft = 0;
}
}
ADCON1 = 0x8E; //设置PORTA0为模拟输入,其他为IO口
TRISA &= 0xC1;
TRISD = 0x00; //数据线配置为输出
PORTD = 0xFF; //关显示
switch(chosebit)
{
case 0:
PORTA = 0xFF;
PORTA &= ~0x02;
PORTD = disp[(0+runleft)%4]; //送字型
chosebit = 1;
break;
case 1:
PORTA = 0xFF;
PORTA &= ~0x04;
PORTD = disp[(1+runleft)%4]; //送字型
chosebit = 2;
break;
case 2:
PORTA = 0xFF;
PORTA &= ~0x08;
PORTD = disp[(2+runleft)%4]; //送字型
chosebit = 3;
break;
case 3:
PORTA = 0xFF;
PORTA &= ~0x10;
PORTD = disp[(3+runleft)%4]; //送字型
chosebit = 0;
break;
default:break;
}
}
TMR2 = 0x00;
TMR2IE = 1; //开中断
}
}