📄 lcd1602_8a.lst
字号:
10 =1 /*--------------------------------------------------------------*/
11 =1 //防止被重复定义
12 =1 #ifndef __LCD1602_8A_H__
13 =1 #define __LCD1602_8A_H__
14 =1 //所需头文件
15 =1 #include <intrins.h>
1 =2 /*--------------------------------------------------------------------------
2 =2 INTRINS.H
C51 COMPILER V7.06 LCD1602_8A 08/10/2008 09:52:05 PAGE 5
3 =2
4 =2 Intrinsic functions for C51.
5 =2 Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
6 =2 All rights reserved.
7 =2 --------------------------------------------------------------------------*/
8 =2
9 =2 #ifndef __INTRINS_H__
10 =2 #define __INTRINS_H__
11 =2
12 =2 extern void _nop_ (void);
13 =2 extern bit _testbit_ (bit);
14 =2 extern unsigned char _cror_ (unsigned char, unsigned char);
15 =2 extern unsigned int _iror_ (unsigned int, unsigned char);
16 =2 extern unsigned long _lror_ (unsigned long, unsigned char);
17 =2 extern unsigned char _crol_ (unsigned char, unsigned char);
18 =2 extern unsigned int _irol_ (unsigned int, unsigned char);
19 =2 extern unsigned long _lrol_ (unsigned long, unsigned char);
20 =2 extern unsigned char _chkfloat_(float);
21 =2
22 =2 #endif
23 =2
16 =1
17 =1
18 =1 /*--------------------------------------------------------------*/
19 =1 //LCD1602与单片机接口定义
20 =1 sfr LCD_IO = 0x80; //P0-0x80,P1-0x90,P2-0xA0,P3-0xB0;
21 =1 sbit LCD_RS = P2^0; //LCD数据/命令选择端(H/L)
22 =1 sbit LCD_RW = P2^1; //LCD 读/写 选择端(H/L)
23 =1 sbit LCD_EN = P2^2; //LCD使能控制端
24 =1 sbit LCD_BZ = LCD_IO^7; //LCD忙标志位
25 =1
26 =1
27 =1 /*--------------------------------------------------------------*/
28 =1 //函数声明
29 =1 void LCD_busy (void); //检测LCD是否忙
30 =1 void LCD_init (void); //LCD初始化
31 =1 void LCD_clr (void); //LCD清屏
32 =1 void LCD_cmd (unsigned char cmd); //写入指令
33 =1 void LCD_dat (unsigned char dat); //写入数据
34 =1 void LCD_pos (unsigned char x, unsigned char y); //显示定位
35 =1 void LCD_printc(unsigned char x, unsigned char y, unsigned char c); //定位输出字符
36 =1 void LCD_prints(unsigned char x, unsigned char y, unsigned char *s); //定位输出字符串
37 =1
38 =1
39 =1 /*--------------------------------------------------------------*/
40 =1 //检测LCD忙状态
41 =1 void LCD_busy(void)
42 =1 {
43 1 =1 do
44 1 =1 {
45 2 =1 LCD_EN = 0;
46 2 =1 LCD_RS = 0; //指令
47 2 =1 LCD_RW = 1; //读出
48 2 =1 LCD_IO = 0xff;
49 2 =1 LCD_EN = 1;
50 2 =1 _nop_(); //高电平读出 延迟时间1us
51 2 =1 }while(LCD_BZ); //LCD_BZ=1表示忙,LCD_BZ=0表示空闲
52 1 =1 LCD_EN = 0;
53 1 =1 }
54 =1
55 =1
56 =1 /*--------------------------------------------------------------*/
C51 COMPILER V7.06 LCD1602_8A 08/10/2008 09:52:05 PAGE 6
57 =1 //写入指令
58 =1 void LCD_cmd(unsigned char cmd)
59 =1 {
60 1 =1 LCD_busy(); //检测忙
61 1 =1 LCD_RS = 0; //指令
62 1 =1 LCD_RW = 0; //写入
63 1 =1 LCD_EN = 1;
64 1 =1 LCD_IO = cmd; //传指令
65 1 =1 LCD_EN = 0; //下降沿有效
66 1 =1 }
67 =1
68 =1
69 =1 /*--------------------------------------------------------------*/
70 =1 //写入数据
71 =1 void LCD_dat(unsigned char dat)
72 =1 {
73 1 =1 LCD_busy(); //检测忙
74 1 =1 LCD_RS = 1; //数据
75 1 =1 LCD_RW = 0; //写入
76 1 =1 LCD_EN = 1;
77 1 =1 LCD_IO = dat; //传数据
78 1 =1 LCD_EN = 0; //下降沿有效
79 1 =1 }
80 =1
81 =1
82 =1 /*--------------------------------------------------------------*/
83 =1 //显示定位
84 =1 void LCD_pos(unsigned char x, unsigned char y)
85 =1 {
86 1 =1 if(y) LCD_cmd(x|0xc0);//y=1第二行显示,y=0第一行显示 0<=x<16
87 1 =1 else LCD_cmd(x|0x80);//数据指针=80+地址码(00H~27H,40H~67H)
88 1 =1 }
89 =1
90 =1
91 =1 /*--------------------------------------------------------------*/
92 =1 //LCD清屏
93 =1 void LCD_clr(void)
94 =1 {
95 1 =1 LCD_cmd(0x01);
96 1 =1 }
97 =1
98 =1
99 =1 /*--------------------------------------------------------------*/
100 =1 //定位输出字符
101 =1 void LCD_printc(unsigned char x, unsigned char y, unsigned char c)
102 =1 {
103 1 =1 LCD_pos(x,y);
104 1 =1 LCD_dat(c);
105 1 =1 }
106 =1
107 =1
108 =1 /*--------------------------------------------------------------*/
109 =1 //定位输出字符串
110 =1 void LCD_prints(unsigned char x, unsigned char y, unsigned char *s)
111 =1 {
112 1 =1 LCD_pos(x,y);
113 1 =1 while(*s)
114 1 =1 {
115 2 =1 LCD_dat(*s);
116 2 =1 s++;
117 2 =1 }
118 1 =1 }
C51 COMPILER V7.06 LCD1602_8A 08/10/2008 09:52:05 PAGE 7
119 =1
120 =1
121 =1 /*--------------------------------------------------------------*/
122 =1 //LCD初始化
123 =1 void LCD_init(void)
124 =1 {
125 1 =1 LCD_cmd(0x38); //设置LCD为16X2显示,5X7点阵,八位数据接口
126 1 =1 LCD_cmd(0x06); //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
127 1 =1 LCD_cmd(0x0c); //LCD开显示及光标设置(光标不闪烁,不显示"_")
128 1 =1 LCD_cmd(0x01); //清屏
129 1 =1 }
130 =1
131 =1
132 =1 /*--------------------------------------------------------------*/
133 =1 #endif
134 =1
135 =1
136 =1
137 =1
138 =1
3
4
5 unsigned char code tab[]={" Hello! Welcome you to our shcool! Have a good time!"};
6
7
8 //延时500ms 函数定义
9 void delay500ms(void)
10 {
11 1 unsigned char i,j,k;
12 1 for(i=15;i>0;i--)
13 1 for(j=66;j>0;j--)
14 1 for(k=251;k>0;k--);
15 1 }
16
17
18 void main(void)
19 {
20 1 unsigned char *s=tab;
21 1 LCD_init();
22 1 while(1)
23 1 {
24 2 LCD_clr();
25 2 LCD_prints(5,0,"!*^ ^*!");
26 2 LCD_printc(8,0,'_');
27 2 LCD_prints(0,1,s++);
28 2 if(*s=='\0') s=tab;
29 2 delay500ms();
30 2 }
31 1 }
32
C51 COMPILER V7.06 LCD1602_8A 08/10/2008 09:52:05 PAGE 8
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION Com0020 (BEGIN)
0000 L?0033:
0000 7500FF R MOV s,#0FFH
0003 750000 R MOV s+01H,#HIGH tab
0006 750000 R MOV s+02H,#LOW tab
0009 22 RET
; FUNCTION Com0020 (END)
; FUNCTION LCD_busy (BEGIN)
; SOURCE LINE # 41
; SOURCE LINE # 42
0000 ?C0003:
; SOURCE LINE # 44
; SOURCE LINE # 45
0000 C2A2 CLR LCD_EN
; SOURCE LINE # 46
0002 C2A0 CLR LCD_RS
; SOURCE LINE # 47
0004 D2A1 SETB LCD_RW
; SOURCE LINE # 48
0006 7580FF MOV LCD_IO,#0FFH
; SOURCE LINE # 49
0009 D2A2 SETB LCD_EN
; SOURCE LINE # 50
000B 00 NOP
; SOURCE LINE # 51
000C 2087F1 JB LCD_BZ,?C0003
; SOURCE LINE # 52
000F C2A2 CLR LCD_EN
; SOURCE LINE # 53
0011 22 RET
; FUNCTION LCD_busy (END)
; FUNCTION _LCD_cmd (BEGIN)
; SOURCE LINE # 58
;---- Variable 'cmd' assigned to Register 'R7' ----
; SOURCE LINE # 59
; SOURCE LINE # 60
0000 120000 R LCALL LCD_busy
; SOURCE LINE # 61
0003 C2A0 CLR LCD_RS
; SOURCE LINE # 62
0005 C2A1 CLR LCD_RW
; SOURCE LINE # 63
0007 D2A2 SETB LCD_EN
; SOURCE LINE # 64
0009 8F80 MOV LCD_IO,R7
; SOURCE LINE # 65
000B C2A2 CLR LCD_EN
; SOURCE LINE # 66
000D 22 RET
; FUNCTION _LCD_cmd (END)
; FUNCTION _LCD_dat (BEGIN)
; SOURCE LINE # 71
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -