📄 lcd12887_1.lst
字号:
14 =1 /*--------------------------------------------------------------*/
15 =1 //LCD接口定义
16 =1 sfr io = 0xA0; //P0-0x80,P1-0x90,P2-0xA0,P3-0xB0;
17 =1 sbit rs = P3^4; //LCD数据/命令选择端(H/L)
18 =1 sbit rw = P3^5; //LCD读/写选择端(H/L)
19 =1 sbit ep = P3^6; //LCD使能控制
20 =1 sbit bz = io^7; //LCD忙标志位
21 =1
22 =1
23 =1 /*--------------------------------------------------------------*/
24 =1 //函数声明
25 =1 void lcd_busy(void); //测试LCD忙碌状态程序
26 =1 void lcd_wcmd(unsigned char cmd); //写入指令到LCD程序
27 =1 void lcd_wdat(unsigned char dat); //写入数据到LCD程序
28 =1 void lcd_pos (unsigned char x, bit y); //LCD数据指针位置程序
29 =1 //void printc(unsigned char CHAR); //显示字符
30 =1 void prints(unsigned char *string); //显示字符串
31 =1 void lcd_init(void); //LCD初始化设定程序
32 =1
33 =1
34 =1 /*--------------------------------------------------------------*/
35 =1 //测试LCD忙碌状态
36 =1 void lcd_busy(void)
37 =1 {
38 1 =1 do{
39 2 =1 ep = 0;
40 2 =1 rs = 0; //指令
41 2 =1 rw = 1; //读出
42 2 =1 io = 0xff;
43 2 =1 ep = 1;
44 2 =1 _nop_(); //高电平读出 1us
45 2 =1 }while(bz); //bz=1表示忙,bz=0表示空闲
46 1 =1 ep = 0;
47 1 =1 }
48 =1
49 =1
50 =1 /*--------------------------------------------------------------*/
51 =1 //写入指令到LCD
52 =1 void lcd_wcmd(unsigned char cmd)
53 =1 {
54 1 =1 lcd_busy(); //检测忙
C51 COMPILER V7.06 LCD12887_1 10/26/2008 21:45:08 PAGE 6
55 1 =1 rs = 0; //指令
56 1 =1 rw = 0; //写入
57 1 =1 ep = 1;
58 1 =1 io = cmd; //指令
59 1 =1 ep = 0; //下降沿有效
60 1 =1 }
61 =1
62 =1
63 =1 /*--------------------------------------------------------------*/
64 =1 //写入数据函数
65 =1 void lcd_wdat(unsigned char Data)
66 =1 {
67 1 =1 lcd_busy(); //检测忙
68 1 =1 rs = 1; //数据
69 1 =1 rw = 0; //写入
70 1 =1 ep = 1;
71 1 =1 io = Data; //数据
72 1 =1 ep = 0; //下降沿有效
73 1 =1 }
74 =1
75 =1
76 =1 /*--------------------------------------------------------------*/
77 =1 //LCD数据指针位置程序
78 =1 void lcd_pos(unsigned char x, bit y)
79 =1 {
80 1 =1 if(y)lcd_wcmd(x|0xc0); //y=1,第二行显示;y=0,第一行显示 0<=x<16
81 1 =1 else lcd_wcmd(x|0x80); //数据指针=80+地址码(00H~27H,40H~67H)
82 1 =1 }
83 =1
84 =1
85 =1 /*--------------------------------------------------------------*/
86 =1 //显示字符
87 =1 /*
88 =1 void printc(unsigned char CHAR)
89 =1 {
90 =1 lcd_wdat(CHAR);
91 =1 }
92 =1 */
93 =1
94 =1
95 =1 /*--------------------------------------------------------------*/
96 =1 //显示字符串
97 =1 void prints(unsigned char *string)
98 =1 {
99 1 =1 while(*string) {lcd_wdat(*string);string++;}
100 1 =1 }
101 =1
102 =1
103 =1 /*--------------------------------------------------------------*/
104 =1 //LCD初始化设定
105 =1 void lcd_init()
106 =1 {
107 1 =1 lcd_wcmd(0x38); //设置LCD为16X2显示,5X7点阵,八位数据接口
108 1 =1 lcd_wcmd(0x06); //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
109 1 =1 lcd_wcmd(0x0c); //LCD开显示及光标设置(光标不闪烁,不显示"_")
110 1 =1 lcd_wcmd(0x01); //清除LCD的显示内容
111 1 =1 }
112 =1
113 =1
114 =1 /*--------------------------------------------------------------*/
115 =1 #endif
5 #include"DS12887_1.H"
C51 COMPILER V7.06 LCD12887_1 10/26/2008 21:45:08 PAGE 7
1 =1 /*--------------------------------------------------------------*/
2 =1 //File: DS12887驱动程序
3 =1 //Date: 08-10-20 ~ 10-23
4 =1 //Time: 21:20 ~ 16:53
5 =1 //Source: Web
6 =1
7 =1
8 =1 /*--------------------------------------------------------------*/
9 =1 #ifndef __DS12887_1_H__
10 =1 #define __DS12887_1_H__
11 =1
12 =1
13 =1 /*--------------------------------------------------------------*/
14 =1 //接口定义
15 =1 sbit DS_AS = P3^0; //地址选择
16 =1 sbit DS_RW = P3^1; //读写选择
17 =1 sbit DS_DS = P3^2; //数据选择
18 =1 sbit DS_IRQ = P3^3; //中断,低电平有效,通过读出0x0c来清除信号
19 =1 sfr DS_DAT = 0x90; //8位数据线P1口
20 =1
21 =1
22 =1 /*--------------------------------------------------------------*/
23 =1 //数据地址定义
24 =1 #define DS12887_Second 0x00 //秒
25 =1 #define DS12887_Minute 0x02 //分
26 =1 #define DS12887_Hour 0x04 //时
27 =1 #define DS12887_Week 0x06 //星期
28 =1 #define DS12887_Day 0x07 //日
29 =1 #define DS12887_Month 0x08 //月
30 =1 #define DS12887_Year 0x09 //年
31 =1
32 =1
33 =1 /*--------------------------------------------------------------*/
34 =1 //定义时间类型
35 =1 typedef struct _SYSTEMTIME_
36 =1 {
37 =1 unsigned char Second;
38 =1 unsigned char Minute;
39 =1 unsigned char Hour;
40 =1 unsigned char Week;
41 =1 unsigned char Day;
42 =1 unsigned char Month;
43 =1 unsigned char Year;
44 =1 unsigned char DateString[9];
45 =1 unsigned char TimeString[9];
46 =1 }SYSTEMTIME;
47 =1
48 =1
49 =1 /*--------------------------------------------------------------*/
50 =1 //函数声明
51 =1 void DS12887_Init(void); //DS12887初始化
52 =1 void DS12887_Write(unsigned char Address, unsigned char Value); //DS12887指定地址写入数据
53 =1 unsigned char DS12887_Read(unsigned char Address); //DS12887指定地址中读出数据
54 =1 void DS12887_SetTime(unsigned char Address, unsigned char Value); //设置时间函数
55 =1 void DS12887_GetTime(SYSTEMTIME *Time); //读出时间
56 =1 void DateToStr(SYSTEMTIME *Time); //日期转化成字符
57 =1 void TimeToStr(SYSTEMTIME *Time); //时间转化成字符
58 =1
59 =1
60 =1 /*--------------------------------------------------------------*/
61 =1 //DS12887指定地址写入数据
62 =1 void DS12887_Write(unsigned char Address, unsigned char Value)
C51 COMPILER V7.06 LCD12887_1 10/26/2008 21:45:08 PAGE 8
63 =1 {
64 1 =1 DS_AS = 0;
65 1 =1 DS_DS = 1;
66 1 =1 DS_RW = 1;
67 1 =1 DS_AS = 1;
68 1 =1 DS_DAT= Address;
69 1 =1 DS_AS = 0;
70 1 =1 DS_RW = 0;
71 1 =1 DS_DAT= Value;
72 1 =1 DS_RW = 1;
73 1 =1 DS_AS = 1;
74 1 =1 }
75 =1
76 =1
77 =1 /*--------------------------------------------------------------*/
78 =1 //DS12887指定地址中读出数据
79 =1 unsigned char DS12887_Read(unsigned char Address)
80 =1 {
81 1 =1 unsigned char DS_RDAT;
82 1 =1 DS_AS = 0;
83 1 =1 DS_DS = 1;
84 1 =1 DS_RW = 1;
85 1 =1 DS_AS = 1;
86 1 =1 DS_DAT= Address;
87 1 =1 DS_AS = 0;
88 1 =1 DS_DS = 0;
89 1 =1 DS_DAT=0xff;
90 1 =1 DS_RDAT = DS_DAT;
91 1 =1 DS_DS = 1;
92 1 =1 DS_AS = 1;
93 1 =1 return (DS_RDAT);
94 1 =1 }
95 =1
96 =1
97 =1 /*--------------------------------------------------------------*/
98 =1 //DS12887初始化
99 =1 void DS12887_Init(void)
100 =1 {
101 1 =1 DS12887_Write(0x0a, 0x20); //启动DS12887
102 1 =1 DS12887_Write(0x0b, 0x86); //禁止更新,接下来初始化数据,即写入时间,日期等
103 1 =1 DS12887_Write(0x0b, 0x06); //正常更新,二进制格式,24进制小时
104 1 =1 }
105 =1
106 =1
107 =1 /*--------------------------------------------------------------*/
108 =1 //设置时间函数
109 =1 void DS12887_SetTime(unsigned char Address, unsigned char Value)
110 =1 {
111 1 =1 DS12887_Write(0x0b, 0x86); //禁止更新,接下来初始化数据,即写入时间,日期等
112 1 =1 DS12887_Write(Address,Value);
113 1 =1 DS12887_Write(0x0b, 0x06); //正常更新,二进制格式,24进制小时
114 1 =1 }
115 =1
116 =1
117 =1 /*--------------------------------------------------------------*/
118 =1 //读出时间
119 =1 void DS12887_GetTime(SYSTEMTIME *Time)
120 =1 {
121 1 =1 Time->Second = DS12887_Read(DS12887_Second);
122 1 =1 Time->Minute = DS12887_Read(DS12887_Minute);
123 1 =1 Time->Hour = DS12887_Read(DS12887_Hour );
124 1 =1 Time->Day = DS12887_Read(DS12887_Day );
C51 COMPILER V7.06 LCD12887_1 10/26/2008 21:45:08 PAGE 9
125 1 =1 Time->Week = DS12887_Read(DS12887_Week );
126 1 =1 Time->Month = DS12887_Read(DS12887_Month );
127 1 =1 Time->Year = DS12887_Read(DS12887_Year );
128 1 =1 }
129 =1
130 =1
131 =1 /*--------------------------------------------------------------*/
132 =1 //日期转化成字符
133 =1 void DateToStr(SYSTEMTIME *Time)
134 =1 {
135 1 =1 Time->DateString[0] = Time->Year/10 + '0';
136 1 =1 Time->DateString[1] = Time->Year%10 + '0';
137 1 =1 Time->DateString[2] = '-';
138 1 =1 Time->DateString[3] = Time->Month/10 + '0';
139 1 =1 Time->DateString[4] = Time->Month%10 + '0';
140 1 =1 Time->DateString[5] = '-';
141 1 =1 Time->DateString[6] = Time->Day/10 + '0';
142 1 =1 Time->DateString[7] = Time->Day%10 + '0';
143 1 =1 Time->DateString[8] = '\0';
144 1 =1 }
145 =1
146 =1
147 =1 /*--------------------------------------------------------------*/
148 =1 //时间转化成字符
149 =1 void TimeToStr(SYSTEMTIME *Time)
150 =1 {
151 1 =1 Time->TimeString[0] = Time->Hour/10 + '0';
152 1 =1 Time->TimeString[1] = Time->Hour%10 + '0';
153 1 =1 Time->TimeString[2] = ':';
154 1 =1 Time->TimeString[3] = Time->Minute/10 + '0';
155 1 =1 Time->TimeString[4] = Time->Minute%10 + '0';
156 1 =1 Time->TimeString[5] = ':';
157 1 =1 Time->TimeString[6] = Time->Second/10 + '0';
158 1 =1 Time->TimeString[7] = Time->Second%10 + '0';
159 1 =1 Time->TimeString[8] = '\0';
160 1 =1 }
161 =1
162 =1
163 =1 /*--------------------------------------------------------------*/
164 =1 #endif
6
7
8 /*--------------------------------------------------------------*/
9 unsigned char k; //键值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -