📄 lcd.lst
字号:
C51 COMPILER V7.09 LCD 09/23/2007 22:58:14 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN LCD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include"zimo.h"
2 #include <reg52.h> //头文件
3 //液晶信号控制引脚定义
4 sbit DI=P2^2; // 数据\指令 选择
5 sbit RW=P2^1; // 读\写 选择
6 sbit E=P2^0; // 读\写使能
7 sbit CS1=P2^4; // 片选1
8 sbit CS2=P2^3; // 片选2
9
10 //以下是外面是数组说明
11 extern unsigned char code ziku[];
12 extern uchar code picture[][64];
13 extern uchar code Hzk[][32];
14 unsigned int number=0,mstcnt=0;
15
16 //自己定义函数说明
17 void delay(uint ms);
18
19
20
21
22 //以下为基本操作程序
23 ////*******************************//
24 //液晶判忙函数********************//
25 //*******************************//
26 void checkstate() //判断液晶是否忙
27 {
28 1 unsigned char dat;
29 1 DI=0; //指令模式
30 1 RW=1; //读控制器
31 1 do
32 1 {
33 2 P1=0x00;
34 2 E=1;
35 2 dat=P1;
36 2 E=0;
37 2 dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
38 2 }while(!(dat==0x00));
39 1 }
40 //**********************************//
41 // I/O口向液晶控制器写命令函数*******//
42 //***********************************//
43 void writecommand(unsigned char command) //写命令
44 {
45 1 checkstate();
46 1 RW=0;
47 1 P1=command;
48 1 E=1; //要注意这个些数据或者命令写入液晶控制器都是下降延的
49 1 E=0;
50 1 }
51 //************************************************//
52 //******I/O口向液晶控制器写数据函数****//
53 //***********************************************//
54 void writedate(unsigned char date) //写数据
55 {
C51 COMPILER V7.09 LCD 09/23/2007 22:58:14 PAGE 2
56 1 checkstate();
57 1 DI=1; RW=0;
58 1 P1=date;
59 1 E=1; E=0;
60 1 }
61 //*********************************
62 //***清屏幕************
63 ///*******************************
64 void cleanscreen() //清屏
65 {
66 1 unsigned char page,i;
67 1 for(page=0xb8;page<0xc0;page++) //一共写8页
68 1 {
69 2 writecommand(page);
70 2 writecommand(0x40); //将控制器指针拉回到第0列
71 2 for(i=0;i<64;i++) //写64列数据,每列为一个字节
72 2 {writedate(0x00);//(8个位纵向组成一个页)
73 3 //delay(10);
74 3 }
75 2 }
76 1 }
77 //*************************//
78 //*****液晶片选函数******//
79 //***********************//
80 void choosescreen(unsigned char NO) //选择屏幕
81 {
82 1 switch (NO)
83 1 {
84 2 case 0: //选择2片(左右两片)
85 2 CS1=0;
86 2 CS2=0;
87 2 break;
88 2 case 1://选择左片液晶
89 2 CS1=0;
90 2 CS2=1;
91 2 break;
92 2 case 2:
93 2 CS1=1;//选择右片液晶
94 2 CS2=0;
95 2 break;
96 2 default:
97 2 break;
98 2 }
99 1 }
100
101 //*********************//
102 //******初始化函数**** //
103 //********************//
104 void lce_init(void)
105 {
106 1 writecommand(0xc0); //显示起始为0页
107 1 writecommand(0x3f); //开启液晶
108 1 }
109
110 //*************************************************//
111 //按照序号显示汉字程序
112 //count 为要显示的汉字的序号
113 //**按照数组中次序依次显示32个汉字。在两块液晶上面
114 //**************
115 void display(unsigned char count)
116 {
117 1 unsigned int i,m;
C51 COMPILER V7.09 LCD 09/23/2007 22:58:14 PAGE 3
118 1 choosescreen(1); //左块液晶
119 1 writecommand(0xb8); //页指针指向第0页
120 1 writecommand(0x40); //列指针指向第0列
121 1 for(i=0;i<count*16;i++)
122 1 {
123 2 if(i!=0&&i%16==0) //一个汉字在控制器缓寸上占据16*16空间
124 2 m++; //下个汉字
125 2 switch (i)
126 2 {
127 3 case 64: //这里有两块液晶公八页,这里是要确定下一个汉字到底在
128 3 //哪块液晶的哪一页起始,列都是从0开始所以写(0x40)
129 3 choosescreen(2);
130 3 writecommand(0xb8);
131 3 writecommand(0x40);
132 3 break;
133 3 case 128:
134 3 choosescreen(1);
135 3 writecommand(0xba);
136 3 writecommand(0x40);
137 3 break;
138 3 case 192:
139 3 choosescreen(2);
140 3 writecommand(0xba);
141 3 writecommand(0x40);
142 3 break;
143 3 case 256:
144 3 choosescreen(1);
145 3 writecommand(0xbc);
146 3 writecommand(0x40);
147 3 break;
148 3 case 320:
149 3 choosescreen(2);
150 3 writecommand(0xbc);
151 3 writecommand(0x40);
152 3 break;
153 3 case 384:
154 3 choosescreen(1);
155 3 writecommand(0xbe);
156 3 writecommand(0x40);
157 3 break;
158 3 case 448:
159 3 choosescreen(2);
160 3 writecommand(0xbe);
161 3 writecommand(0x40);
162 3 break;
163 3 default:
164 3 break;
165 3 }
166 2 writedate(*(ziku+i+m*16));//数组元素的访问的一种写法
167 2 //下面的语句等价的
168 2 //writedate(ziku[i+(m*16)]);
169 2 }
170 1 choosescreen(1);
171 1 writecommand(0xb9); //页指针指向下一页,送下半个汉字的字模数据
172 1 writecommand(0x40);//列归零
173 1 m=0;
174 1
175 1 for(i=0;i<count*16;i++)
176 1 {
177 2 if(i!=0&&i%16==0)
178 2 m++;
179 2 switch (i)
C51 COMPILER V7.09 LCD 09/23/2007 22:58:14 PAGE 4
180 2 {
181 3 case 64:
182 3 choosescreen(2);
183 3 writecommand(0xb9); //这段程序和上面那段类似就页加一就可以
184 3 writecommand(0x40);
185 3 break;
186 3 case 128:
187 3 choosescreen(1);
188 3 writecommand(0xbb);
189 3 writecommand(0x40);
190 3 break;
191 3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -