📄 lcd1602.lst
字号:
C51 COMPILER V8.02 LCD1602 07/12/2011 20:57:59 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN lcd1602.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE lcd1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2 #include"DS18B20_3.H"
3 #define uint unsigned int
4 #define uchar unsigned char
5 uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
6 //flag用于读取头文件中的温度值,和显示温度值
7
8 #define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
9 #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)
10
11 //液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
12 sbit rs=P2^0;
13 sbit en=P2^2;
14 sbit rw=P2^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了
15 sbit led=P2^6; //LCD背光开关
16
17 //DS1302时钟芯片与C51之间的引脚连接定义
18 sbit IO=P1^1;
19 sbit SCLK=P1^0;
20 sbit RST=P1^2;
21
22 sbit ACC0=ACC^0;
23 sbit ACC7=ACC^7;
24 /************************************************************
25 ACC累加器=A
26 ACC.0=E0H
27
28 ACC.0就是ACC的第0位。Acc可以位寻址。
29
30 累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,
31 是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时,
32 常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。
33 一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。
34 ***************************************************************/
35
36 //校时按键与C51的引脚连接定义
37 sbit key1=P1^5; //设置键
38 sbit key2=P1^6; //加键
39 sbit key3=P1^7; //减键
40
41 sbit buzzer=P1^3;//蜂鸣器,通过三极管9012驱动,端口低电平响
42
43 /**************************************************************/
44
45 uchar code tab1[]={"20 - - "}; //年显示的固定字符
46 uchar code tab2[]={" : : "};//时间显示的固定字符
47
48 //延时函数,后面经常调用
49 void delay(uint xms)//延时函数,有参函数
50 {
51 1 uint x,y;
52 1 for(x=xms;x>0;x--)
53 1 for(y=110;y>0;y--);
54 1 }
55
C51 COMPILER V8.02 LCD1602 07/12/2011 20:57:59 PAGE 2
56 /********液晶写入指令函数与写入数据函数,以后可调用**************/
57
58 /*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/
59
60 write_1602com(uchar com)//****液晶写入指令函数****
61 {
62 1 rs=0;//数据/指令选择置为指令
63 1 rw=0; //读写选择置为写
64 1 P0=com;//送入数据
65 1 delay(1);
66 1 en=1;//拉高使能端,为制造有效的下降沿做准备
67 1 delay(1);
68 1 en=0;//en由高变低,产生下降沿,液晶执行命令
69 1 }
70
71
72 write_1602dat(uchar dat)//***液晶写入数据函数****
73 {
74 1 rs=1;//数据/指令选择置为数据
75 1 rw=0; //读写选择置为写
76 1 P0=dat;//送入数据
77 1 delay(1);
78 1 en=1; //en置高电平,为制造下降沿做准备
79 1 delay(1);
80 1 en=0; //en由高变低,产生下降沿,液晶执行命令
81 1 }
82
83
84 lcd_init()//***液晶初始化函数****
85 {
86 1 write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
87 1 write_1602com(0x0c);//开显示不显示光标
88 1 write_1602com(0x06);//整屏不移动,光标自动右移
89 1 write_1602com(0x01);//清显示
90 1
91 1 write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示
92 1 for(a=0;a<14;a++)
93 1 {
94 2 write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分
95 2 //delay(3);
96 2 }
97 1 write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示
98 1 for(a=0;a<8;a++)
99 1 {
100 2 write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
101 2 //delay(3);
102 2 }
103 1
104 1 }
105
106 /*********************over***********************/
107
108
109 /***************DS1302有关子函数********************/
110
111 void write_byte(uchar dat)//写一个字节
112 {
113 1 ACC=dat;
114 1 RST=1;
115 1 for(a=8;a>0;a--)
116 1 {
117 2 IO=ACC0;
C51 COMPILER V8.02 LCD1602 07/12/2011 20:57:59 PAGE 3
118 2 SCLK=0;
119 2 SCLK=1;
120 2 ACC=ACC>>1;
121 2 }
122 1 }
123 uchar read_byte()//读一个字节
124 {
125 1 RST=1;
126 1 for(a=8;a>0;a--)
127 1 {
128 2 ACC7=IO;
129 2 SCLK=1;
130 2 SCLK=0;
131 2 ACC=ACC>>1;
132 2
133 2 }
134 1 return (ACC);
135 1 }
136 //----------------------------------------
137 void write_1302(uchar add,uchar dat)//向1302芯片写函数,指定写入地址,数据
138 {
139 1
140 1 RST=0;
141 1 SCLK=0;
142 1 RST=1;
143 1 write_byte(add);
144 1 write_byte(dat);
145 1 SCLK=1;
146 1 RST=0;
147 1 }
148 uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址
149 {
150 1 uchar temp;
151 1 RST=0;
152 1 SCLK=0;
153 1 RST=1;
154 1 write_byte(add);
155 1 temp=read_byte();
156 1 SCLK=1;
157 1 RST=0;
158 1 return(temp);
159 1 }
160 uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制
161 {
162 1 uchar Decimal;
163 1 Decimal=bcd>>4;
164 1 return(Decimal=Decimal*10+(bcd&=0x0F));
165 1 }
166 //--------------------------------------
167 void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4)
168 {
169 1 RST=0;
170 1 SCLK=0;
171 1
172 1 write_1302(0x8e,0x00); //允许写,禁止写保护
173 1 //write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00
174 1 //write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00
175 1 //write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12
176 1 //write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4
177 1 //write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07
178 1 //write_1302(0x88,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01
179 1 //write_1302(0x8c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10
C51 COMPILER V8.02 LCD1602 07/12/2011 20:57:59 PAGE 4
180 1 write_1302(0x8e,0x80); //打开写保护
181 1
182 1
183 1 }
184
185
186 //------------------------------------
187 //温度显示子函数
188 void write_temp(uchar add,uchar dat)//向LCD写温度数据,并指定显示位置
189 {
190 1 uchar gw,sw;
191 1 gw=dat%10;//取得个位数字
192 1 sw=dat/10;//取得十位数字
193 1 write_1602com(er+add);//er是头文件规定的值0x80+0x40
194 1 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
195 1 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
196 1 write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码
197 1 write_1602dat(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码
198 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -