本帖最后由 chenshengas 于 2012-3-28 10:28 编辑
程序出现了以下错误,怎么改
错误的地方我用红 {MOD}标注了
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 <REG51.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define Dis_X_MAX 128-1
#define Dis_Y_MAX 64-1
sbit SPI_CS = P0^0; //定义CS接在P0.0端口
sbit SPI_SDA = P0^1; //定义SDA接在P0.1端口
sbit SPI_SCK = P0^2; //定义SCK接在P0.2端口
sbit SPI_RES = P0^3; //定义RESET接P0.3端口
sbit DS1302_CLK = P1^1; //实时时钟时钟线引脚
sbit DS1302_IO = P1^0; //实时时钟数据线引脚
sbit DS1302_RST = P1^2;
sbit Set = P2^0; //模式切换键
sbit Up = P2^1; //加法按钮
sbit Down = P2^2; //减法按钮
sbit out = P2^3; //立刻跳出调整模式按钮
sbit DQ = P3^7; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit 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 文本颜 {MOD},仅作用于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字体,字符 {MOD}为黑 {MOD}
SPI_SSSet(1); //完成操作置SS高电平
}
//========================================================================
// 函数: void FontMode(unsigned char Cover,unsigned char Color)
// 描述: 设置字符显示覆盖模式
// 参数: Cover 字符覆盖模式设置,0或1
// Color 覆盖模式为1时字符显示时的背景覆盖 {MOD}
// 返回: 无
// 备注:
// 版本:
// 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字体,字符 {MOD}为黑 {MOD}
SPI_SSSet(1); //完成操作置SS高电平
}
//========================================================================
// 函数: void FontSet_cn(unsigned char Font_NUM,unsigned char Color)
// 描述: 汉字库字符字体设置
// 参数: Font_NUM 字体选择,以驱动所带的字库为准
// Color 文本颜 {MOD},仅作用于汉字库
// 返回: 无
// 备注:
// 版本:
// 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字体,字符 {MOD}为黑 {MOD}
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<count;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) //数据更新,重新写入新的数据
{
一周热门 更多>