?? lcd1602.lst
字號:
C51 COMPILER V8.02 LCD1602 09/13/2007 16:35:02 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN Lcd1602.OBJ
COMPILER INVOKED BY: d:\Keil3\C51\BIN\C51.EXE Lcd1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #define Lcd1602
2 #include <Lcd1602.h>
3
4 void Lcd1602_Ini(void)
5 {
6 1
7 1 Lcd1602_Write_Command(0x38);
8 1 Lcd1602_Write_Command(0x0f);//開顯示,不顯示光標
9 1 Lcd1602_Write_Command(0x01);//顯示清屏。
10 1 Lcd1602_Write_Command(0x06);//顯示光標自動右移,整屏不移動。
11 1 Lcd1602_Write_Command(0x80);//將數據指針設置到第一行的第一個字符。
12 1 Lcd1602_Write_Command(0x02);
13 1 Lcd1602_Write_Command(0x0f);//開顯示,不顯示光標
14 1 Lcd1602_Write_Command(0x80);
15 1 }
16
17 //===========================
18 //LCD狀態檢測 該函數有改動?????
19 //===========================
20 void Lcd1602_Check_Busy(void)
21 {
22 1 unsigned char bf,temp;
23 1
24 1 Contro_Port=0x02; //RS=0,RW=1
25 1 delay(1,10);
26 1
27 1 temp=Data_Port; // 是否要打開LCD使能信號E????
28 1 bf = temp&0x80 ; //篩選最高位的標志位
29 1
30 1 while(bf==1);
31 1 }
32
33
34 //*********************************************
35 //以下幾個函數為支持LCD數據傳送和控制的底層函數
36 //*********************************************
37
38 //===========================
39 //寫一個命令字節
40 //===========================
41 void Lcd1602_Write_Command(unsigned char Command_Code) reentrant // 為了解決可重入函數,需加上reentrant
42 {
43 1
44 1 Lcd1602_Check_Busy();
45 1
46 1 Contro_Port=0x00; //RS=0,RW=0
47 1 Data_Port=Command_Code;
48 1
49 1 delay(10,10);
50 1 Contro_Port |=0x04; //EN=1 把Contro_Port.2 置1
51 1 delay(10,10); // 延時產生一個脈沖
52 1 Contro_Port &=~0x04; //EN=0 把Contro_Port.2 置0
53 1 Contro_Port =0xef;
54 1 }
55
C51 COMPILER V8.02 LCD1602 09/13/2007 16:35:02 PAGE 2
56
57 //===========================
58 //寫一個字節數據 該函數中 Contro_Port |=0x04; 有改動?????
59 //===========================
60 void Lcd1602_Write_Data(unsigned char Data)
61 {
62 1
63 1 Lcd1602_Check_Busy();
64 1
65 1 Contro_Port=0x01; //RS=1,RW=0
66 1 Data_Port=Data;
67 1
68 1 delay(10,10);
69 1 Contro_Port |=0x04; //EN=1 把Contro_Port.2 置1
70 1 delay(10,10); // 延時產生一個脈沖
71 1 Contro_Port &=~0x04; //EN=0 把Contro_Port.2 置0
72 1 Contro_Port =0xef;
73 1 }
74
75
76
77 //===========================================
78 //寫字符串到LCD,如果一行寫不下,則寫到下一行,
79 //如果一屏寫不下,則只寫一屏
80 //row的值從1-2,column的值從1-16,不進行值的
81 //有效性檢查,有調用者自己保證
82 //===========================================
83
84 void Lcd1602_Write_String(unsigned char row_str,unsigned char column_str,unsigned char *dis_buffer) reent
-rant
85 {
86 1 unsigned char i=0;
87 1 row=row_str; column=column_str;
88 1
89 1 switch(row)//這種結構保持以后升級到多行顯示液晶
90 1 {
91 2 case 1:Lcd1602_Write_Command(0x80+column-1);break; //將數據地址指針定位到第一行
92 2 case 2:Lcd1602_Write_Command(0x80+0x40+column-1);break; //將數據地址指針定位到第二行
93 2 default: break;
94 2 }
95 1 while(dis_buffer[i]!='\0')
96 1 {
97 2 Lcd1602_Write_Data(dis_buffer[i]);
98 2 i++;
99 2 if(++column==17)
100 2 {
101 3 column=1;
102 3 if(++row==3)
103 3 return;
104 3 else
105 3 {
106 4 switch(row)//這種結構保持以后升級到多行顯示液晶
107 4 {
108 5 case 1:Lcd1602_Write_Command(0x80);break;
109 5 case 2:Lcd1602_Write_Command(0x80+0x40);break;//重新調整數據地址指針
110 5 default:break;
111 5 }
112 4 }
113 3 }
114 2 }
115 1 }
116
C51 COMPILER V8.02 LCD1602 09/13/2007 16:35:02 PAGE 3
117 void Lcd1602_Write_char(unsigned char i)
118 {
119 1
120 1 if(i==0)return;
121 1 switch(row) //這種結構保持以后升級到多行顯示液晶
122 1 {
123 2 case 1:Lcd1602_Write_Command(0x80+column-1);break; //將數據地址指針定位到第一行
124 2 case 2:Lcd1602_Write_Command(0x80+0x40+column-1);break; //將數據地址指針定位到第二行
125 2 default:break;
126 2 }
127 1
128 1 Lcd1602_Write_Data(i);
129 1
130 1 if(++column==17)
131 1 {
132 2 column=1;
133 2 if(++row==3)
134 2 row=1;
135 2 }
136 1 }
137
138 void delay(uchar t1,t2)
139 {
140 1 uchar i,j;
141 1 for(i=0;i<t1;i++)
142 1 for(j=0;j<t2;j++);
143 1
144 1 }
145
146 //==========================================
147 //清除指定的行,光標返回最左邊第一個字符位置
148 //==========================================
149 void Lcd1602_Clear_Line(unsigned char line)
150 {
151 1 Lcd1602_Write_String(line,1," ");
152 1
153 1 switch(line)// 將數據地址指針返回到起始位置 這種結構保持以后升級到多行顯示液晶
154 1 {
155 2 case 1:Lcd1602_Write_Command(0x80);break; //將數據地址指針定位到第一行
156 2 case 2:Lcd1602_Write_Command(0x80+0x40);break; //將數據地址指針定位到第二行
157 2 default: break;
158 2 }
159 1 }
160 /*
161 void Dis_decode_data(uint decode_data )
162 {
163 uchar k[5],i;
164
165 k[0]=(uchar)(decode_data/10000);
166 k[1]=(uchar)((decode_data-k[0]*10000)/1000);
167 k[2]=(uchar)((decode_data-k[0]*10000-k[1]*1000)/100);
168 k[3]=(uchar)((decode_data-k[0]*10000-k[1]*1000-k[2]*100)/10);
169 k[4]=(uchar)((decode_data-k[0]*10000-k[1]*1000-k[2]*100)-k[3]*10/1);
170
171 for(i=0;i<5;i++)
172 { Lcd1602_Write_char(k[i]+'0');}
173 } */
174
175 /*
176 void Lcd1602_Clear_All(void)
177 {
178 Lcd1602_Write_Command(0x01);//顯示清屏。
C51 COMPILER V8.02 LCD1602 09/13/2007 16:35:02 PAGE 4
179 Lcd1602_Write_Command(0x80);//將數據指針設置到第一行的第一個字符。
180 }
181
182
183 //==================================================
184 //清除指定的位置的字符,光標返回最左邊第一個字符位置
185 //==================================================
186 void Lcd1602_Clear_Char(unsigned char row,unsigned char column)
187 {
188 Lcd1602_Write_String(row,column,"");
189 } */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 393 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -