////////////////////////////////////////////////// // Author : Toby // Date : 2008/09/06 // Function : 时间显示与定时功能等 // MCU : PIC16F877A // C Compiler : PICC 8.05 // IDE : MPLAB IDE v8.10 /////////////////////////////////////////////////
#include<pic.h> __CONFIG(0x0f3a); #define ADD RB0 #define REDUCE RB1 #define LED RC2 #define SEC RC1 void reset(void); void tmint(void); void interrupt clkint(void); delay(unsigned char x); const unsigned char TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90}; //0-9的数据段 void display(void); unsigned long QC=0,temp=0,n=1; double bf=0,sc=0;
void main() //主函数 { reset(); display(); }
void reset(void) { ADCON1=0B0110; //全做普通I/O TRISA=0x0; PORTA=0xff; TRISD=0x0; PORTD=0xff; TRISB=0xff; PORTB=0x0; TRISC=0x0; PORTC=0x0; tmint(); GIE=1; }
void display(void) //显示函数 { unsigned long qian_1,bai_1,shi_1,shiwan,wan_1,wan,qian,bai,shi,ge; //定义临时变量 while(1) { bf=QC; if(ADD==0) QC+=2; //时间(秒)调整加 if(REDUCE==0) QC-=2; //时间(秒)调整减 if((ADD==0)&&(REDUCE==0)) QC+=2500; //两个按键同时按下,时间快速增加 if(bf>=1318359.375) QC=0; //24小时到,重新开始计时,如果24小时时间有 误差可以在这修正。 if(((bf>430297.8515625)&&(bf<439453.125))||((bf>549316.40625)&&(bf<558471.6796875))||((bf>659179.6875)&&(bf<668334.9609375))||((bf>704956.0546875)&&(bf<714111.328125))||((bf>823974.609375)&&(bf<833129.8828125))||((bf>933837.890625)&&(bf<942993.1640625))) LED=1; else LED=0; //----------7:50---8:00------------- ----------------10;00---10:10----------- ----------12:00---12:100------------ --------------12:50---13:00---------- -------------15:00---15:10--------- ---------17:00---17:10------------- temp=bf/15.2587890625; shiwan=temp/36000; //求小时的十位
wan_1=temp/3600; //求小时的个位 wan=wan_1%10;
qian_1=temp%3600; //求分钟的十位 qian=qian_1/600;
bai_1=qian_1%600; //求分钟的个位 bai=bai_1/60; shi_1=bai_1%60; //求秒的十位 shi=shi_1/10; ge=shi_1%10; //求秒的个位
PORTD=TABLE[shiwan]; //查表得小时的十位数, PORTA=0B111110; //RA0输出低电平,点亮小时的十位数 delay(5); //延时一定时间,保证显示亮度
PORTD=TABLE[wan]; // 小时个位显示 PORTA=0B111101; delay(5);
PORTD=TABLE[qian]; //分钟十位显示 PORTA=0B1111011; delay(5);
PORTD=TABLE[bai]; //分钟个位显示 PORTA=0x37; delay(5);
PORTD=TABLE[shi]; //秒的十位显示 PORTA=0x2F; delay(5);
PORTD=TABLE[ge]; //查表得秒的个位位数, PORTA=0x1F; //RA5输出低电平,点亮秒的个位数 delay(5); //延时一定时间,保证显示亮度 PORTD=0xff; } }
delay(unsigned char x) //延时函数 { unsigned char a=x,b; for(a;a--;) for(b=50;b>=1;b--) asm("nop"); }
void tmint(void) //定时初始化函数 { T0CS=0; //T0CS是TMR0的时钟源选择位,当其=1时是用RA4(T0CKI)的外部输入时钟,当其=0时是用内部指令周期时钟(CLKOUT) PSA=0; //PSA是预分频器分配位,当其=1预分频器分配给WDT,当其=0时预分频器分配给Timer0 模块 PS2=1; //PS2:PS1:PS0:预分频比选择位 1 1 1是256分频 PS1=1; PS0=1; T0IF=0; //T0IF是TMR0溢出中断标志位,当其=1时TMR0 寄存器已经溢出(必须用软件清零),当其=0时寄存器尚未发生溢出 T0IE=1; //T0IE是TMR0 溢出中断允许位当其=1时允许TMR0 溢出中断,当其=0时禁止TMR0 溢出中断 }
void interrupt clkint(void) //定时器中断函数 { TMR0=0x0; QC++; T0IF=0x0; }
|