电子系统设计报告
开始 返回?K4 正常显示
秒表模式 启动?K5 暂停?K1 记录? K1 显示 清零?K3 第 21 页 共 50 页
电子系统设计报告
开始 返回?K 光标确认 K4 调整时间K2、K3 确定?K4 正常显示
4.2 模块软件设计
4.2.1 LCD1602的驱动程序
#ifndef LCD_1602 #define LCD_1602
第 22 页 共 50 页
电子系统设计报告
#include
//引脚定义********************************************************** sbit LcdRs = P2^7; sbit LcdRw = P2^6; sbit LcdEn = P2^5; 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写入命令或数据************************************************************ #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 //显示关
第 23 页 共 50 页
#define LCD_CURSOR #define LCD_NO_CURSOR
#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 //读入一个字符后地址指针减一
#define LCD_MOVE 0x01 //写一个字符后W左移 #define LCD_NO_MOVE 0x00 //写一个字符后不移动
void LCD_SetInput(unsigned char InputMode) //输入屏幕模式设定 { LCD_Write(LCD_COMMAND, 0x04|InputMode); }
//初始化LCD************************************************************ void LCD_Initial() { LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,一般指令 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)
第 24 页 共 50 页
电子系统设计报告
0x02 //显示光标 0x00 //无光标
电子系统设计报告
{ while(*str!='\\0') { LCD_Write(LCD_DATA,*str); str++; } }
#endif
4.2.2 DS1302的驱动程序 #ifndef _TIMER_DS1302 #define _TIMER_DS1302
sbit DS1302_CLK = P3^4; //实时时钟时钟线引脚 sbit DS1302_IO = P3^5; //实时时钟数据线引脚 sbit DS1302_RST = P3^6; //实时时钟复位线引脚 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7;
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; unsigned char week_value[2];
typedef struct __SYSTEMTIME__ { unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString[10]; 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_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C
第 25 页 共 50 页