搜索
bottom↓
回复: 1

程序架构-在做时钟显示的时候【恢复】

[复制链接]

出0入0汤圆

发表于 2008-11-14 09:26:19 | 显示全部楼层 |阅读模式
最近搞了一个时钟程序但是感觉在程序构架方面很不尽人意不知道该怎么搞还有就是显示时间时显示闪不正常(飞思卡尔单片机)程序

#include <hidef.h> /* for EnableInterrupts macro */

#include "at7022.h"

#include "derivative.h" /* include peripheral declarations */

#include "main_asm.h"

const char add@0xffbd=0Xce; //程序保护地址;  

//const unsigned char add1@0xC000=10;

//参数初始化

const unsigned char add2@0xC001=48;//iFnumber[0]   //分

const unsigned char add3@0xC002=23;//iFnumber[1]   //时

const unsigned char add4@0xC003=40;//iFnumber[2]   //分

const unsigned char add5@0xc004=20;                //时

const unsigned char add6@0xc005=39;             //分

const unsigned char add7@0xc006=19;//iFnumber[5]  //时

//按键

#define FUWEI PTFD_PTFD4

#define GONGNENG PTDD_PTDD1

#define ZENGJIA PTAD_PTAD0

#define JIANSHAO  PTDD_PTDD0   //低有效

//指示灯

#define guozai PTED_PTED6

#define run PTFD_PTFD0

#define duanxiang PTGD_PTGD1 //低有效

//继电器

#define JDQ PTAD_PTAD1 //高有效

//数码管位选                                                         

#define gong1 PTCD_PTCD0

#define gong2 PTCD_PTCD1

#define shu1  PTED_PTED3

#define shu2  PTED_PTED4

#define shu3  PTED_PTED5

//数码管段选

#define seg_a      PTCD_PTCD5

#define seg_b      PTFD_PTFD5

#define seg_c      PTED_PTED0

#define seg_d      PTED_PTED2

#define seg_e      PTED_PTED1

#define seg_f      PTCD_PTCD4

#define seg_g      PTCD_PTCD2

#define seg_dp     PTCD_PTCD3 

/////DS1302定义

//引脚连接

#define ds_1302_clk PTGD_PTGD0//kong

#define ds_1302_dat PTGD_PTGD2//

#define ds_1302_rst PTAD_PTAD1//kong





//函数说明



//数码管前两位段码对应口

//     PTC5_A PTF5_B PTE0_C PTE2_D PTE1_E PTC4_F PTC2_G PTC3_DP

//显示 A  1110 1110  238 0111 0111   77

//     b  0011 1110  62  0111 1100   7C

//     C  1001 1100  156 0011 1001   39

//     d  0111 1010  122 0101 1110   5E

//     E  1001 1110  158 0111 1001   79

//     F  1000 1110  142 0111 0001   71 

//     S  1011 0110  182 0110 1101   6D 

//     P  1100 1110  206 0111 0011   73 

//     I  0000 1100  12  0011 0000   30 

//数码管后三位段码对应IO

//     PTC2_A PTC5_B PTE1_C PTF5_D PTC4_E PTC3_F PTE2_G PTE0_DP



//   __A___

// F|      |B

//  |__G___|

//  |      |C

// E|__D___|

//     

//显示 0 PTC2 PTC5 PTE1 PTF5 PTC4 PTC3         /     0001 1111          F3       31

//     1      PTC5 PTE1                        /     0000 0110          06       6

//     2 PTC2 PTC5      PTF5 PTC4      PTE2    /     0101 1011          5B       91

//     3 PTC2 PTC5 PTE1 PTF5           PTE2    /     0100 1111          4F       79

//     4      PTC5 PTE1           PTC3 PTE2    /     0110 0110          66       102

//     5 PTC2      PTE1 PTF5      PTC3 PTE2    /     0110 1101          6D       109

//     6 PTC2      PTE1 PTF5 PTC4 PTC3 PTE2    /     0111 1101          7D       125

//     7 PTC2 PTC5 PTE1                        /     0000 0111          07       7

//     8 PTC2 PTC5 PTE1 PTF5 PTC4 PTC3 PTE2    /     0111 1111          7F       127

//     9 PTC2 PTC5 PTE1 PTF5      PTC3 PTE2    /     0110 1111          6F       111

//     全黑                                    /     0000 0000          00       0

//位变量采用位域结构体的类型定义

//各种标志位

struct{

  unsigned Ft2ms    :1;   //4ms标志

  unsigned Ft10ms   :1;   //10ms标志

  unsigned Ft0d1s   :1;   //0.1s标志

  unsigned Ft1s     :1;   //1s标志

  unsigned Fdaca    :1;   //数据已改变标志

  unsigned Fnc10    :1;   //改变量为10

  unsigned Ferr     :1;   //故障标志

  unsigned Frun     :1;   //运行标志

  unsigned Faurd    :1;   //间隔时间标志

  unsigned Fstao    :1;   // 启动结束标志

  unsigned bGlitterLight :1;  //闪烁亮标志位

  unsigned bValueGlitter :1;  // 功能项值闪烁标志位

}myFlag;



////////////////////////////////////////键盘扫描控制变量

byte cScanKey;                                        //扫描键盘的键位编码

byte cScanNum;                                        //连续键盘扫描次数

byte iStakeout;                                        //切换监视状态延时计数

byte cGlitterNum;                        //闪烁控制计数值

//bit bGlitterLight;                                        //闪烁亮标志位

//bit bValueGlitter;                                        //功能项值闪烁标志位

word count;  //定时器计数值



byte RLEDIX;  //数码管显示指针



word iStakeoutValue;                        //数码管显示值

word cInteger;//整数部分         

byte iResidue;//余数部分

byte cHex1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

byte cHex[10]={0xF3,0x11,0x6B,0x5B,0x99,0xDA,0xFA,0x51,0xFB,0xDB};        //显示数对应的十六进制数  后三位

                                                        //,0,,,,1,,,,2,,,,3,,,,4,,,,5,,,,6,,,,7,,,,8,,,,9

byte cDisplayNumHex[5];                //数码管显示对应的十六进制数值



byte cDisplayId[5]={0x01,0x01,0x01,0x01,0x01};                                                //选通数码管当前列的控制值                                                                

byte ErrorId[12]={0x00,0xED,0xB9,0xB8,0xBE,0xDC,0xF3,0xF6,0x6F,0x4F,0x54,0x79};                        //故障指示代码

                                                                //,,数码管显示为黑,,,S.=0xED,,C.=0xB9,,,L.=0xB8,,U.=0xBE,,o.=0xDC,,P.=0xF3,,H.=0xF6,,9=0x6F

                                                                //,,3=0x4F,,n=0x54,,E=0x79,,

                                                                //显示 0  

                                                                //     1  0x11

                                                                

byte iFnumber[6]={10,20,10,20,10,20};   //功能项设定值

byte Fmin[6]={0,0,0,0,0,0};              //功能最小值

byte Fmax[6]={59,23,59,23,59,23};     //功能项最大值

word Ia,Ib,Ic;

byte frun;



//min = iFnumber[0];

//////////////////////定义变量和声明函数/////////////////////                                    

//秒,分,时,日,月,星期,年

//

unsigned char Curtime[7];



unsigned char wdata[7]={0x30,0x30,0x16,0x14,0x08,0x02,0x07};



unsigned char rdata[7];        

                                                                                                

Bool bScanEmpty;        

word RARTCS;  //自动延时计数值

word Rlcia;  //显示电流累加单元 A

word Rlcib;  //显示电流累加单元 B

word Rlcic;  //显示电流累加单元 C

byte Rlcix;  //显示累加计次单元

word Rcia;   //显示 A

word Rcib;   //显示 B 

word Rcic;   //显示 C

byte Rlbix;  //保护电流累计次单元

word Rlbia;  //保护电流累加单元A

word Rlbib;  //保护电流累加单元B

word Rlbic;  //保护电流累加单元 C

word Rimax;  //保护电流最大值

word Rimin;  //保护电流最小值

byte Rcsat;  //启动计时单元

byte Rovlc;  //过载指示闪烁单元

word Rdov1;  //过载延时时间

word Riov1;  //过载电流最大值

byte Roulc;  //清闪烁控制单元

byte Rksp1;  //按键速率恐控制单元

byte Rksp2;   

byte KSSIX;  //功能按键指针

byte KSIX;

byte Rdsas;  //数据保存延时单元

word STSDC; //自启动延时计数

byte Rsiop;  //电流最小相

byte ad_h;   //ADC转换结果的高2位

byte ad_l;   //ADC转换结果的低8位

byte ch_s;   //通道选择

//函数声明

void scjcn(void);//继电器控制子程序

void sadcn(void);//AD转换控制子程序

void ssccn(void); //显示更新子程序

void smdsc1(word iStakeoutValue);//显示转换子程序

void skey(void);//按键处理子程序

//void kadmin(void);

//void kadhour(void);



//=========================

//函数名:Init_KBI()

//功能:初始化按键

//=========================

void Init_KBI(void)

{

        PTFD_PTFD4 = 1;//端口A数据寄存器初始化为1

        PTAD_PTAD0 = 1;

        PTDD_PTDD0 = 1;

        PTDD_PTDD1 = 1;//数据寄存器初始化为高 低有效

        

        PTFDD_PTFDD4 = 0;

        PTADD_PTADD0 = 0;

        PTDDD_PTDDD0 = 0;

        PTDDD_PTDDD1 = 0;



        

        PTFPE_PTFPE4=1;

        PTAPE_PTAPE0=1;

        

        PTDPE_PTDPE1=1;

        PTDPE_PTDPE0=1;

        

        cScanKey=0;                                                //清扫描键盘的键位编码

        cScanNum=0;                                                //清连续键盘扫描次数

        bScanEmpty=1;                                        //上次扫描为空

}



//====================================================================//

//

//================================================================//

void IO_PortsInit(void)

{

        PTFD_PTFD0 = 1; //端口A数据寄存器初始化为1  指示灯LRUN

        PTFDD_PTFDD0 = 1; //引脚PTG0作为输出引脚

        

        PTED_PTED6 = 1;

        PTEDD_PTEDD6 = 1; //引脚PTD2作为输出引脚      指示灯LOVL

        

        PTGD_PTGD1 = 1; //指示灯LLOP

        PTGDD_PTGDD1 = 1;

        

        PTBD_PTBD3 = 0; //继电器控制  高有效

        PTBDD_PTBDD3=1; //输出

        

        PTCD_PTCD0 = 0;

        PTCDD_PTCDD0=1; //功能1

        

        PTCD_PTCD1 = 0;

        PTCDD_PTCDD1=1; //功能2

        

        PTED_PTED3 = 0;

        PTEDD_PTEDD3=1; //数据3

        

        PTED_PTED4 = 0; 

        PTEDD_PTEDD4=1; //数据2

        

        PTED_PTED5 = 0;

        PTEDD_PTEDD5=1; //数据1

        

        PTCD_PTCD5 = 0;

        PTCDD_PTCDD5=1; //SEG_A

        

        PTFD_PTFD5 = 0;

        PTFDD_PTFDD5=1; //SEG_B

        

        PTED_PTED0 = 0; 

        PTEDD_PTEDD0=1; //SEG_C

        

        PTED_PTED2 = 0;

        PTEDD_PTEDD2=1; //SEG_D

        

        PTED_PTED1 = 0; 

        PTEDD_PTEDD1=1; //SEG_E

        

        PTCD_PTCD4 = 0;

        PTCDD_PTCDD4=1; //SEG_F

        

        PTCD_PTCD2 = 0; //数据寄存器 高有效 初始化为低

        PTCDD_PTCDD2=1; //SEG_G 方向寄存器  输出

        

        PTCD_PTCD3 = 0;

        PTCDD_PTCDD3=1; //SEG_DP

        



        

}



//================================================================================================================

//函数名:Init_ADC

//作用:初始化ADC

//================================================================================================================

void Init_ADC(void)

{

        ADC1CFG=0xF8;//低功耗模式,10位精度,ADCK=总线频率

        ADC1SC1=0x1f;//

        ADC1SC2=0x00;//0x00:软件触发,比较功能禁止;0x40:RTI触发,比较功能禁止

        APCTL1=0x01;//通道引脚使能:0x01:AD0;0x02:AD1;0x04:AD2依此类推

//        ch_s=0;//选择0通道

}

//===================================//

//显示初始化

//==================================//

void Init_display() 

{

  

  RLEDIX=0;

  KSSIX=0;

  frun=0;

  

}

//=======================================================

//函数名:Init_mclk//作用:MCLK引脚输出总线时钟的二分之一,系统时钟的四分之一

//=======================================================

void Init_mclk(void)

{

        SMCLK_MPE=1;

        SMCLK_MCSEL=1;      //输出为5M

}

//===========================

//函数名:void SysInit(void)

//作用:设置ICG;外接晶振10M

//===========================

void SysInit(void)

{

  ICGC1 = 0x78;//P=1 FLL使能外部参考模式  振荡器配置为高频范围,FLL 环系数P=1

  ICGC2 = 0x00;//N=4,R=1,系统时钟=Fext*P*N/R Fext为晶振频率 20总线

  SOPT = 0x00; //看门狗关闭

}



//==============================================================

//函数名:Init_SPI

//作者:KLY

//日期:2007-11-8 10:34    

//功能:初始化SPI,波特率500K

//输入参数:无

//返回值:无

//修改记录:无

//===============================================================

void Init_SPI(void) 

{



    SPI1C1=0X50;//使能SPI模块为主模式

    SPI1C2=0X00;

    SPI1BR=0X21; //设置通讯波特率=20M/3/4=500K

}

///延时子程序

void delay(word x)

{ 

   word y;

   for(y=0;y<x;y++);

    

}



/*******************************************

函数名称:Reset_DS1302

功    能:对DS1302进行复位操作

参    数:无

返回值  :无

********************************************/

void Reset_DS1302(void)

{

    PTADD_PTADD1=1;  //RST对应的IO设置为输出状态  //ds_1302_rst=0 ds_1302_clk=1;  ds_1302_dat=0 

    PTGDD_PTGDD0=1;  //SCLK对应的IO设置为输出状态

    ds_1302_clk=0;     //SCLK=0

    ds_1302_rst=0;     //RST=0

    delay(10);

    ds_1302_clk=1;    //SCLK=1

}

/*******************************************

函数名称:Write1Byte

功    能:对DS1302写入1个字节的数据

参    数:wdata--写入的数据

返回值  :无

********************************************/

void Write1Byte(uchar wdata) 

{ 

    uchar i;



    PTGDD_PTGDD2=1;     //SDA对应的IO设置为输出状态

    ds_1302_rst=1;        //REST=1;



    for(i = 8; i> 0; i--) 

    {

        if(wdata&0x01)  ds_1302_dat=1;

        else            ds_1302_dat=0;

        ds_1302_clk=0;

        delay(10); 

        ds_1302_clk=1;

        delay(10); 

        wdata>>= 1; 

    } 

}

/*******************************************

函数名称:Read1Byte

功    能:从DS1302读出1个字节的数据

参    数:无

返回值  :读出的一个字节数据

********************************************/

uchar Read1Byte(void) 

{ 

    uchar i;

    uchar rdata = 0X00;



    PTGDD_PTGDD2=0;  //SDA对应的IO设置为输入状态

    ds_1302_rst=1;    //REST=1;



    for(i = 8; i> 0; i--)

    {

        ds_1302_clk=1;

        delay(10);

        ds_1302_clk=0;

        delay(10);

        rdata>>= 1;

        if(ds_1302_dat&0x01)  rdata |= 0x80;

    } 

    

    return(rdata); 

}

/*******************************************

函数名称:W_Data

功    能:向某个寄存器写入一个字节数据

参    数:addr--寄存器地址

          wdata--写入的数据

返回值  :无

********************************************/

void W_Data(uchar addr, uchar wdata)

{

    ds_1302_rst=0; 

    ds_1302_clk=0;   

    asm nop;

    ds_1302_rst=1;

    Write1Byte(addr);   //写入地址

    Write1Byte(wdata);  //写入数据

    ds_1302_clk=1;

    ds_1302_rst=0;

} 

/*******************************************

函数名称:R_Data

功    能:从某个寄存器读出一个字节数据

参    数:addr--寄存器地址

返回值  :读出的数据

********************************************/

uchar R_Data(uchar addr)

{

    uchar rdata;

    

    ds_1302_rst=0; 

    ds_1302_clk=0; 

    asm nop;

    ds_1302_rst=1;

    Write1Byte(addr);    //写入地址

    rdata = Read1Byte();  //读出数据 

    ds_1302_clk=1;

    ds_1302_rst=0;;

    

    return(rdata);

}

/*******************************************

函数名称:BurstWrite1302

功    能:以burst方式向DS1302写入批量时间数据

参    数:ptr--指向时间数据存放地址的指针

返回值  :读出的数据

说    明:时间数据的存放格式是:

          秒,分,时,日,月,星期,年,控制

            【7个数据(BCD格式)+1个控制】

********************************************/

void BurstWrite1302(uchar *ptr)

{

    uchar i;

    

    W_Data(0x8e,0x00);      //允许写入     

    ds_1302_rst=0; 

    ds_1302_clk=0;  

    asm nop;

    ds_1302_rst=1;

    Write1Byte(0xbe);       // 0xbe:时钟多字节写入命令 

    for (i = 8; i> 0; i--) 

    {

        Write1Byte(*ptr++); 

    }

    ds_1302_clk=1;

    ds_1302_rst=0;

    W_Data(0x8e,0x80);      // 禁止写入

} 

/*******************************************

函数名称:BurstRead1302

功    能:以burst方式从DS1302读出批量时间数据

参    数:ptr--指向存放时间数据地址的指针

返回值  :无

说    明:时间数据的存放格式是:

          秒,分,时,日,月,星期,年,控制

            【7个数据(BCD格式)+1个控制】

********************************************/

void BurstRead1302(uchar *ptr)

{

    uchar i;

  

    ds_1302_rst=0; 

    ds_1302_clk=0; 

    asm nop;

    ds_1302_rst=1;

    Write1Byte(0xbf);             //0xbf:时钟多字节读命令

    for (i = 8; i> 0; i--) 

    {

       *ptr++ = Read1Byte(); 

    }

    ds_1302_clk=1;

    ds_1302_rst=0;;

}

/*******************************************

函数名称:BurstWriteRAM

功    能:以burst方式向DS1302的RAM中写入批量数据

参    数:ptr--指向存放数据地址的指针

返回值  :无

说明    :共写入31个字节的数据

********************************************/

void BurstWriteRAM(uchar *ptr)

{

    uchar i;

    

    W_Data(0x8e,0x00);         //允许写入

    ds_1302_rst=0; 

    ds_1302_clk=0; 

    asm nop;

    ds_1302_rst=1;

    Write1Byte(0xfe);          //0xfe:RAM多字节写命令 

    for (i = 31; i>0; i--)     //RAM共有31个字节

    {

        Write1Byte(*ptr++); 

    }

    ds_1302_clk=1;

    ds_1302_rst=0; 

    W_Data(0x8e,0x80);          //禁止写入

} 

/*******************************************

函数名称:BurstReadRAM

功    能:以burst方式从DS1302的RAM中读出批量数据

参    数:ptr--指向数据存放地址的指针

返回值  :无

说明    :共读出31个字节的数据

********************************************/

void BurstReadRAM(uchar *ptr)

{

    uchar i;

  

    ds_1302_rst=0; 

    ds_1302_clk=0;; 

    asm nop;

    ds_1302_rst=1;

    Write1Byte(0xff);             //0xff:RAM的多字节读命令 

    for (i = 31; i> 0; i--) 

    {

       *ptr++ = Read1Byte();   

    }

    ds_1302_clk=1;

    ds_1302_rst=0; 

}

/*******************************************

函数名称:Set_DS1302

功    能:设置DS1302内部的时间

参    数:ptr--指向存放数据地址的指针

返回值  :无

说明    :写入数据的格式:

            秒 分 时 日 月 星期 年  【共7个字节】

********************************************/

void Set_DS1302(uchar *ptr) 

{

    uchar i;

    uchar addr = 0x80; 

    

    W_Data(0x8e,0x00);    //允许写入

    

    for(i = 7;i> 0;i--)

    { 

        W_Data(addr,*ptr++); 

        addr += 2;

    }

    W_Data(0x8e,0x80);      //禁止

}



/*******************************************

函数名称:Get_DS1302

功    能:读取DS1302内部的时间

参    数:ptr--指向数据存放地址的指针

返回值  :无

说明    :读出数据的格式:

            秒 分 时 日 月 星期 年  【共7个字节】

********************************************/

void Get_DS1302(uchar *ptr) 

{

    uchar i;

    uchar addr = 0x81;

    

    for(i = 0;i < 7;i++)

    {

        ptr = R_Data(addr);

        addr += 2;

    }

     

} 



//=============================

//函数名:void TPM1Init(void)

//作用:初始化TPM

//=============================

void TPM1Init(void)

{

        TPM1SC=0x48;//TPM时钟源为总线时钟,分频系数=1;使能定时器溢出中断

        TPM1MOD=0X2710;  //模寄存器 10000*0.2



        TPM1CNTH=0;//任意时刻对TPM1CNTH或TPM1CNTL的写操作将计数寄存器的计数值复位(清零)

}

//============================

// void PeripheralInit(void)

//

//=============================

void PeripheralInit(void) 

{

  SysInit();

  IO_PortsInit();

  Init_ADC();

  Init_display();

  Init_KBI();

  TPM1Init();

}



//*************************************//

//显示转换子程序

//*************************************//

void smdsc1(word iStakeoutValue) 

{

  if(iStakeoutValue<1000) 

  {

    cInteger=iStakeoutValue/100;                                                        //求百位数

          iResidue=iStakeoutValue%100;

          if(cInteger==0)

                    cDisplayNumHex[2]=0x00;                                //百位数为零,不显示

          else

                    cDisplayNumHex[2]=cHex[cInteger];        //百位数不为零,显示其数值

////////显示十位数

          cInteger=iResidue/10;                                                        //求十位数

          iResidue=iResidue%10;

          if((cInteger==0)&&(cDisplayNumHex[2]==0x00))

              cDisplayNumHex[3]=0x00;

          else 

              cDisplayNumHex[3]=cHex[cInteger];

///////显示个位数

    cDisplayNumHex[4]=cHex[iResidue];                //显示个位数值

  }

}

//*************************************//

//AD转换

//*************************************//

void sadcn(void) 

{

    ADC1SC1=0x00;

    while(!ADC1SC1_COCO);//单次转换需加此句

          Rlcix++;

          Rlcia=Rlcia+Ia;  

          if(Rlcix>63) 

          {

            Rlcix=0;

            Rcia = Rlcia>>6;

            Rcia=Rcia*54;

            Rcia=Rcia>>8;

            Rlcia=0;

    }

}



//*****************************************************************//

//                               Flash 擦程序

//*****************************************************************//

void Flashca(void) 

{   

  byte i,flag0,flag1;

  unsigned char *P_d;   //注意:这里int如改为char则变量也能接受(unsinged int*)(0xXXXX)的赋值,但观察不到地址值,用int:可以观察到地址值*/    

  FCDIV = 0x13; 

  RAMCodeInit();

  P_d=( unsigned char *)(0xc000);

  flag0=ErasePage(P_d);

  for(i=0;i<6;i++)

  {

    P_d++;

    flag1=PGMByte(iFnumber,P_d);

  }

}



//*************************************************************//

//                Flash读数据

//************************************************************//

void Flashdu(void) 

{

 byte *a;

 byte b; 

 a=(byte *)0xc000;

 for(b=0;b<6;b++) 

 {

  a++;

  iFnumber=*a;

 }

}



/*************************************************************************************************

进制转换

************************************************************************************************/

unsigned char BcdToBin(unsigned char val) 

{ 

val = (val>> 4) * 10 + (val & 0x0f);        //将BCD码转换为10进制数 

return val;                                 //返回10进制数 

} 



unsigned char BinToBcd(unsigned char val)  //十进制转换为BCD

{ 

return((val/10)*16+val%10); 

}









/**************************************************************/

/*                                                增加按键                                                  */

/**************************************************************/

void KeyBoard2(void)

{

  if(frun) 

  {

    

  }

  else

  {

    myFlag.Fdaca=1;    //数据更改标志

    switch(KSSIX) 

    {

      case 0:                       //

        if(iFnumber[0]<Fmax[0])

        iFnumber[0]++;

        else

        iFnumber[0]=Fmin[0];

        break;

      case 1:                       //

        if(iFnumber[1]<Fmax[1])

        iFnumber[1]++;

        else

        iFnumber[1]=Fmin[1];

        break;

      case 2:

          if(iFnumber[2]<Fmax[2]) 

          iFnumber[2]++;

          else

          iFnumber[2]=Fmin[2];

        break;

      case 3:

        if(iFnumber[3]<Fmax[3]) 

        iFnumber[3]++;

        else

        iFnumber[3]=Fmin[3];

        break;

      case 4:

          if(iFnumber[4]<Fmax[4]) 

          iFnumber[4]++;

          else

          iFnumber[4]=Fmin[4];

        break;

      case 5:

        if(iFnumber[5]<Fmax[5]) 

        iFnumber[5]++;

        else

        iFnumber[5]=Fmin[5];

        break;

      default:

        break;

    } 

  Curtime[1]=BinToBcd(iFnumber[0]);

  Curtime[2]=BinToBcd(iFnumber[1]);

  Set_DS1302(Curtime);

  } 

   

}

//



/**************************************************************/

/*                                                        减少按键                                          */

/**************************************************************/

void KeyBoard3(void)

{

  if(frun) 

  {

    

  }

  else

  {

    myFlag.Fdaca=1;    //数据更改标志

   

    switch(KSSIX) 

    {

      case 0:

          if(iFnumber[0]>Fmin[0]) 

          iFnumber[0]--;

          else

          iFnumber[0]=Fmax[0];

        break;

      case 1:

        if(iFnumber[1]>Fmin[1]) 

        iFnumber[1]--;

        else

        iFnumber[1]=Fmax[1];

        break;

      case 2:

          if(iFnumber[2]>Fmin[2]) 

          iFnumber[2]--;

          else

          iFnumber[2]=Fmax[2];

        break;

      case 3:

        if(iFnumber[3]>Fmin[3]) 

        iFnumber[3]--;

        else

        iFnumber[3]=Fmax[3];

        break;

      case 4:

          if(iFnumber[4]>Fmin[4]) 

          iFnumber[4]--;

          else

          iFnumber[4]=Fmax[4];

        break;

      case 5:

        if(iFnumber[5]>Fmin[5]) 

        iFnumber[5]--;

        else

        iFnumber[5]=Fmax[5];

        break;

      default:

        break;

    }  

  Curtime[1]=BinToBcd(iFnumber[0]);

  Curtime[2]=BinToBcd(iFnumber[1]);

  Set_DS1302(Curtime);

  }

  

 

}

/**************************************************************/

/*                                                功能按键                                          */

/**************************************************************/

void KeyBoard4(void)

{ 

   // PTFD_PTFD0=0;

    frun=0;

    

    KSSIX++;

    if(KSSIX>6) 

    KSSIX=0;  

}



/**************************************************************/

/*                                                复位按键                                          */

/**************************************************************/

void KeyBoard1(void)

{   



   frun=1; 

//   PTFD_PTFD0=1;  

//  KSSIX++;

//  myFlag.Frun=1;

 //  

 

   // unsigned char i;

 //  KSSIX=0;

 //  myFlag.Frun=0;

   

}



void shaokey(void) 

{     

      if((PTDD_PTDD0==1)&&(PTAD_PTAD0==1)&&(PTFD_PTFD4==1)&&(PTDD_PTDD1==1))                //////本次键盘扫描为空

                        {

                                bScanEmpty=1;                        //设定本次扫描为空标志位

                                cScanNum=0;                                //清除扫描计数值,从新开始计数

                        }

                        else                                //////本次键盘扫描不为空

                        {

                                bScanEmpty=0;                        //设定本次扫描不为空标志位

                //                iStakeout=0;                        //清监视计数值

                        }

              if(PTFD_PTFD4==0)                                //复位键盘按下

                                        cScanKey+=1;

                                else if(PTAD_PTAD0==0)                //增加键盘按下

                                        cScanKey+=2;

                                else if(PTDD_PTDD0==0)                //减少键盘按下

                                        cScanKey+=4;

                                else if(PTDD_PTDD1==0)                //功能键盘按下

                                        cScanKey+=8;

                        switch(cScanKey)        //////判断哪个键按下,并作相应的处理

                        {

                                case 1:                                //复位键盘按下

                                        KeyBoard1();

                                        break;

                                case 2:                                //增加键盘按下

                                        KeyBoard2();

                                        break;

                                case 4:                                //减少键盘按下

                                        KeyBoard3();

                                        break;

                                case 8:                                //功能键盘按下

                                  KeyBoard4();

                                        break;

                                default:                      &

出0入0汤圆

发表于 2008-11-15 10:13:46 | 显示全部楼层
就顯示個時鐘還要這麽复雜嗎,而且是數碼管哦,暈乎了~~~~~~~~~值得欽佩~~~~~~~~~~學習~~~~~~~~~~~~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 08:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表