电子万年台历的设计制作(4)

2019-02-20 23:45

皖西学院 学生课程设计项目

//写LCD写命令或数据 #define LCD_COMMAND #define LCD_DATA

0 // Command

1 // Data

#define LCD_CLEAR_SCREEN 0x01 // 清屏 #define LCD_HOMING

0x02 // 光标返回原点

void LCD_Write(bit style, unsigned char input) { LcdEn=0; LcdRs=style; LcdRw=0;

_nop_();

DBPort=input; _nop_();//注意顺序 LcdEn=1; LcdEn=0;

_nop_();//注意顺序 _nop_();

LCD_Wait(); } //设置显示模式 #define LCD_SHOW #define LCD_HIDE #define LCD_CURSOR

0x04 //显示开 0x00 //显示关

0x02 //显示光标

#define LCD_NO_CURSOR #define LCD_FLASH

0x00 //无光标 0x01 //光标闪动

#define LCD_NO_FLASH 0x00 //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode) { LCD_Write(LCD_COMMAND, 0x08|DisplayMode); } //设置输入模式 #define LCD_AC_UP

0x02

0x00 // default

#define LCD_AC_DOWN #define LCD_MOVE

0x01 // 画面可平移

0x00 //default

#define LCD_NO_MOVE

void LCD_SetInput(unsigned char InputMode) { LCD_Write(LCD_COMMAND, 0x04|InputMode); } //初始化LCD

16

皖西学院 学生课程设计项目

void LCD_Initial() { LcdEn=0;

LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动 } //液晶字符输入的位置************************ void GotoXY(unsigned char x, unsigned char y) { if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40)); }

//将字符输出到液晶显示 void Print(unsigned char *str) {

while(*str!='\\0')

{ LCD_Write(LCD_DATA,*str);

str++; }}

/***********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];

17

皖西学院 学生课程设计项目

}SYSTEMTIME; //定义的时间类型 SYSTEMTIME CurrentTime; #define AM(X) X

#define PM(X) (X+12) // 转成24小时制

#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间 #define DS1302_MINUTE 0x82 #define DS1302_HOUR #define DS1302_WEEK #define DS1302_DAY

0x84 0x8A 0x86

#define DS1302_MONTH 0x88 #define DS1302_YEAR

0x8C

//实时时钟写入一字节(内部函数)

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; ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; } return(ACC); }

void Write1302(unsigned char ucAddr, unsigned char ucDa) 址, ucData: 要写的数据

{ DS1302_RST = 0;

18

//相当于汇编中的 RRC

//ucAddr: DS1302地

皖西学院 学生课程设计项目

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);

19

皖西学院 学生课程设计项目

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 + '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 + '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 + '0';} else

{ Time->DateString[8] = ' '; Time->DateString[9] = ' '; } if(hide_week<2)

20

}

}


电子万年台历的设计制作(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:鲁班算量技巧培训教材

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: