当前位置:文档之家› 基于PIC16F877A时钟程序实验C程序

基于PIC16F877A时钟程序实验C程序

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
//时钟-->秒程序如下:
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《
#include
__CONFIG(HS&WDTDIS&LVPDIS);
#define U5A RB0
#define U5B RB1
#define U5C RB2
const unsigned char LED[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char i=0;
unsigned char j=0;
unsigned char d=1;
//interrupt
void interrupt ISR(void)
{
if(TMR1IF==1) //需要进一步判断是否是T1中断
{
TMR1H=0x0B; //重置初值
TMR1L=0xE9; //重置初值
TMR1IF=0; //清中断标志位,以备下次中断
if(++i>1)
{i=0;
j++;
}

}
}

void main(void)
{
TRISD=0x00;
TRISB=0xF8;
PORTD=0x00;
PORTB=0x00;
TMR1CS=0;
T1CKPS1=1;
T1CKPS0=1;
TMR1H=0x0B;
TMR1L=0xE9;
T1SYNC=0;
TMR1ON=1;
TMR1IF=0;
TMR1IE=1;
PEIE=1;
GIE=1;
while(1)
{
PORTD=0x00; //关一次显示,以免显示出鬼影
if(j>59)j=0;
if(++d>3) d=1;
if(d==2) //如果d=2,显示十位
{
U5A=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
U5B=1; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
U5C=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
PORTD=LED[j/10]; //将要显示的f的十位提取出来查表后送显示
}
else if(d==3) //如果d=3,显示个位
{
U5A=1; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
U5B=1; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
U5C=0; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
PORTD=LED[j%10];
}
}
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《
4位LED分、秒显示程序。
#include
__CONFIG(HS&WDTDIS&LVPDIS);
#define U5A RB0
#define U5B RB1
#define U5C RB2
const unsigned char LED[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char i=0;
unsigned char s=0;//秒计数
unsigned char d=1;//LED显示控制
unsigned char m=0;//分钟计数
//interrupt
void interrupt ISR(void)
{
if(TMR1IF==1) //需要进一步判断是否是T1中断
{
TMR1H=0x0B; //重置初值
TMR1L=0xE9; //重置初值
TMR1IF=0; //清中断标志位,以备下次中断
if(++i>1) //500ms中断一次,再计次2次后就是1000毫秒
{i=0;
s++;
if(s>59)m++;

//当秒计数器s大于60s时,分计数器加1
}

}
}

void main(void)
{
TRISD=0x00;
TRISB=0xF8;
PORTD=0x00;
PORTB=0x00;
TMR1CS=0;
T1CKPS1=1;
T1CKPS0=1;
TMR1H=0x0B;
TMR1L=0xE9;
T1SYNC=0;
TMR1ON=1;
TMR1IF=0;
TMR1IE=1;
PEIE=1;
GIE=1;
while(1)
{
PORTD=0x00; //关一次显示,以免显示出鬼影
if(s>59)s=0;
if(++d>3) d=0;
//**********************************************************************
//****************************秒钟计数**********************************
//**********************************************************************
if(d==2) //如果d=2,显示十位
{
U5A=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
U5B=1; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
U5C=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
PORTD=LED[s/10]; //将要显示的f的十位提取出来查表后送显示
}
else if(d==3) //如果d=3,显示个位
{
U5A=1; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
U5B=1; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
U5C=0; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
PORTD=LED[s%10];
}
//**********************************************************************
//*****************************分钟计数*********************************
//**********************************************************************
if(m>59)m=0; //当分钟计数器大于60分时归0
if(d==0) //如果d=2,显示十位
{
U5A=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
U5B=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
U5C=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
PORTD=LED[m/10]; //将要显示的f的十位提取出来查表后送显示
}
else if(d==1) //如果d=3,显示个位
{
U5A=1; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
U5B=0; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
U5C=0; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
PORTD=LED[m%10];
}
}
}






相关主题
文本预览
相关文档 最新文档