📄 ca12864.lst
字号:
C51 COMPILER V8.05a CA12864 02/09/2009 14:06:55 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE CA12864
OBJECT MODULE PLACED IN CA12864.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CA12864.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*********************************************************************/
2 //程序名称:12864串行操作关键函数
3 //编写人:王兵洋
4 //版权声明:欢迎转载,注明原作者即可
5 /*****************本程序提供的外部函数:
6 extern void Lcd_Write_Str(UCHAR l_line,UCHAR l_site,UCHAR * words);//写字符串
7 extern void Lcd_Init(void);//初始化
8 extern void Lcd_Write_Bmp(unsigned char *puts); //写图片
9 void Lcd_Clr_Scr(void); //清屏
10 /*********************************************************************/
11 #include <reg52.h>
12
13 //数据类型定义
14 typedef unsigned char UCHAR;
15 typedef unsigned int UINT;
16
17 //功能管脚定义
18 sbit LCM_CS = P1^0; //片选
19 sbit LCM_SCK = P1^1; //时钟
20 sbit LCM_SID = P1^2; //数据
21 sbit LCM_BLK = P1^3; //背光
22 sbit LCM_RST = P1^4; //复位
23 //--------------------------------------------------------------------
24 //功能说明:串行发送一个字节
25 //输入参数:欲发送字节,输出参数:无
26 void Send_Byte(UCHAR lcd_byte)
27 {
28 1 register UCHAR i;
29 1 LCM_SCK = 0;
30 1 for(i=0;i<8;i++)
31 1 {
32 2 lcd_byte <<= 1; //左移一位
33 2 LCM_SID = CY; //移出的位给SID
34 2 LCM_SCK = 1;
35 2 LCM_SCK = 0;
36 2 }
37 1 }
38 //-------------------------------------------------------------------
39 //功能说明:串行读取一个命令字节
40 //输入参数:无,输出参数:读取的字节数据
41 UCHAR Lcd_Read_Cmd(void)
42 {
43 1 register UCHAR i;
44 1 register UCHAR temp;
45 1 LCM_CS = 0;
46 1 LCM_SID = 0;
47 1 LCM_SCK = 0;
48 1 LCM_CS = 1;
49 1 Send_Byte(0xfc);//首先发送读命令
50 1 //11111,RW(1),RS(0),0
51 1 temp = 0;
52 1 for (i=0;i<8;i++)
53 1 {
54 2 LCM_SCK = 1;
55 2 temp <<=1;
C51 COMPILER V8.05a CA12864 02/09/2009 14:06:55 PAGE 2
56 2 temp |= LCM_SID;
57 2 LCM_SCK = 0;
58 2 } //读出高四位
59 1 temp >>= 4;
60 1 for (i=0;i<4;i++)
61 1 {
62 2 LCM_SCK = 1;
63 2 temp <<=1;
64 2 temp |= LCM_SID;
65 2 LCM_SCK = 0;
66 2 } //读出第四位
67 1 for (i=0;i<4;i++)
68 1 {
69 2 LCM_SCK = 1;
70 2 LCM_SCK = 0;
71 2 }
72 1 LCM_CS = 0;
73 1 LCM_SID = 0;
74 1 LCM_SCK = 0;
75 1 return temp;
76 1 }
77 //--------------------------------------------------------------------
78 //功能说明:串行写入一个字节
79 //输入参数:lcd_data-欲写入字节,cmd_data-数据/命令选择位
80 //输出参数:无
81 void Lcd_Write_Byte(UCHAR lcd_data,bit cmd_data)
82 {
83 1 UCHAR lcdopt;
84 1 register UCHAR temp;
85 1 EA = 0; //禁用所有中断
86 1 lcdopt = 0;
87 1 do
88 1 {
89 2 lcdopt = Lcd_Read_Cmd();
90 2 }
91 1 while (lcdopt&0x80);
92 1
93 1 LCM_CS = 0;
94 1 LCM_SID = 0;
95 1 LCM_SCK = 0;
96 1 LCM_CS = 1;
97 1
98 1 // 1111 1 RW RS 0
99 1 //RW为0,选择写;RS为1,选择数据;RS为0,选择指令
100 1 if(cmd_data==1)
101 1 Send_Byte(0xfa);//发送数据
102 1 else
103 1 Send_Byte(0xf8);//发送指令
104 1
105 1 temp = lcd_data&0xf0;
106 1 Send_Byte(temp); //传输高四位
107 1 temp = (lcd_data<<4)&0xf0;
108 1 Send_Byte(temp); //传输低四位
109 1
110 1 LCM_CS = 0;
111 1 LCM_SID = 0;
112 1 LCM_SCK = 0;
113 1 EA=1; //恢复中断
114 1 }
115 //--------------------------------------------------------------------
116 //功能说明:写入一个命令
117 //输入参数:写入命令字节,输出参数:无
C51 COMPILER V8.05a CA12864 02/09/2009 14:06:55 PAGE 3
118 void Lcd_Write_Cmd(UCHAR lcd_data)
119 {
120 1 Lcd_Write_Byte(lcd_data,0);
121 1 }
122 //--------------------------------------------------------------------
123 //功能说明:写入一个数据
124 //输入参数:欲写入数据,输出参数:无
125 void Lcd_Write_Data(UCHAR lcd_data)
126 {
127 1 Lcd_Write_Byte(lcd_data,1);
128 1 }
129 //--------------------------------------------------------------------
130 //功能说明:12864初始化
131 //输入输出参数:无
132 void Lcd_Init(void)
133 {
134 1 LCM_BLK = 0;//打开背光
135 1 Lcd_Write_Cmd(0x30); //基本命令集
136 1 Lcd_Write_Cmd(0x30);
137 1 Lcd_Write_Cmd(0x0C); //显示ON,游标OFF,游标位反白OFF
138 1 Lcd_Write_Cmd(0x06); //写入时,游标右移动
139 1 Lcd_Write_Cmd(0x01); //清除显示
140 1 //Os_Wait2(K_TMO,1);
141 1 Lcd_Write_Cmd(0x02); //位址归位
142 1 Lcd_Write_Cmd(0x06); //写入时,游标右移动
143 1 //Os_Wait2(K_TMO,1); //根据所用单片机晶振加入等待
144 1 }
145 //--------------------------------------------------------------------
146 //功能说明:写入字符串
147 //输入参数:l_line:行0-3; l_site:列 0-7; words:中英字符
148 //输出参数:无
149 void Lcd_Write_Str(UCHAR l_line,UCHAR l_site,UCHAR * words)
150 {
151 1 UCHAR c;
152 1 c = 0;
153 1 l_site = l_site % 8; //使列在0-7范围
154 1 if(l_line>1) //若行=2,3
155 1 {
156 2 l_line = l_line % 2; //2行变0行,3行变1行
157 2 l_site = l_site + 8; //列加8
158 2 }
159 1 l_site = (l_line<<4) + l_site; //行*16+列
160 1 l_site = (l_site&0x3f)|0x80;
161 1 Lcd_Write_Cmd(l_site); //DDRAM地址
162 1
163 1 while(*words != 0) //写字符
164 1 {
165 2 UCHAR tempdata;
166 2 tempdata = *words;
167 2 Lcd_Write_Data(tempdata);
168 2 words++;
169 2 l_site++;
170 2 c++;
171 2 }
172 1 if (c%2) //写完数据,若最后一个字符列号是奇数则补空格
173 1 {
174 2 Lcd_Write_Data(0x20);
175 2 }
176 1 }
177 //--------------------------------------------------------------------
178 //功能说明:写入一副图像
179 //输入参数:puts——图像数据起点
C51 COMPILER V8.05a CA12864 02/09/2009 14:06:55 PAGE 4
180 //图像数据格式要求:图片尺寸:128*64,横向取模左高位,数据排列:从左到右从上到下
181 //输出参数:无
182 void Lcd_Write_Bmp(unsigned char *puts)
183 {
184 1 unsigned int x=0;
185 1 unsigned char i,j;
186 1 Lcd_Write_Cmd(0x34);
187 1 Lcd_Write_Cmd(0x34); //8Bit扩充指令集,绘图OFF,要写两次
188 1 for(i=0;i<32;i++) //12864实际为256x32
189 1 {
190 2 Lcd_Write_Cmd(i|0x80); //行位置
191 2 Lcd_Write_Cmd(0x80); //列位置
192 2 for(j=0;j<16;j++) //先写上半帧//再写下半帧
193 2 { //列位置每行自动增加
194 3 Lcd_Write_Data(puts[x]);
195 3 x++;
196 3 }
197 2 x-=16;
198 2 for(j=0;j<16;j++) //先写上半帧//再写下半帧
199 2 { //列位置每行自动增加
200 3 Lcd_Write_Data(puts[x+0x200]);
201 3 x++;
202 3 }
203 2 }
204 1 Lcd_Write_Cmd(0x36);
205 1 Lcd_Write_Cmd(0x36); //绘图ON,基本指令集里面36H不能开绘图
206 1 Lcd_Write_Cmd(0x30);
207 1 Lcd_Write_Cmd(0x30); //恢复基本指令集
208 1 }
209 //--------------------------------------------------------------------
210 //功能说明:清屏
211 //输入输出参数:无
212 void Lcd_Clr_Scr(void)
213 {
214 1 Lcd_Write_Cmd(0x01); //清屏
215 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 423 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 8
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -