📄 1602.lst
字号:
C51 COMPILER V8.02 1602 04/07/2012 10:23:53 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 1602
OBJECT MODULE PLACED IN 1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*************************************************************/
2 // 利用1602显示万年历,同时显示温度信息
3 /*************************************************************/
4 #include <REG51.H>
5 #include <intrins.h>
6 #define uint unsigned int
7 #define uchar unsigned char
8 sbit DS1302_CLK = P3^7; //实时时钟时钟线引脚
9 sbit DS1302_IO = P1^0; //实时时钟数据线引脚
10 sbit DS1302_RST = P1^1; //实时时钟复位线引脚
11 sbit ACC0 = ACC^0;
12 sbit ACC7 = ACC^7;
13 char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
14 sbit Set = P1^4; //模式切换键
15 sbit Up = P1^5; //加按钮
16 sbit Down = P1^6; //减按钮
17 sbit out = P1^7; //立刻跳出调整模式按钮
18 sbit DQ = P2^7; //温度传送数据IO口
19 char done,count,temp,flag,up_flag,down_flag;
20 uchar temp_value; //温度值
21 uchar TempBuffer[5],week_value[2];
22
23
24 void show_time(); //液晶显示程序
25 /***********1602液晶显示部分子程序****************/
26
27
28 //Port Definitions**********************************************************
29 sbit LcdRs = P2^2;
30 sbit LcdRw = P2^1;
31 sbit LcdEn = P2^0;
32 sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
33
34 //内部等待函数**************************************************************************
35 unsigned char LCD_Wait(void)
36 {
37 1 LcdRs=0;
38 1 LcdRw=1; _nop_();
39 1 LcdEn=1; _nop_();
40 1
41 1 LcdEn=0;
42 1 return DBPort;
43 1 }
44 //向LCD写入命令或数据************************************************************
45 #define LCD_COMMAND 0 // Command
46 #define LCD_DATA 1 // Data
47 #define LCD_CLEAR_SCREEN 0x01 // 清屏
48 #define LCD_HOMING 0x02 // 光标返回原点
49 void LCD_Write(bit style, unsigned char input)
50 {
51 1 LcdEn=0;
52 1 LcdRs=style;
53 1 LcdRw=0; _nop_();
54 1 DBPort=input; _nop_();//注意顺序
55 1 LcdEn=1; _nop_();//注意顺序
C51 COMPILER V8.02 1602 04/07/2012 10:23:53 PAGE 2
56 1 LcdEn=0; _nop_();
57 1 LCD_Wait();
58 1 }
59
60 //设置显示模式************************************************************
61 #define LCD_SHOW 0x04 //显示开
62 #define LCD_HIDE 0x00 //显示关
63
64 #define LCD_CURSOR 0x02 //显示光标
65 #define LCD_NO_CURSOR 0x00 //无光标
66
67 #define LCD_FLASH 0x01 //光标闪动
68 #define LCD_NO_FLASH 0x00 //光标不闪动
69
70 void LCD_SetDisplay(unsigned char DisplayMode)
71 {
72 1 LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
73 1 }
74
75 //设置输入模式************************************************************
76 #define LCD_AC_UP 0x02
77 #define LCD_AC_DOWN 0x00 // default
78
79 #define LCD_MOVE 0x01 // 画面可平移
80 #define LCD_NO_MOVE 0x00 //default
81
82 void LCD_SetInput(unsigned char InputMode)
83 {
84 1 LCD_Write(LCD_COMMAND, 0x04|InputMode);
85 1 }
86
87 //初始化LCD************************************************************
88 void LCD_Initial()
89 {
90 1 LcdEn=0;
91 1 LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
92 1 LCD_Write(LCD_COMMAND,0x38);
93 1 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
94 1 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
95 1 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
96 1 }
97
98 //液晶字符输入的位置************************
99 void GotoXY(unsigned char x, unsigned char y)
100 {
101 1 if(y==0)
102 1 LCD_Write(LCD_COMMAND,0x80|x);
103 1 if(y==1)
104 1 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
105 1 }
106 //将字符输出到液晶显示
107 void Print(unsigned char *str)
108 {
109 1 while(*str!='\0')
110 1 {
111 2 LCD_Write(LCD_DATA,*str);
112 2 str++;
113 2 }
114 1 }
115 /***********DS1302时钟部分子程序******************/
116 typedef struct __SYSTEMTIME__
117 {
C51 COMPILER V8.02 1602 04/07/2012 10:23:53 PAGE 3
118 unsigned char Second;
119 unsigned char Minute;
120 unsigned char Hour;
121 unsigned char Week;
122 unsigned char Day;
123 unsigned char Month;
124 unsigned char Year;
125 unsigned char DateString[11];
126 unsigned char TimeString[9];
127 }SYSTEMTIME; //定义的时间类型
128 SYSTEMTIME CurrentTime;
129
130
131 #define AM(X) X
132 #define PM(X) (X+12) // 转成24小时制
133 #define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
134 #define DS1302_MINUTE 0x82
135 #define DS1302_HOUR 0x84
136 #define DS1302_WEEK 0x8A
137 #define DS1302_DAY 0x86
138 #define DS1302_MONTH 0x88
139 #define DS1302_YEAR 0x8C
140
141 void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
142 {
143 1 unsigned char i;
144 1 ACC = d;
145 1 for(i=8; i>0; i--)
146 1 {
147 2 DS1302_IO = ACC0; //相当于汇编中的 RRC
148 2 DS1302_CLK = 1;
149 2 DS1302_CLK = 0;
150 2 ACC = ACC >> 1;
151 2 }
152 1 }
153
154 unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
155 {
156 1 unsigned char i;
157 1 for(i=8; i>0; i--)
158 1 {
159 2 ACC = ACC >>1; //相当于汇编中的 RRC
160 2 ACC7 = DS1302_IO;
161 2 DS1302_CLK = 1;
162 2 DS1302_CLK = 0;
163 2 }
164 1 return(ACC);
165 1 }
166
167 void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
168 {
169 1 DS1302_RST = 0;
170 1 DS1302_CLK = 0;
171 1 DS1302_RST = 1;
172 1 DS1302InputByte(ucAddr); // 地址,命令
173 1 DS1302InputByte(ucDa); // 写1Byte数据
174 1 DS1302_CLK = 1;
175 1 DS1302_RST = 0;
176 1 }
177
178 unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
179 {
C51 COMPILER V8.02 1602 04/07/2012 10:23:53 PAGE 4
180 1 unsigned char ucData;
181 1 DS1302_RST = 0;
182 1 DS1302_CLK = 0;
183 1 DS1302_RST = 1;
184 1 DS1302InputByte(ucAddr|0x01); // 地址,命令
185 1 ucData = DS1302OutputByte(); // 读1Byte数据
186 1 DS1302_CLK = 1;
187 1 DS1302_RST = 0;
188 1 return(ucData);
189 1 }
190
191
192
193 void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组
194 {
195 1 unsigned char ReadValue;
196 1 ReadValue = Read1302(DS1302_SECOND);
197 1 Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -