嵌入式课程设计——基于DS1302数字钟(3)

2018-11-23 23:53

嵌入式课程设计报告

}

Print(\GotoXY(0,1); Print(\

while(1) {

DS1302_GetTime(&CurrentTime); TimeToStr(&CurrentTime); GotoXY(6,1);

Print(CurrentTime.TimeString); Delay1ms(400); }

3.2 LCD1602程序:

#ifndef LCD_CHAR_1602_2005_4_9 #define LCD_CHAR_1602_2005_4_9

#include

//Port Definitions********************************************************** sbit LcdRs = P2^0; sbit LcdRw = P2^1; sbit LcdEn = P2^2;

sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

//内部等待函数

************************************************************************** unsigned char LCD_Wait(void) {

LcdRs=0;

LcdRw=1; _nop_(); LcdEn=1; _nop_();

//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,

//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80

//实际硬件时打开此语句 LcdEn=0;

return DBPort; }

//向LCD写入命令或数据

- 10 -

嵌入式课程设计报告

************************************************************ #define LCD_COMMAND 0 // Command #define LCD_DATA 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; _nop_();//注意顺序 LcdEn=0; _nop_(); LCD_Wait(); }

//设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开

#define LCD_HIDE 0x00 //显示关

#define LCD_CURSOR 0x02 //显示光标

#define LCD_NO_CURSOR 0x00 //无光标

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

void LCD_SetDisplay(unsigned char DisplayMode) {

LCD_Write(LCD_COMMAND, 0x08|DisplayMode); }

//设置输入模式************************************************************ #define LCD_AC_UP 0x02

#define LCD_AC_DOWN 0x00 // default

#define LCD_MOVE 0x01 // 画面可平移 #define LCD_NO_MOVE 0x00 //default

void LCD_SetInput(unsigned char InputMode) {

LCD_Write(LCD_COMMAND, 0x04|InputMode); }

//移动光标或屏幕************************************************************

- 11 -

嵌入式课程设计报告

/*

#define LCD_CURSOR 0x02 #define LCD_SCREEN 0x08 #define LCD_LEFT 0x00 #define LCD_RIGHT 0x04

void LCD_Move(unsigned char object, unsigned char direction) {

if(object==LCD_CURSOR)

LCD_Write(LCD_COMMAND,0x10|direction); if(object==LCD_SCREEN)

LCD_Write(LCD_COMMAND,0x18|direction); } */

//初始化LCD************************************************************ 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++; } } /*

void LCD_LoadChar(unsigned char user[8], unsigned char place) {

unsigned char i;

- 12 -

嵌入式课程设计报告

LCD_Write(LCD_COMMAND,0x40|(place*8)); for(i=0; i<8; i++)

LCD_Write(LCD_DATA,user[i]); } */

//************************************************************************ #endif

3.3 DS1302应用程序:

#ifndef _REAL_TIMER_DS1302_2003_7_21_ #define _REAL_TIMER_DS1302_2003_7_21_

sbit DS1302_CLK = P1^6; //实时时钟时钟线引脚 sbit DS1302_IO = P1^7; //实时时钟数据线引脚 sbit DS1302_RST = P1^5; //实时时钟复位线引脚 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7;

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[9]; unsigned char TimeString[9]; }SYSTEMTIME; //定义的时间类型

#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

#define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏

void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)

- 13 -

嵌入式课程设计报告

{

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); // 地址,命令

- 14 -


嵌入式课程设计——基于DS1302数字钟(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:教师集体备课记录两位数乘一位数

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

马上注册会员

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