打印

写了一个闹钟程序,24小时差12秒,适合初学,大家交流下

[复制链接]
1122|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jakezlc|  楼主 | 2009-5-20 22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//////////////////////////////////////////////////
//  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; 
}

相关帖子

沙发
liqindz| | 2009-5-20 23:35 | 只看该作者

不错 程序收藏拉

使用特权

评论回复
板凳
jakecumt| | 2009-5-21 00:00 | 只看该作者

写的不错 那去研究下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

49

帖子

0

粉丝