📄 lcd1602.lst
字号:
C51 COMPILER V7.50 LCD1602 01/13/2009 21:19:07 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN lcd1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 ***************************************************************************
3 *
4 * (C) Copyright 2007,单片机初学者园地
5 * All Rights reserved.
6 *
7 *项目名称: 51单片机学习开发系统
8 *
9 *本文件名称:LCD1602.c
10 *
11 * 完成作者 : 单片机初学者 http://blog.ednchina.com/ahai0306/ qq:464976346
12 * 当前版本 : V1.0
13 * 完成日期 : 2007年4月20日
14 * 描 述 :
15 * 此程序实现,完成液晶部分,数码管显示,中断切换界面
16 * 同时还进行发光管指示,和蜂鸣器的响声,是一个比较综合的
17 * 程序,在以后的项目设计中,此程序是一个比较不错的范例!
18 ****************************************************************************
19 */
20
21
22 #include <reg52.h> //调用头文件(单片机内部的寄存器定义)
23 #include<intrins.h>
24
25 #define uchar unsigned char
26 #define uint unsigned int
27
28 /******本段为硬件I/O口定义********/
29 sbit LED0 = P0 ^ 0; //KEY和发光管复用,请将4个跳线插到KEY端
30 sbit LED1 = P0 ^ 1;
31 sbit LED2 = P0 ^ 2;
32 sbit LED3 = P0 ^ 3;
33 sbit DIG0 = P0 ^ 4; //数码管位0
34 sbit DIG1 = P0 ^ 5; //数码管位1
35
36 sbit BUZZ = P3 ^ 3; //蜂鸣器
37 sbit LCD_RS = P3^7 ;
38 sbit LCD_RW = P3^6 ;
39 sbit LCD_EN = P3^4 ;
40
41 #define LED_SEG P1 //数码管
42 #define LCD_DATA P2 //LCD
43 //#define LCD_BUSY 0x80 // 用于检测LCD的BUSY标识
44 sbit DQ = P3^5 ; //定义DS18B20端口DQ
45
46 bit presence ;
47
48 //数码管显示0~9,定义到代码段,和程序数据烧在FLASH中
49 code unsigned char DispBuf[10]= {0x3f,0x06,0x5b,0x4f,0x66,
50 0x6d,0x7d,0x07,0x7f,0x6f};
51
52 //函数声明
53 void disp_selec(unsigned char bit_selec,unsigned char seg);
54
55
C51 COMPILER V7.50 LCD1602 01/13/2009 21:19:07 PAGE 2
56 uchar code cdis1[ ] = {" DS18B20 OK "} ;
57 uchar code cdis2[ ] = {" TEMP: . C "} ;
58 uchar code cdis3[ ] = {" welcom! "} ;
59 uchar code cdis4[ ] = {" MCU-STUDY-BOARD"} ;
60
61 unsigned char data temp_data[2] = {0x00,0x00} ;
62 unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00} ;
63 unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
64 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
65 void beep();
66 unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
67
68 #define delayNOP(); {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
69
70 /**************************************************
71 ** 函数名称: dellay
72 ** 入口参数:h(unsigned int型)
73 ** 出口参数:无
74 ** 功能描述: 短暂延时,使用11.0592晶体,约0.01MS
75 ****************************************************/
76 void dellay(unsigned int h)
77 {
78 1 while(h--); //0.01MS
79 1 }
80
81 /*******************************************************************/
82 void delay1(int ms)
83 {
84 1 unsigned char y ;
85 1 while(ms--)
86 1 {
87 2 for(y = 0 ; y<250 ; y++)
88 2 {
89 3 _nop_() ;
90 3 _nop_() ;
91 3 _nop_() ;
92 3 _nop_() ;
93 3 }
94 2 }
95 1 }
96
97 /******************************************************************/
98 /*检查LCD忙状态 */
99 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
100 /******************************************************************/
101 bit lcd_busy()
102 {
103 1 bit result ;
104 1 LCD_RS = 0 ;
105 1 LCD_RW = 1 ;
106 1 LCD_EN = 1 ;
107 1 delayNOP() ;
108 1 result = (bit)(LCD_DATA&0x80) ;
109 1 LCD_EN = 0 ;
110 1 return(result) ;
111 1 }
112
113 /*写指令数据到LCD */
114 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
115 /*******************************************************************/
116 void lcd_wcmd(uchar cmd)
117 {
C51 COMPILER V7.50 LCD1602 01/13/2009 21:19:07 PAGE 3
118 1 while(lcd_busy()) ;
119 1 LCD_RS = 0 ;
120 1 LCD_RW = 0 ;
121 1 LCD_EN = 0 ;
122 1 _nop_() ;
123 1 _nop_() ;
124 1 LCD_DATA = cmd ;
125 1 delayNOP() ;
126 1 LCD_EN = 1 ;
127 1 delayNOP() ;
128 1 LCD_EN = 0 ;
129 1 }
130
131 /*******************************************************************/
132 /*写显示数据到LCD */
133 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
134 /*******************************************************************/
135 void lcd_wdat(uchar dat)
136 {
137 1 while(lcd_busy()) ;
138 1 LCD_RS = 1 ;
139 1 LCD_RW = 0 ;
140 1 LCD_EN = 0 ;
141 1 LCD_DATA = dat ;
142 1 delayNOP() ;
143 1 LCD_EN = 1 ;
144 1 delayNOP() ;
145 1 LCD_EN = 0 ;
146 1 }
147
148
149 /* LCD初始化设定 */
150 /*******************************************************************/
151 void lcd_init()
152 {
153 1 delay1(15) ;
154 1 lcd_wcmd(0x01) ; //清除LCD的显示内容
155 1 lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据
156 1 delay1(5) ;
157 1 lcd_wcmd(0x38) ;
158 1 delay1(5) ;
159 1 lcd_wcmd(0x38) ;
160 1 delay1(5) ;
161 1
162 1 lcd_wcmd(0x0c) ; //显示开,关光标
163 1 delay1(5) ;
164 1 lcd_wcmd(0x06) ; //移动光标
165 1 delay1(5) ;
166 1 lcd_wcmd(0x01) ; //清除LCD的显示内容
167 1 delay1(5) ;
168 1 }
169
170 /* 设定显示位置 */
171 /*******************************************************************/
172 void lcd_pos(uchar pos)
173 {
174 1 lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量
175 1 }
176
177 /*自定义字符写入CGRAM */
178 /*******************************************************************/
179 void writetab()
C51 COMPILER V7.50 LCD1602 01/13/2009 21:19:07 PAGE 4
180 {
181 1 unsigned char i ;
182 1 lcd_wcmd(0x40) ; //写CGRAM
183 1 for (i = 0 ; i< 8 ; i++)
184 1 lcd_wdat(mytab[ i ]) ;
185 1 }
186
187 /*us级延时函数 */
188 /*******************************************************************/
189
190 void Delay(unsigned int num)
191 {
192 1 while( --num ) ;
193 1 }
194
195 /*初始化ds1820 */
196 /*******************************************************************/
197 Init_DS18B20(void)
198 {
199 1 DQ = 1 ; //DQ复位
200 1 Delay(8) ; //稍做延时
201 1
202 1 DQ = 0 ; //单片机将DQ拉低
203 1 Delay(90) ; //精确延时 大于 480us
204 1
205 1 DQ = 1 ; //拉高总线
206 1 Delay(8) ;
207 1
208 1 presence = DQ ; //如果=0则初始化成功 =1则初始化失败
209 1 Delay(100) ;
210 1 DQ = 1 ;
211 1
212 1 return(presence) ; //返回信号,0=presence,1= no presence
213 1 }
214
215
216 /* 读一个字节 */
217 /*******************************************************************/
218 ReadOneChar(void)
219 {
220 1 unsigned char i = 0 ;
221 1 unsigned char dat = 0 ;
222 1
223 1 for (i = 8 ; i > 0 ; i--)
224 1 {
225 2 DQ = 0 ; // 给脉冲信号
226 2 dat >>= 1 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -