📄 lcd1602.lst
字号:
C51 COMPILER V8.02 LCD1602 09/14/2006 22:59:04 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN LCD1602.OBJ
COMPILER INVOKED BY: D:\Program-English\keil\C51\BIN\C51.EXE LCD1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //#include <iom8v.h>
2 //#include <macros.h>
3 #include "LCD1602.h"
4 /**********************************************************
5 光标命令
6 lcd_write_command(0x0e,0);//光标开
7 lcd_write_command(0x0d,0);//光标所在字符闪烁
8 lcd_write_command(0x0c,0); //光标关
9 lcd_write_command(0x07,0); //屏幕左移
10
11 **********************************************************/
12
13 /*------------------------------------液晶驱动函数-------------------------------------*/
14 void lcd_init_portDB(void)
15 {
16 1 lcd_data_port=0xff;
*** ERROR C202 IN LINE 16 OF LCD1602.C: 'PORTB': undefined identifier
17 1 lcd_data_ddr=0xff;
*** ERROR C202 IN LINE 17 OF LCD1602.C: 'DDRB': undefined identifier
18 1 lcd_control_port=0x07;
*** ERROR C202 IN LINE 18 OF LCD1602.C: 'PORTC': undefined identifier
19 1 lcd_control_ddr=0x07;
*** ERROR C202 IN LINE 19 OF LCD1602.C: 'DDRC': undefined identifier
20 1 }
21
22 //液晶初始化
23 void lcd_init(void)
24 {
25 1 delay_nms(15);
26 1 lcd_write_command(0x38,0);//显示模式设置三次(此时不管lcd空闲与否)
27 1 delay_nms(5);
28 1 lcd_write_command(0x38,0);
29 1 delay_nms(5);
30 1 lcd_write_command(0x38,0);
31 1 delay_nms(5);
32 1
33 1 lcd_write_command(0x38,1);//显示模式设置(从此之后均需lcd空闲)
34 1 lcd_write_command(0x08,1);//显示关闭
35 1 lcd_write_command(0x01,1);//显示清屏
36 1 lcd_write_command(0x06,1);//显示光标移动设置
37 1 lcd_write_command(0x0c,1);//显示开及光标设置
38 1 }
39
40 //写指令函数: E=高脉冲 RS=0 RW=0
41 void lcd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测L
-CD忙信号
42 {
43 1 if(wait_en)wait_enable();//若wait_en为1,则要检测LCD忙信号,等待其空闲
44 1 lcd_control_port&=~lcd_RS;//RS=0
*** ERROR C202 IN LINE 44 OF LCD1602.C: 'PORTC': undefined identifier
45 1 lcd_control_port&=~lcd_RW;//RW=0
*** ERROR C202 IN LINE 45 OF LCD1602.C: 'PORTC': undefined identifier
46 1 lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
*** ERROR C202 IN LINE 46 OF LCD1602.C: 'PORTC': undefined identifier
47 1 NOP();
C51 COMPILER V8.02 LCD1602 09/14/2006 22:59:04 PAGE 2
48 1 lcd_control_port|=lcd_EN;//E=1
49 1 lcd_data_port=command;
50 1 lcd_control_port&=~lcd_EN;//重设E=0
51 1 }
52
53 //写数据函数: E =高脉冲 RS=1 RW=0
54 void lcd_write_data(unsigned char char_data)
55 {
56 1 wait_enable();//等待LCD空闲
57 1 lcd_control_port|=lcd_RS;//RS=1
58 1 lcd_control_port&=~lcd_RW;//RW=0
59 1 lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
60 1 NOP();
61 1 lcd_control_port|=lcd_EN;//E=1
62 1 lcd_data_port=char_data;
63 1 lcd_control_port&=~lcd_EN;//重设E=0
64 1 }
65
66 //正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。
67 //检测忙信号,等待LCD空闲函数
68 void wait_enable(void)
69 {
70 1 lcd_busy_ddr&=~busy;//设置busy口为输入
71 1 lcd_control_port&=~lcd_RS;//RS=0
72 1 lcd_control_port|=lcd_RW;//RW=1
73 1 NOP();
74 1 lcd_control_port|=lcd_EN;//E=1
75 1 while(lcd_busy_pin&busy);//等待LCD_DB7为0
76 1 lcd_control_port&=~lcd_EN;//重设E=0
77 1 lcd_busy_ddr|=busy;//设置busy口为输出
78 1 }
79 /**LCD_set_xy:设置LCD显示的起始位置输入参数:x、y :
80 显示字符串的位置,X:0-15,Y:0-1
81 LCD第一行显示寄存器地址:0X80-0X8F
82 LCD第一行显示寄存器地址:0XC0-0XCF ***/
83 void lcd_set_xy( unsigned char x, unsigned char y )
84 {
85 1 unsigned char address;
86 1 if (y == 0)
87 1 address = 0x80 + x;
88 1 else
89 1 address = 0xc0 + x;
90 1 lcd_write_command(address,1);//一定需要检查忙信号,所以为1
91 1 }
92 //显示一个字符函数
93 void display_a_char(unsigned char x,unsigned char y,unsigned char char_data)//char_data为要显示的字符
94 {
95 1 lcd_set_xy(x,y);
96 1 lcd_write_data(char_data);
97 1 }
98
99 //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符
100 //显示一行连续字符串函数
101
102 void display_a_string(unsigned char x,unsigned char y,unsigned char *ptr)
103 {
104 1 //ptr:指向无符号字符型变量的指针变量,指针也就是地址,指字符串数组的首指针
105 1 lcd_set_xy(x,y);
106 1 while(*ptr)//当ptr='\0'(空指针null)跳出循环
107 1 {
108 2 lcd_write_data(*ptr);//*ptr,指向该地址的内容
109 2 ptr++;
C51 COMPILER V8.02 LCD1602 09/14/2006 22:59:04 PAGE 3
110 2 }
111 1 }
112 /*********************流动字幕***********************/
113 void display_a_fluid(unsigned char x,unsigned char y,unsigned char *ptr)
114 { lcd_write_command(0x07,1);//流动字幕
115 1 lcd_set_xy(x,y);
116 1 while(*ptr)
117 1 {
118 2 lcd_write_data(*ptr);
119 2 delay_nms(200);
120 2 ptr++;
121 2 }
122 1 }
123
124
125 void delay_1ms(void ) //延时1ms
126 {
127 1 unsigned int i ;
128 1 unsigned char xtal;
129 1 xtal=4;
130 1 for (i=1;i<(xtal*143-2);i++)
131 1 {
132 2 ;
133 2 }
134 1 }
135
136 void delay_nms(unsigned int n) //延时nms
137 {
138 1 unsigned int i=0 ;
139 1 for(i=0;i<n;i++)
140 1 {
141 2 delay_1ms();
142 2 }
143 1 }
144 void keyboard(void)
145 {
146 1 int i;
147 1 while (1)
148 1 {
149 2 i=~PIND;
150 2 i&=0xf0;
151 2 if(i==speedadd) {
152 3 if(setspeed==maxspeed)setspeed=minspeed;
153 3 else setspeed++;
154 3 conver_BCD(1000,str10);
155 3 lcd_write_command(0x01,0);
156 3 lcd_display_full();
157 3 }
158 2 if(i==speeddec){
159 3 if(setspeed==minspeed)setspeed=maxspeed;
160 3 else setspeed--;
161 3 lcd_write_command(0x01,0);
162 3 I++;
163 3 if (I>=3)I=0;
164 3 lcd_display_full();
165 3 }
166 2 if(i==speedok) {
167 3 break;
168 3
169 3 }
170 2 delay_nms(100);
171 2
C51 COMPILER V8.02 LCD1602 09/14/2006 22:59:04 PAGE 4
172 2 }
173 1 }
174 ///////////////////////////////////////////////////////////////
175 void display_a_fluid(unsigned char x,unsigned char y,unsigned char *ptr)
176 { lcd_write_command(0x07,1);//流动字幕
177 1 lcd_set_xy(x,y);
178 1 while(*ptr)
179 1 {
180 2 lcd_write_data(*ptr);
181 2 delay_nms(200);
182 2 ptr++;
183 2 }
184 1 }
185 //------------------------------------------------------
186 void copy (unsigned char x[],unsigned char *y,unsigned char i)
187 {
188 1 while (*y){x[i]=*y; *y++; i++;}
189 1 }
190 //------------------------------------------------------------
191 void lcd_display_full(void)
192 {
193 1 if(I==0){lcd_display(str1,str10,str2,str20);}
194 1 if(I==1){lcd_display(str2,str20,str3,str30);}
195 1 if(I==2){lcd_display(str3,str30,str4,str40);}
196 1 if(I==3){lcd_display(str4,str40,str1,str10);}
197 1 }
198 //------------------------------------------------------------------------
199 void lcd_display(unsigned char x0[],unsigned char x1[],unsigned char y0[],unsigned char y1[])
200 {
201 1 display_a_string(0,0,x0);
202 1 display_a_string(7,0,x1);
203 1 display_a_string(0,1,y0);
204 1 display_a_string(7,1,y1);
205 1 }
206 void conver_BCD(int x,unsigned char string[])
207 {int i;
208 1 for(i=0;i<4;i++)
209 1 {string[i]=(char)x%10;x/=10;}
210 1 }
211
212 /***********这些是1602的流动字幕的一些程序
213 display_a_fluid(16,0,welcome);
214 lcd_write_command(0x01,1);//显示清屏
215 lcd_write_command(0x06,1);//显示光标移动设置 */
216
217
218 /*lcd_write_command(0x07,1); //屏幕右移,内容左移
219 lcd_set_xy(8,0);
220 for(i=0;welcome[i]!='\0';i++)
221 {
222 lcd_write_data(welcome[i]);
223 delay_nms(200);
224 }
225 lcd_write_command(0x01,1);//显示清屏
226 lcd_write_command(0x06,1);//显示光标移动设置 */
227
228
229 /* 键盘判断
230 DDRD&=0X0F;
231 PORTD|=0xf0;
232 testkey=PIND;
233 testkey=~testkey;
C51 COMPILER V8.02 LCD1602 09/14/2006 22:59:04 PAGE 5
234 testkey&=0xf0; */
C51 COMPILATION COMPLETE. 0 WARNING(S), 7 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -