当前位置:
文档之家› 基于51单片机与DS1302时钟芯片和LCD1602液晶显示的数字时钟
基于51单片机与DS1302时钟芯片和LCD1602液晶显示的数字时钟
P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
D1 LC
SD E
S V
VD
E V
S R
RW E
0 1 2 3 4 5 67 D D D D D D DD
D N +5V G 39 38
37
36 35
34
33 32
#define LCD_AC_UP
0x02
#define LCD_AC_DOWN
0x00
// default
#define LCD_MOVE #define LCD_NO_MOVE
0x01
#define LCD_SHOW
0x04 // 显示开
#define LCD_HIDE
0x00 // 显示关
#define LCD_CURSOR #define LCD_NO_CURSOR
0x02 0x00
// 显示光标 // 无光标
#define LCD_FLASH #define LCD_NO_FLASH
// Command
#define LCD_DATA
1
// Data
#define LCD_CLEAR_SCREEN 0x01
// 清屏
#define LCD_HOMING
0x02
// 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
Word 文档
VCC2
1
3 P1.2
768 32
X2
RST 5
4 P1.3
5 P1.4 6 P1.5
7
7
3
SCLK
6
8 P1.6
X2
I/O
P1.7
DS1302
LM016L
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15
.
LcdEn=0;
LcdRs=style;
LcdRw=0;
_nop_();
DBPort=input;
_nop_();// 注意顺序
LcdEn=1;
_nop_();// 注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}
// 设置显示模式 ************************************************************
123
4 56
78 901 23 4 1 1 1 1 1 5V +
21
22
23
24
25
RV1
26
5V
27
+
D
10k
N
G
28
10 11 12 13 14 15 16 17
RP1
1
2 3 4 5 6 7 8 9
10K
KEIL C程序:
#include <REGX52.H> #include "LCD1602.h" #include "DS1302.h"
Delay1ms(400); } }
#ifndef LCD_CHAR_1602_2005_4_9 #define LCD_CHAR_1602_2005_4_9
Hale Waihona Puke #include <intrins.h>
//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.
数据端口
// 部等待函数 **************************************************************************
void Delay1ms(unsigned int count) {
unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); }
main() {
SYSTEMTIME CurrentTime; LCD_Initial(); Initial_DS1302();
0x01 0x00
// 光标闪动 // 光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode) {
LCD_Write(LCD_COMMAND, 0x08|DisplayMode); }
// 设置输入模式 ************************************************************
.
PROTEUS仿真图:
D N G
C1
C2
22pF
22pF
+5V
X1
U1
19 XTAL1
12MHz
18 XTAL2
C3
9
RST
D
20uF
N G
1k
R1
+5V
D
1.5V 1.5V
N
G
52
29 PSEN 30 ALE 31
C 89 AT
EA
U2
1
P1.0/T2
2 X1 VCC1
8
+5V
2 P1.1/T2EX
GotoXY(0,0); Print(" tian ma dian zi"); GotoXY(0,1); Print("Time: ");
Word 文档
.
while(1) {
DS1302_GetTime(&CurrentTime); TimeToStr(&CurrentTime); GotoXY(6,1); Print(CurrentTime.TimeString);
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