#define F_CPU 1000000UL
#include <ioavr.h>
#include "delay.h"
#include <string.h>
#include <stdio.h>
#define INT8U unsigned char
#define INT16U unsigned int
//液晶相关函数
extern void Initialize_LCD();
extern void LCD_ShowString(INT8U x, INT8U y,char *str);
//DS1302相关函数与数据
extern void GetDateTime();
extern INT8U DateTime[];
extern char *WEEK[];
//LCD显示缓冲(注意串长均为16,两个字符串中DATE和TIME后各有一个空格
//字符串的最后面各有3个空格.
INT8U LCD_BUF_1[] = "DATE 00-00-00 ";
INT8U LCD_BUF_2[] = "TIME 00:00:00 ";
//LCD显示缓冲
char LCD_DSY_BUFFER[17];
//-----------------------------------------------------------------
// 日期与时间值转换为数字字符
// 输入的参数d为BCD码时,使用语句[1]、[2]之一
// 输入的参数d为10进制数时,使用语句[3]
// 建议DS1302.c内的函数GetDateTime直接返回BCD码,这样可节省一次转换.
// 如果在GetDateTime内转换为10进制数返回,本函数内再转换为字符,
// 这将影响运行速度.
//-----------------------------------------------------------------
void Format_DateTime(INT8U d, INT8U *a)
{
//如果GetDateTime函数直接返回BCD码返回则使用下面的语句
//*a = (d >> 4) + '0'; *(a+1) = (d & 0x0F) + '0'; //[1]
//或者使用下面的语句,更优的写法显然是上面含有位运算符(>>,&)的语句
//*a = d / 16 + '0'; *(a+1) = d % 16 + '0'; //[2]
//--------------------------------------------------
//如果GetDateTime函数将BCD码转换为10进制数以后再返回
//则应使用下面的语句
*a = d / 10 + '0'; *(a+1) = d % 10 + '0'; //[3]
}
//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
int main()
{
DDRA = 0xFF; //端口配置
DDRC = 0xFF; DDRD = 0xFF;
Initialize_LCD(); //初始化LCD
while(1)
{
GetDateTime(); //读取DS1302实时时钟
//格式化年月日
Format_DateTime(DateTime[6], LCD_BUF_1 + 5);
Format_DateTime(DateTime[4], LCD_BUF_1 + 8);
Format_DateTime(DateTime[3], LCD_BUF_1 + 11);
//格式化星期
strcpy(LCD_BUF_1 + 13, WEEK[DateTime[5] - 1]);
//警告[Pe167]:类型为“unsigned char*”的参数与类型为“char*”的参数不兼容
//格式化时分秒
Format_DateTime(DateTime[2], LCD_BUF_2 + 5);
Format_DateTime(DateTime[1], LCD_BUF_2 + 8);
Format_DateTime(DateTime[0], LCD_BUF_2 + 11);
//显示年月日,星期,时分秒
LCD_ShowString(0, 0, LCD_BUF_1);
LCD_ShowString(0, 1, LCD_BUF_2);
}
}
程序出现3个警告 类型为“unsigned char*”的参数与类型为“char*”的参数不兼容
strcpy(LCD_BUF_1 + 13, WEEK[DateTime[5] - 1]);
LCD_ShowString(0, 0, LCD_BUF_1);
LCD_ShowString(0, 1, LCD_BUF_2);
应该是 INT8U LCD_BUF_1 设置不对 请教应该怎么改 |