📄 液晶.lst
字号:
C51 COMPILER V7.06 襙__ 08/29/2007 20:58:07 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 襙__
OBJECT MODULE PLACED IN 液晶.OBJ
COMPILER INVOKED BY: E:\Keil\C51\BIN\C51.EXE 液晶.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include "液晶.H"
2
3
4
5 ///////////////////////////////////////////////////////////////////////////////////////
6 //////////////////////////////////////函数调试区///////////////////////////////////////
7 ///////////////////////////////////////////////////////////////////////////////////////
8 void Tint0(void) interrupt 1
9 {
10 1 unsigned char z,bufXY;
11 1 TL0=0;
12 1 TH0=220;
13 1
14 1 if(newCount!=0)//液晶需要刷新 改变if else的顺序来改变优先级
15 1 {
16 2 newCount--;
17 2 bufXY=nowXY&0x38;
18 2 for(z=bufXY;; )
19 2 {
20 3 if(CHnew[z>>3]!=0) break;
21 3 z+=8;
22 3 if((z&0x38)==bufXY) break;
23 3 }
24 2 if(CHnew[z>>3]!=0)//确实有更新
25 2 {
26 3 bufXY=nowXY&0x3F;
27 3
28 3 if(nowXY<(z&0x38)) nowXY=(z&0x38);
29 3 else nowXY&=0x3F;
30 3 for( ; ; )
31 3 {
32 4 z=nowXY&0x07;
33 4 if( (CHnew[nowXY>>3]>>z)&0x01 )//CHbuf[nowXY]是新写入的
34 4 {
35 5 if((nowXY==bufXY)&&(((nowXY&0x0F)!=0)||(RS==0)))//上次才写了,可以直接写
36 5 {
37 6 ChickOK();
38 6 RW=0; E=1; RS=1; P74OUT=0x0C; P5=CHbuf[nowXY]; E=0;
39 6 CHnew[nowXY>>3]&=(~(0x01<<z));//清除标志位
40 6 nowXY++;
41 6 }
42 5 else//要移动地址
43 5 {
44 6 newCount++;
45 6 ChickOK();
46 6 RS=0; RW=0; P74OUT=0x0C; z=nowXY>>1;
47 6 if(z<=7) P5=z+0x80;
48 6 else if(z<=15) P5=z+0x88;
49 6 else if(z<=23) P5=z+0x78;
50 6 else P5=z+0x80;
51 6 E=1; E=0;
52 6
53 6 if(nowXY&0x01)//临时标志 奇数地址的特殊需要
54 6 {
55 7 nowXY--;
C51 COMPILER V7.06 襙__ 08/29/2007 20:58:07 PAGE 2
56 7 CHnew[nowXY>>3]|=(0x01<<(nowXY&0x07));
57 7 newCount++;
58 7 }
59 6 }
60 5 break;
61 5 }
62 4 nowXY++;
63 4 nowXY&=0x3F;
64 4 if(nowXY==bufXY) break;
65 4 }
66 3 }
67 2 else
68 2 {
69 3 for(z=0;z<8&&(CHnew[z]==0);z++);
70 3 if(z==8) newCount=0;
71 3 }
72 2 }
73 1 else if(markXY<64)
74 1 {
75 2 nowXY=markXY; markXY&=0x3F; markXY>>=1;
76 2 ChickOK();
77 2 RS=0; RW=0; P74OUT=0x0C;
78 2 if(markXY<=7) P5=markXY+0x80;
79 2 else if(markXY<=15) P5=markXY+0x88;
80 2 else if(markXY<=23) P5=markXY+0x78;
81 2 else P5=markXY+0x80;
82 2 E=1; E=0;
83 2 markXY<<=1;
84 2 }
85 1 else
86 1 {
87 2 }
88 1 }
89
90
91 void P7int(void) interrupt 19
92 {
93 1 P3IF&=0x7F;//清中断
94 1 }
95
96 void SAd(unsigned char adress)//直接写屏地址设置
97 {
98 1 P74OUT=0x00;
99 1 E=1; RS=0; RW=1;
100 1 do {E=0; E=1; P5=0xFF; }
101 1 while(P5&0x80);
102 1 RS=0; RW=0; E=1; P74OUT=0x0C; P5=adress; E=0;
103 1 }
104
105 void OutALL()//直接写屏
106 {
107 1 unsigned char i;
108 1
109 1 TR0=0;
110 1 for(i=0;i<8;i++) CHnew[i]=0;
111 1 nowXY=0; newCount=0;
112 1
113 1 SAd(0x80);
114 1 for(i=0;i<16;i++)
115 1 {
116 2 ChickOK(); RS=1; RW=0; E=1; P74OUT=0x0C; P5=CHbuf[i]; E=0;
117 2 }
C51 COMPILER V7.06 襙__ 08/29/2007 20:58:07 PAGE 3
118 1 SAd(0x90);
119 1 for(;i<32;i++)
120 1 {
121 2 ChickOK(); RS=1; RW=0; E=1; P74OUT=0x0C; P5=CHbuf[i]; E=0;
122 2 }
123 1 SAd(0x88);
124 1 for(;i<48;i++)
125 1 {
126 2 ChickOK(); RS=1; RW=0; E=1; P74OUT=0x0C; P5=CHbuf[i]; E=0;
127 2 }
128 1 SAd(0x98);
129 1 for(;i<64;i++)
130 1 {
131 2 ChickOK(); RS=1; RW=0; E=1; P74OUT=0x0C; P5=CHbuf[i]; E=0;
132 2 }
133 1 if(markXY<64)
134 1 {
135 2 nowXY=markXY; markXY&=0x3F; markXY>>=1;
136 2 ChickOK();
137 2 RS=0; RW=0; P74OUT=0x0C;
138 2 if(markXY<=7) P5=markXY+0x80;
139 2 else if(markXY<=15) P5=markXY+0x88;
140 2 else if(markXY<=23) P5=markXY+0x78;
141 2 else P5=markXY+0x80;
142 2 E=1; E=0;
143 2 markXY<<=1;
144 2 }
145 1 TR0=1;
146 1
147 1 }
148
149
150
151
152
153 void StartFYD(void)
154 {
155 1 XBR2=0x40;
156 1 P3MDOUT|=0x27;
157 1 REST=0; Delay(10); REST=1; Delay(1000);
158 1 RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x34; E=0;//8位数据 基本指令
159 1 ChickOK(); RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x01; E=0;//清除显示
160 1 ChickOK(); RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x02; E=0;//地址归位
161 1
162 1 ChickOK(); RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x0C; E=0;//关游标 开显示 开反白
163 1
164 1 RS=1;
165 1 newCount=0;
166 1 for(XY=0;XY<64;XY++) CHbuf[XY]=' ';
167 1 for(XY=0;XY<8;XY++) CHnew[XY]=0;
168 1 XY=nowXY=markXY=0;
169 1
170 1 //T0设置
171 1 ET0=0;
172 1 TMOD=(TMOD&0xFD)|0x01;//16位定时器
173 1 CKCON|=0x04;//T0 工作在系统时钟
174 1 ET0=1;
175 1
176 1 TR0=1;
177 1 }
178
179 void Cover()//封面
C51 COMPILER V7.06 襙__ 08/29/2007 20:58:07 PAGE 4
180 {
181 1 SetAd(0x00);
182 1 OutS("┌──────┐");
183 1 OutS("│ 欢迎使用 │");
184 1 OutS("│ ¨……¨ │");
185 1 OutS("└──────┘");
186 1 }
187
188 void Clr()
189 {
190 1 unsigned char i;
191 1 newCount=0;
192 1 for(i=0;i<64;i++) CHbuf[i]=' ';
193 1 for(i=0;i<8;i++) CHnew[i]=0;
194 1 XY=nowXY=markXY=0;
195 1 i=RS; TR0=0; ChickOK(); RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x01; E=0; RS=i; TR0=1;//清除显示
196 1 }
197
198
199 void Print(unsigned long Data,unsigned char lena,unsigned char lenb)//显示数据 左边到右截取长度 右边截断
-长度
200 {
201 1 //显示位数设定
202 1 unsigned char i,k;
203 1 unsigned long E10,Lbuf;
204 1 unsigned char buf;
205 1
206 1 E10=1000000000L; Lbuf=Data;
207 1 k=0; i=0;
208 1 for( ; ; )
209 1 {
210 2 buf=(char)(Lbuf/E10)+'0';
211 2 Lbuf%=E10;
212 2 E10=E10/10;
213 2 if((i+k)<(10-lena)) {k++; continue; }
214 2
215 2 if((i==0)&&(buf=='0')&&(k!=9-lenb))
216 2 {
217 3 k++;
218 3 if(k>lenb) OutCH(' ');
219 3 }
220 2 else
221 2 {
222 3 i++;
223 3 OutCH(buf);
224 3 }
225 2 if((i+k)>=(10-lenb)) break;
226 2 }
227 1 return;
228 1 }
229
230
231 //////////////////////////////////////////////////////////////////////////////////////////////////////////
232 ////////////////////////////////////游标处理类////////////////////////////////////////////////////////////
233 //////////////////////////////////////////////////////////////////////////////////////////////////////////
234 void SetMark(unsigned char adress)//设定游标地址
235 {
236 1 markXY=adress;
237 1 }
238
239 void OpenMark()//打开游标
240 {
C51 COMPILER V7.06 襙__ 08/29/2007 20:58:07 PAGE 5
241 1 unsigned char i;
242 1 TR0=0; i=RS; ChickOK(); RS=0; RW=0; E=1; P74OUT=0x0C; P5=0x0F; E=0; ChickOK(); RS=i; TR0=1;// 游标 开显
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -