单片机/MCU论坛
直播中

chenshengas

12年用户 85经验值
擅长:可编程逻辑 模拟技术 EDA/IC设计 控制/MCU
私信 关注
[问答]

程序错误,求解

本帖最后由 chenshengas 于 2012-3-28 10:28 编辑

程序出现了以下错误,怎么改   错误的地方我用红色标注了
BISHE.C(510): warning C214: 'Argument': conversion: pointer to non-pointer
BISHE.C(511): warning C214: 'Argument': conversion: pointer to non-pointer
BISHE.C(512): warning C214: 'Argument': conversion: pointer to non-pointer
BISHE.C(513): warning C214: 'Argument': conversion: pointer to non-pointer
BISHE.C(514): error C267: 'delay': requires ANSI-style prototype
bishe.c - 1 Error(s), 4 Warning(s).
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define Dis_X_MAX        128-1
#define Dis_Y_MAX        64-1
***it SPI_CS = P0^0;                //定义CS接在P0.0端口
***it SPI_SDA = P0^1;            //定义SDA接在P0.1端口
***it SPI_SCK = P0^2;            //定义SCK接在P0.2端口
***it SPI_RES = P0^3;            //定义RESET接P0.3端口
***it  DS1302_CLK = P1^1;              //实时时钟时钟线引脚
***it  DS1302_IO  = P1^0;              //实时时钟数据线引脚
***it  DS1302_RST = P1^2;
***it Set = P2^0;       //模式切换键
***it Up = P2^1;        //加法按钮
***it Down = P2^2;      //减法按钮
***it out = P2^3;       //立刻跳出调整模式按钮
***it DQ = P3^7;              //实时时钟复位线引脚
***it  ACC0 = ACC^0;
***it  ACC7 = ACC^7;
unsigned char X_Witch=6;
unsigned char Y_Witch=10;
unsigned char X_Witch_cn=16;
unsigned char Y_Witch_cn=16;
unsigned char Dis_Zero=0;
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,时到日,月,年位闪的计数
        //温度传送数据IO口
char done,count,temp,flag,up_flag,down_flag;
uchar temp_value;      //温度值
uchar TempBuffer[5],week_value[2];
//========================================================================
// 函数: void LCD_Init(void)
// 描述: LCD初始化程序,主要在里面完成端口初始化以及LCD模块的复位
// 参数: 无
// 返回: 无
// 备注:
// 版本:
//      2009/02/10      First version    Mz Design
//========================================================================
void timeDelay(unsigned int Timers)
{
    unsigned int i;
    while(Timers)
    {
        Timers--;
        for(i=0;i<100;i++) ;
    }
}
void LCD_Init(void)
{
    //SS和SCK预先设置为高电平
    SPI_SCK = 1;
    SPI_CS = 1;
   
    //复位LCD模块
    SPI_RES = 0;
    TimeDelay(50);            
    //保持低电平大概2ms左右
    SPI_RES = 1;
    TimeDelay(80);                        //延时大概10ms左右
}
//========================================================================
// 函数: void SPI_SSSet(unsigned char Status)
// 描述: 置SS线状态
// 参数: Status   =1则置高电平,=0则置低电平  
// 返回: 无
// 版本:
//      2009/02/10      First version    Mz Design
//========================================================================
void SPI_SSSet(unsigned char Status)
{
    if(Status)                //判断是要置SS为低还是高电平?//SS置高电平
        SPI_CS = 1;
    else   //SS置低电平
        SPI_CS = 0;
}
//========================================================================
// 函数: void SPI_Send(unsigned char Data)
// 描述: 通过串行SPI口输送一个byte的数据置模组
// 参数: Data 要传送的数据
// 返回: 无
// 版本:
//      2007/07/17      First version
//        2007/07/24        V1.2 for MCS51 Keil C
//========================================================================
void SPI_Send(unsigned char Data)
{
    unsigned char i=0;
    for(i=0;i<8;i++)
    {
        //SCK置低
        SPI_SCK = 0;
        if(Data&0x0080)
            SPI_SDA = 1;            
        else SPI_SDA = 0;//
        //SCK上升沿触发串行数据采样
        SPI_SCK = 1;
        Data = Data<<1;                            //数据左移一位
    }
}
//========================================================================
// 函数: void FontSet(unsigned char Font_NUM,unsigned char Color)
// 描述: ASCII字符字体设置
// 参数: Font_NUM 字体选择,以驱动所带的字库为准
//         Color  文本颜色,仅作用于ASCII字库  
// 返回: 无
// 备注:
// 版本:
//      2007/07/19      First version
//========================================================================
void FontSet(unsigned char Font_NUM,unsigned char Color)
{
    unsigned char ucTemp=0;
    if(Font_NUM==0)
    {
        X_Witch = 6;//7;
        Y_Witch = 10;
    }
    else
    {
        X_Witch = 8;
        Y_Witch = 16;
    }
    ucTemp = (Font_NUM<<4)|Color;
    //设置ASCII字符的字型
    SPI_SSSet(0);                    //SS置低电平            
    SPI_Send(0x81);                    //传送指令0x81
    SPI_Send(ucTemp);                //选择8X16的ASCII字体,字符色为黑色
    SPI_SSSet(1);                    //完成操作置SS高电平   
}
//========================================================================
// 函数: void FontMode(unsigned char Cover,unsigned char Color)
// 描述: 设置字符显示覆盖模式
// 参数: Cover  字符覆盖模式设置,0或1
//         Color 覆盖模式为1时字符显示时的背景覆盖色
// 返回: 无
// 备注:
// 版本:
//      2008/11/27      First version
//========================================================================
void FontMode(unsigned char Cover,unsigned char Color)
{
    unsigned char ucTemp=0;
    ucTemp = (Cover<<4)|Color;
    //设置ASCII字符的字型
    SPI_SSSet(0);                    //SS置低电平            
    SPI_Send(0x89);                    //传送指令0x81
    SPI_Send(ucTemp);                //选择8X16的ASCII字体,字符色为黑色
    SPI_SSSet(1);                    //完成操作置SS高电平   
}
//========================================================================
// 函数: void FontSet_cn(unsigned char Font_NUM,unsigned char Color)
// 描述: 汉字库字符字体设置
// 参数: Font_NUM 字体选择,以驱动所带的字库为准
//         Color  文本颜色,仅作用于汉字库  
// 返回: 无
// 备注:
// 版本:
//      2007/07/19      First version
//========================================================================
void FontSet_cn(unsigned char Font_NUM,unsigned char Color)
{
    unsigned char ucTemp=0;
    if(Font_NUM==0)
    {
        X_Witch_cn = 12;
        Y_Witch_cn = 12;
    }
    else
    {
        X_Witch_cn = 16;
        Y_Witch_cn = 16;
    }
    ucTemp = (Font_NUM<<4)|Color;
    //设置ASCII字符的字型
    SPI_SSSet(0);                    //SS置低电平            
    SPI_Send(0x82);                    //传送指令0x81
    SPI_Send(ucTemp);                //选择8X16的ASCII字体,字符色为黑色
    SPI_SSSet(1);                    //完成操作置SS高电平   
}
//========================================================================
// 函数: void PutChar(unsigned char x,unsigned char y,unsigned char a)
// 描述: 写入一个标准ASCII字符
// 参数: x  X轴坐标     y  Y轴坐标
//         a  要显示的字符在字库中的偏移量  
// 返回: 无
// 备注: ASCII字符可直接输入ASCII码即可
// 版本:
//      2007/07/19      First version
//========================================================================
void PutChar(unsigned char x,unsigned char y,unsigned char a)
{
    //显示ASCII字符
    SPI_SSSet(0);                    //SS置低电平   
    SPI_Send(7);                    //传送指令0x07
    SPI_Send(x);                    //要显示字符的左上角的X轴位置
    SPI_Send(y);                    //要显示字符的左上角的Y轴位置
    SPI_Send(a);                    //要显示字符ASCII字符的ASCII码值
    SPI_SSSet(1);                    //完成操作置SS高电平
}
//========================================================================
// 函数: void PutString(int x,int y,char *p)
// 描述: 在x、y为起始坐标处写入一串标准ASCII字符
// 参数: x  X轴坐标     y  Y轴坐标
//         p  要显示的字符串  
// 返回: 无
// 备注: 仅能用于自带的ASCII字符串显示
// 版本:
//      2007/07/19      First version
//========================================================================
void PutString(unsigned char x,unsigned char y,unsigned char *p)
{
    while(*p!=0)
    {
        PutChar(x,y,*p);
        x += X_Witch;
        if((x + X_Witch) > Dis_X_MAX)
        {
            x = Dis_Zero;
            if((Dis_Y_MAX - y) < Y_Witch) break;
            else y += Y_Witch;
        }
        p++;
    }
}
//========================================================================
// 函数: void PutChar_cn(unsigned char x,unsigned char y,unsigned short * GB)
// 描述: 写入一个二级汉字库汉字
// 参数: x  X轴坐标     y  Y轴坐标
//         a  GB码  
// 返回: 无
// 备注:
// 版本:
//      2007/07/19      First version
//        2007/07/24        V1.2 for MCS51 Keil C
//========================================================================
void PutChar_cn(unsigned char x,unsigned char y,unsigned char * GB)
{
    //显示ASCII字符
    SPI_SSSet(0);                    //SS置低电平   
    SPI_Send(8);                    //传送指令0x08
    SPI_Send(x);                    //要显示字符的左上角的X轴位置
    SPI_Send(y);                    //要显示字符的左上角的Y轴位置
   
    SPI_Send(*(GB++));    //传送二级字库中汉字GB码的高八位值
    SPI_Send(*GB);        //传送二级字库中汉字GB码的低八位值
    SPI_SSSet(1);                    //完成操作置SS高电平
}
//========================================================================
// 函数: void PutString_cn(unsigned char x,unsigned char y,unsigned short *p)
// 描述: 在x、y为起始坐标处写入一串汉字字符
// 参数: x  X轴坐标     y  Y轴坐标
//         p  要显示的字符串  
// 返回: 无
// 备注: 同PutChar_cn中的解释
// 版本:
//      2007/07/19      First version
//        2007/07/24        V1.2 for MCS51 Keil C
//========================================================================
void PutString_cn(unsigned char x,unsigned char y,unsigned char *p)
{
    while(*p!=0)
    {
        if(*p<128)
        {
            PutChar(x,y,*p);
            x += X_Witch+1;
        if((x/* + X_Witch*/) > Dis_X_MAX)
        {
            x = Dis_Zero;
            if((Dis_Y_MAX - y) < Y_Witch) break;
            else y += Y_Witch_cn;
        }
        p+=1;
        }
        else
        {
        PutChar_cn(x,y,p);
        x += X_Witch_cn+1;
        if((x/* + X_Witch_cn*/) > Dis_X_MAX)
        {
            x = Dis_Zero;
            if((Dis_Y_MAX - y) < Y_Witch_cn) break;
            else y += Y_Witch_cn;
        }
        p+=2;
        }
    }
}
//========================================================================
// 函数: void ShowChar(unsigned char x,unsigned char y,unsigned char Num,unsigned char type)
// 描述: 在x、y的位置为显示区域的左上角,显示一个unsigned char型数
// 参数: x  X轴坐标     y  Y轴坐标    Num  要显示的8位宽度的数据  type  显示特性(0,1,2)
// 返回: 无
// 备注:
// 版本:
//      2008/11/27      First version
//========================================================================
void ShowChar(unsigned char x,unsigned char y,unsigned char a,unsigned char type)
{
    //显示ASCII字符
    SPI_SSSet(0);                    //SS置低电平   
    SPI_Send(11);                    //传送指令0x0B
    SPI_Send(x);                    //要显示字符的左上角的X轴位置
    SPI_Send(y);                    //要显示字符的左上角的Y轴位置
    SPI_Send(a);                    //要显示的数据
    SPI_Send(type);
    SPI_SSSet(1);                    //完成操作置SS高电平
}
//========================================================================
// 函数: void ShowShort(unsigned char x,unsigned char y,unsigned short Num,unsigned char type)
// 描述: 在x、y的位置为显示区域的左上角,显示一个unsigned short型数(16位宽度)
// 参数: x  X轴坐标     y  Y轴坐标    Num  要显示的16位宽度的数据  type  显示特性(0,1,2)
// 返回: 无
// 备注:
// 版本:
//      2008/11/27      First version
//========================================================================
void ShowShort(unsigned char x,unsigned char y,unsigned short a,unsigned char type)
{
    //显示ASCII字符
    SPI_SSSet(0);                    //SS置低电平   
    SPI_Send(12);                    //传送指令0x0C
    SPI_Send(x);                    //要显示字符的左上角的X轴位置
    SPI_Send(y);                    //要显示字符的左上角的Y轴位置
    SPI_Send((unsigned char)(a>>8));
    SPI_Send((unsigned char)a);
    SPI_Send(type);                    //要显示字符ASCII字符的ASCII码值
    SPI_SSSet(1);                    //完成操作置SS高电平
}
//========================================================================
// 函数: void SetBackLight(unsigned char Deg)
// 描述: 设置背光亮度等级
// 参数: Grade  0~127的等级
// 返回: 无
// 备注:
// 版本:
//      2008/11/27      First version
//========================================================================
void SetBackLight(unsigned char Deg)
{
    //显示ASCII字符
    SPI_SSSet(0);                    //SS置低电平   
    SPI_Send(0x8a);                    //传送指令0x07
    SPI_Send(Deg);                    //要显示字符的左上角的X轴位置
    SPI_SSSet(1);                    //完成操作置SS高电平
}

//=====================================================================
// 函数: void SetLCDGra(unsigned char Dat)
// 描述: LCD整屏显示灰度调节
// 参数:  Dat   要调成的灰度值,0~0x3f
//         
// 返回: 无
// 备注: 调节后的灰度将会保持到下一将从 LCD复位之前,或者下一次重新调整灰度之前
// 版本:
//      2010/02/10      First version
//=====================================================================
void SetLCDGra(unsigned char Dat)
{
    //显示ASCII字符
    SPI_SSSet(0);                    //SS置低电平   
    SPI_Send(0x8c);                    //传送指令0x8a
    SPI_Send(Dat);                    //传送数值
    SPI_SSSet(1);                    //完成操作置SS高电平
}
/***********DS1302时钟部分子程序******************/
typedef struct __SYSTEMTIME__
{
    unsigned char Second;
    unsigned char Minute;
    unsigned char Hour;
    unsigned char Week;
    unsigned char Day;
    unsigned char Month;
    unsigned char  Year;
    unsigned char DateString[11];
    unsigned char TimeString[9];
}SYSTEMTIME;    //定义的时间类型
SYSTEMTIME CurrentTime;


#define AM(X)    X
#define PM(X)    (X+12)                  // 转成24小时制
#define DS1302_SECOND    0x80          //时钟芯片的寄存器位置,存放时间
#define DS1302_MINUTE    0x82
#define DS1302_HOUR        0x84
#define DS1302_WEEK        0x8A
#define DS1302_DAY        0x86
#define DS1302_MONTH    0x88
#define DS1302_YEAR        0x8C
/***********ds18b20子程序*************************/

/***********ds18b20延迟子函数(晶振12MHz )*******/

void delay_18B20(unsigned int i)
{
    while(i--);
}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)
{
     unsigned char x=0;
     DQ = 1;          //DQ复位
     delay_18B20(8);  //稍做延时
     DQ = 0;          //单片机将DQ拉低
     delay_18B20(80); //精确延时 大于 480us
     DQ = 1;          //拉高总线
     delay_18B20(14);
     x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
     delay_18B20(20);
}

/***********ds18b20读一个字节**************/  

unsigned char ReadOneChar(void)
{
    uchar i=0;
    uchar dat = 0;
    for (i=8;i>0;i--)
     {
          DQ = 0; // 给脉冲信号
          dat>>=1;
          DQ = 1; // 给脉冲信号
          if(DQ)
          dat|=0x80;
          delay_18B20(4);
     }
     return(dat);
}

/*************ds18b20写一个字节****************/  

void WriteOneChar(uchar dat)
{
     unsigned char i=0;
     for (i=8; i>0; i--)
     {
          DQ = 0;
         DQ = dat&0x01;
        delay_18B20(5);
         DQ = 1;
        dat>>=1;
}
}

/**************读取ds18b20当前温度************/

void ReadTemp(void)
{
    unsigned char a=0;
    unsigned char b=0;
    unsigned char t=0;

    Init_DS18B20();
    WriteOneChar(0xCC);        // 跳过读序号列号的操作
    WriteOneChar(0x44);     // 启动温度转换

    delay_18B20(100);       // this message is very important

    Init_DS18B20();
    WriteOneChar(0xCC);     //跳过读序号列号的操作
    WriteOneChar(0xBE);     //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

    delay_18B20(100);

    a=ReadOneChar();        //读取温度值低位
    b=ReadOneChar();           //读取温度值高位
    temp_value=b<<4;
    temp_value+=(a&0xf0)>>4;               
}
void temp_to_str()   //温度数据转换成液晶字符显示
{
  TempBuffer[0]=temp_value/10+'0';  //十位
  TempBuffer[1]=temp_value%10+'0';  //个位
  TempBuffer[2]=0xdf;   //温度符号
  TempBuffer[3]='C';
  TempBuffer[4]='';
}
void Delay(uint count)
{
    uint i,j;
    for(i=0;i     for(j=0;j<120;j++);
}

/*延时子程序*/
void mdelay(uint delay)
{    uint i;
     for(;delay>0;delay--)
           {for(i=0;i<62;i++) //1ms延时.
               {;}
           }
}
void DS1302_GetTime(SYSTEMTIME *Time);
void DateToStr(SYSTEMTIME *Time);
void TimeToStr(SYSTEMTIME *Time);
void ReadTemp(void);
void temp_to_str();
void delay();  
void show_time()   //液晶显示程序
{
  DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据
  TimeToStr(&CurrentTime);       //时间数据转换液晶字符
  DateToStr(&CurrentTime);       //日期数据转换液晶字符
  ReadTemp();                    //开启温度采集程序
  temp_to_str();                 //温度数据转换成液晶字符
  ShowChar(12,1,TempBuffer,1);      //液晶字符显示位置     510
  ShowChar(0,1,CurrentTime.TimeString,1);     //显示时间    511
  ShowChar(0,0,CurrentTime.DateString,1);  //显示日期       512
  ShowChar(15,0,week_value,1);            //显示星期              513
  delay (400);                     //扫描延时                                   514
}

void DS1302InputByte(unsigned char d)     //实时时钟写入一字节(内部函数)
{
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;               //相当于汇编中的 RRC
        DS1302_CLK = 1;
        DS1302_CLK = 0;
        ACC = ACC >> 1;
    }
}

unsigned char DS1302OutputByte(void)     //实时时钟读取一字节(内部函数)
{
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;                     //相当于汇编中的 RRC
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    }
    return(ACC);
}

void Write1302(unsigned char ucAddr, unsigned char ucDa)    //ucAddr: DS1302地址, ucData: 要写的数据
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr);           // 地址,命令
    DS1302InputByte(ucDa);           // 写1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

unsigned char Read1302(unsigned char ucAddr)    //读取DS1302某地址的数据
{
    unsigned char ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址,命令
    ucData = DS1302OutputByte();         // 读1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}



void DS1302_GetTime(SYSTEMTIME *Time)  //获取时钟芯片的时钟数据到自定义的结构型数组
{
    unsigned char ReadValue;
    ReadValue = Read1302(DS1302_SECOND);
    Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    ReadValue = Read1302(DS1302_MINUTE);
    Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    ReadValue = Read1302(DS1302_HOUR);
    Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    ReadValue = Read1302(DS1302_DAY);
    Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);   
    ReadValue = Read1302(DS1302_WEEK);
    Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    ReadValue = Read1302(DS1302_MONTH);
    Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
    ReadValue = Read1302(DS1302_YEAR);
    Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);   
}

void DateToStr(SYSTEMTIME *Time)    //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{   if(hide_year<2)                 //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
    {                              
      Time->DateString[0] = '2';
      Time->DateString[1] = '0';     
      Time->DateString[2] = Time->Year/10 + '0';
      Time->DateString[3] = Time->Year%10 + '0';
    }
      else
        {
          Time->DateString[0] = ' ';
          Time->DateString[1] = ' ';         
          Time->DateString[2] = ' ';
          Time->DateString[3] = ' ';
        }
    Time->DateString[4] = '/';
    if(hide_month<2)
    {
      Time->DateString[5] = Time->Month/10 + '0';
      Time->DateString[6] = Time->Month%10 + '0';
    }
      else
      {
        Time->DateString[5] = ' ';
        Time->DateString[6] = ' ';
      }
    Time->DateString[7] = '/';
    if(hide_day<2)
    {
      Time->DateString[8] = Time->Day/10 + '0';
      Time->DateString[9] = Time->Day%10 + '0';
    }
      else
      {
        Time->DateString[8] = ' ';
        Time->DateString[9] = ' ';        
      }
    if(hide_week<2)
    {
      week_value[0] = Time->Week%10 + '0';  //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
    }
      else
      {
        week_value[0] = ' ';
      }
      week_value[1] = '';

    Time->DateString[10] = ''; //字符串末尾加 '' ,判断结束字符
}

void TimeToStr(SYSTEMTIME *Time)  //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
{   if(hide_hour<2)
    {
      Time->TimeString[0] = Time->Hour/10 + '0';
      Time->TimeString[1] = Time->Hour%10 + '0';
    }
      else
        {
          Time->TimeString[0] = ' ';
          Time->TimeString[1] = ' ';
        }
    Time->TimeString[2] = ':';
    if(hide_min<2)
    {
      Time->TimeString[3] = Time->Minute/10 + '0';
      Time->TimeString[4] = Time->Minute%10 + '0';
    }
      else
        {
          Time->TimeString[3] = ' ';
          Time->TimeString[4] = ' ';
           }
    Time->TimeString[5] = ':';
    if(hide_sec<2)
    {
      Time->TimeString[6] = Time->Second/10 + '0';
      Time->TimeString[7] = Time->Second%10 + '0';
    }
      else
       {
         Time->TimeString[6] = ' ';
         Time->TimeString[7] = ' ';
       }
    Time->DateString[8] = '';
}


void Initial_DS1302(void)   //时钟芯片初始化
{   
    unsigned char Second=Read1302(DS1302_SECOND);
    if(Second&0x80)          //判断时钟芯片是否关闭      
    {
    Write1302(0x8e,0x00); //写入允许
    Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
    Write1302(0x88,0x07);
    Write1302(0x86,0x25);
    Write1302(0x8a,0x07);
    Write1302(0x84,0x23);
    Write1302(0x82,0x59);
    Write1302(0x80,0x55);
    Write1302(0x8e,0x80); //禁止写入
    }

}




void outkey()                    //跳出调整模式,返回默认显示
{ uchar Second;
  if(out==0)         
  { mdelay(8);
    count=0;
    hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
    Second=Read1302(DS1302_SECOND);
    Write1302(0x8e,0x00); //写入允许
    Write1302(0x80,Second&0x7f);
    Write1302(0x8E,0x80);          //禁止写入
    done=0;           
    while(out==0);
  }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Upkey()//升序按键
{      
        Up=1;
        if(Up==0)
                  {
                   mdelay(8);
                       switch(count)
                          {case 1:
                                  temp=Read1302(DS1302_SECOND);  //读取秒数
                                  temp=temp+1;  //秒数加1
                                  up_flag=1;    //数据调整后更新标志
                                  if((temp&0x7f)>0x59)   //超过59秒,清零
                                  temp=0;                                 
                                  break;
                           case 2:
                                  temp=Read1302(DS1302_MINUTE);  //读取分数
                                  temp=temp+1;  //分数加1
                                  up_flag=1;
                                  if(temp>0x59)          //超过59分,清零
                                  temp=0;
                                  break;
                           case 3:
                                  temp=Read1302(DS1302_HOUR);  //读取小时数
                                  temp=temp+1;  //小时数加1
                                  up_flag=1;
                                  if(temp>0x23)   //超过23小时,清零
                                  temp=0;
                                  break;
                           case 4:
                                  temp=Read1302(DS1302_WEEK);  //读取星期数
                                  temp=temp+1;  //星期数加1
                                  up_flag=1;
                                  if(temp>0x7)  
                                  temp=1;
                                  break;
                           case 5:
                                  temp=Read1302(DS1302_DAY);  //读取日数
                                  temp=temp+1;  //日数加1
                                  up_flag=1;
                                  if(temp>0x31)
                                  temp=1;
                                  break;
                           case 6:
                                  temp=Read1302(DS1302_MONTH);  //读取月数
                                  temp=temp+1;  //月数加1
                                  up_flag=1;
                                  if(temp>0x12)
                                  temp=1;
                                  break;
                           case 7:
                                  temp=Read1302(DS1302_YEAR);  //读取年数
                                  temp=temp+1;  //年数加1
                                  up_flag=1;
                                  if(temp>0x85)
                                  temp=0;
                                  break;
                           default:break;
                          }
                     
                   while(Up==0);               
                  }
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Downkey()//降序按键
{        
        Down=1;
        if(Down==0)
                  {
                   mdelay(8);
                     switch(count)
                          {case 1:
                                  temp=Read1302(DS1302_SECOND);  //读取秒数
                                  temp=temp-1;                            //秒数减1
                                  down_flag=1;       //数据调整后更新标志
                                  if(temp==0x7f)     //小于0秒,返回59秒
                                  temp=0x59;
                                  break;
                           case 2:
                                  temp=Read1302(DS1302_MINUTE);  //读取分数
                                  temp=temp-1;  //分数减1
                                  down_flag=1;
                                  if(temp==-1)
                                  temp=0x59;      //小于0秒,返回59秒
                                  break;
                           case 3:
                                  temp=Read1302(DS1302_HOUR);  //读取小时数
                                  temp=temp-1;  //小时数减1
                                  down_flag=1;
                                  if(temp==-1)
                                  temp=0x23;
                                  break;
                           case 4:
                                  temp=Read1302(DS1302_WEEK);  //读取星期数
                                  temp=temp-1;  //星期数减1
                                  down_flag=1;
                                  if(temp==0)
                                  temp=0x7;;
                                  break;
                           case 5:
                                  temp=Read1302(DS1302_DAY);  //读取日数
                                  temp=temp-1;  //日数减1
                                  down_flag=1;
                                  if(temp==0)
                                  temp=31;
                                  break;
                           case 6:
                                  temp=Read1302(DS1302_MONTH);  //读取月数
                                  temp=temp-1;  //月数减1
                                  down_flag=1;
                                  if(temp==0)
                                  temp=12;
                                  break;
                           case 7:
                                  temp=Read1302(DS1302_YEAR);  //读取年数
                                  temp=temp-1;  //年数减1
                                  down_flag=1;
                                  if(temp==-1)
                                  temp=0x85;
                                  break;
                          default:break;
                         }
                     
                   while(Down==0);
                  }
}

void Setkey()//模式选择按键
{
        Set=1;
        if(Set==0)
        {
           mdelay(8);
           count=count+1;     //Setkey按一次,count就加1
           done=1;             //进入调整模式
           while(Set==0);         
         }

}

void keydone()//按键功能执行
{        uchar Second;
         if(flag==0)    //关闭时钟,停止计时
         { Write1302(0x8e,0x00); //写入允许
           temp=Read1302(0x80);
           Write1302(0x80,temp|0x80);
           Write1302(0x8e,0x80); //禁止写入
           flag=1;
         }
         Setkey();                            //扫描模式切换按键
         switch(count)
         {case 1:do                            //count=1,调整秒
                  {
                   outkey();               //扫描跳出按钮
                   Upkey();                //扫描加按钮
                   Downkey();              //扫描减按钮
                   if(up_flag==1||down_flag==1)  //数据更新,重新写入新的数据
                   {
                   Write1302(0x8e,0x00); //写入允许
                   Write1302(0x80,temp|0x80); //写入新的秒数
                   Write1302(0x8e,0x80); //禁止写入
                   up_flag=0;
                   down_flag=0;
                   }

                   hide_sec++;          //位闪计数
                   if(hide_sec>3)
                     hide_sec=0;
                   show_time();         //液晶显示数据
                  }while(count==2);break;  
          case 2:do                            //count=2,调整分
                  {
                   hide_sec=0;
                   outkey();
                   Upkey();
                   Downkey();
                   if(temp>0x60)
                     temp=0;
                   if(up_flag==1||down_flag==1)
                   {
                   Write1302(0x8e,0x00); //写入允许
                   Write1302(0x82,temp); //写入新的分数
                   Write1302(0x8e,0x80); //禁止写入
                   up_flag=0;
                   down_flag=0;
                   }
                   hide_min++;
                   if(hide_min>3)
                     hide_min=0;
                   show_time();
                  }while(count==3);break;
          case 3:do                            //count=3,调整小时
                  {
                   hide_min=0;
                   outkey();
                   Upkey();
                   Downkey();
                   if(up_flag==1||down_flag==1)
                   {
                   Write1302(0x8e,0x00); //写入允许
                   Write1302(0x84,temp); //写入新的小时数
                   Write1302(0x8e,0x80); //禁止写入
                   up_flag=0;
                   down_flag=0;
                   }
                   hide_hour++;
                   if(hide_hour>3)
                     hide_hour=0;
                   show_time();
                  }while(count==4);break;
          case 4:do                            //count=4,调整星期
                  {
                   hide_hour=0;
                   outkey();
                   Upkey();
                   Downkey();
                   if(up_flag==1||down_flag==1)
                   {
                   Write1302(0x8e,0x00); //写入允许
                   Write1302(0x8a,temp); //写入新的星期数
                   Write1302(0x8e,0x80); //禁止写入
                   up_flag=0;
                   down_flag=0;
                   }
                   hide_week++;
                   if(hide_week>3)
                     hide_week=0;
                   show_time();
                  }while(count==5);break;
          case 5:do                            //count=5,调整日
                  {
                   hide_week=0;
                   outkey();
                   Upkey();
                   Downkey();
                   if(up_flag==1||down_flag==1)
                   {
                   Write1302(0x8e,0x00); //写入允许
                   Write1302(0x86,temp); //写入新的日数
                   Write1302(0x8e,0x80); //禁止写入
                   up_flag=0;
                   down_flag=0;
                   }
                   hide_day++;
                   if(hide_day>3)
                     hide_day=0;
                   show_time();
                  }while(count==6);break;
          case 6:do                            //count=6,调整月
                  {
                   hide_day=0;
                   outkey();
                   Upkey();
                   Downkey();
                   if(up_flag==1||down_flag==1)
                   {
                   Write1302(0x8e,0x00); //写入允许
                   Write1302(0x88,temp); //写入新的月数
                   Write1302(0x8e,0x80); //禁止写入
                   up_flag=0;
                   down_flag=0;
                   }
                   hide_month++;
                   if(hide_month>3)
                     hide_month=0;
                   show_time();
                  }while(count==7);break;
          case 7:do                            //count=7,调整年
                  {
                   hide_month=0;
                   outkey();
                   Upkey();
                   Downkey();
                   if(up_flag==1||down_flag==1)
                   {
                   Write1302(0x8e,0x00); //写入允许
                   Write1302(0x8c,temp); //写入新的年数
                   Write1302(0x8e,0x80); //禁止写入
                   up_flag=0;
                   down_flag=0;
                   }
                   hide_year++;
                   if(hide_year>3)
                     hide_year=0;
                   show_time();
                  }while(count==8);break;
          case 8: count=0;hide_year=0;  //count8, 跳出调整模式,返回默认显示状态
                  Second=Read1302(DS1302_SECOND);
                  Write1302(0x8e,0x00); //写入允许
                  Write1302(0x80,Second&0x7f);
                  Write1302(0x8E,0x80);          //禁止写入
                  done=0;
          break; //count=7,开启中断,标志位置0并退出
          default:break;

         }

}
  int main(void)
{
    flag=1;           //时钟停止标志
    LCD_Init();      //液晶初始化
    Init_DS18B20( ) ;      //DS18B20初始化
    Initial_DS1302(); //时钟芯片初始化
    up_flag=0;
    down_flag=0;
    done=0;           //进入默认液晶显示
    SetBackLight(0);                //设置背光的亮度等级为0
    ClrScreen();
    FontSet(1,1);
    FontMode(1,0);      

    SetBackLight(100);                    //设置背光打开     
    while(1)
    {   
        while(done==1)
          keydone();    //进入调整模式
        while(done==0)
         {  
            show_time();                //液晶显示数据
            flag=0;                  
              Setkey();                 //扫描各功能键
         }
    }
}






  • 未命名.jpg

回帖(2)

李特龙

2012-3-28 22:11:23
这程序够长的,可惜俺看不懂
举报

chenshengas

2012-3-29 14:31:29
没人?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分