📄 display.lst
字号:
C51 COMPILER V7.09 DISPLAY 09/25/2008 11:56:15 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE DISPLAY
OBJECT MODULE PLACED IN .\output\bin\display.obj
COMPILER INVOKED BY: C:\Keil709\C51\BIN\C51.EXE menu\display.c LARGE BROWSE INCDIR(audio\;eeprom\;extendUART\;flash\;gps
-\;inter\;key\;mcu\;menu\;usb\;gprs\;main\;1wire\) DEBUG OBJECTEXTEND PRINT(.\output\display.lst) OBJECT(.\output\bin\dis
-play.obj)
line level source
1 /*********************************************
2 *LCD液晶显示程序
3 *支持松山的CA12864K的串行接口LCD
4 *此LCD支持8X4个汉字的显示。
5 **********************************************/
6
7
8 #include "w77e532.h"
9 #include <intrins.h>
10
11 #include "display.h"
12
13 #define LCD_WIDTH 16 /*液晶屏的列数*/
14 #define LCD_LINES 4 /*液晶屏的行数*/
15 #define LCD_SIZE 64 /*液晶屏的总字符数*/
16
17 /************************/
18 #define LCD_CMD_CLS 0x01 /*清屏命令*/
19 #define LCD_CMD_ZERO 0x02 /*显示位置清0*/
20 #define LCD_CMD_INC 0x06 /*指定计数器增加*/
21 #define LCD_CMD_NORMAL 0x0C /*打开显示,无光标,显示正常*/
22 #define LCD_CMD_REVERSE 0x0D /*打开显示,无光标,反显*/
23 #define LCD_CMD_BASE 0x10 /*采用基本指令集*/
24 #define LCD_CMD_CGRAM 0x40 /*设置自定义字库的位置*/
25 #define LCD_CMD_DDRAM 0x80 /*设置显示位置*/
26
27 unsigned char code bitmap_gps_up[16][2]={{0x00,0x00},{0x01,0x00},{0x01,0x04},{0x01,0x88},
28 {0x10,0x90},{0x30,0x20},{0x3f,0x80},{0x30,0xb0},
29 {0x18,0x9c},{0x18,0x80},{0x3e,0x80},{0x37,0xe0},
30 {0x21,0xc0},{0x38,0x00},{0x7e,0x00},{0x00,0x00}};
31 unsigned char code bitmap_gprs_up[16][2]={{0x00,0x00},{0x00,0x00},{0x20,0x80},{0x40,0x40},
32 {0x40,0x44},{0x51,0x44},{0x4a,0x44},{0x44,0x54},
33 {0x24,0x94},{0x04,0x14},{0x04,0x54},{0x04,0x54},
34 {0x04,0x54},{0x0e,0x54},{0x3f,0xd4},{0x00,0x00}};
35 unsigned char code bitmap_message[16][2]={{0x00,0x00},{0x00,0x00},{0x00,0x00},{0x7f,0xfc},
36 {0x60,0x0c},{0x50,0x14},{0x48,0x24},{0x44,0x44},
37 {0x4a,0xa4},{0x49,0x24},{0x50,0x14},{0x50,0x14},
38 {0x60,0x0c},{0x7f,0xfc},{0x00,0x00},{0x00,0x00}};
39 unsigned char code bitmap_warning[16][2]={{0x00,0x00},{0x00,0x00},{0x01,0x80},{0x03,0xc0},
40 {0x06,0x60},{0x0c,0x30},{0x18,0x18},{0x30,0x0c},
41 {0x60,0x06},{0x7f,0xfe},{0x0c,0x30},{0x04,0x20},
42 {0x06,0x60},{0x03,0xc0},{0x00,0x00},{0x00,0x00}};
43
44
45
46 #if 1
47 #define LCD_SDA P3_4
48 #define LCD_SCL P3_5
49
50 #define LCD_HIGH { \
51 LCD_SCL=0; /*SCL=0*/ \
52 _nop_();_nop_();_nop_(); \
53 LCD_SDA=1; /*SCL=0,SDA=1*/ \
C51 COMPILER V7.09 DISPLAY 09/25/2008 11:56:15 PAGE 2
54 LCD_SCL=1; /*SCL=1*/ \
55 _nop_();_nop_();_nop_(); \
56 }
57
58 #define LCD_LOW { \
59 LCD_SCL=0; /*SCL=0*/ \
60 _nop_();_nop_();_nop_(); \
61 LCD_SDA=0; /*SCL=0,SDA=0*/\
62 LCD_SCL=1; /*SCL=1*/ \
63 _nop_();_nop_();_nop_(); \
64 }
65
66 #else
#define LCD_HIGH { \
P4 &= ~0x01; /*SCL=0*/ \
_nop_();_nop_();_nop_(); \
P4 |= 0x02; /*SCL=0,SDA=1*/ \
P4 |= 0x01; /*SCL=1*/ \
_nop_();_nop_();_nop_(); \
}
#define LCD_LOW { \
P4 &= ~0x01; /*SCL=0*/ \
_nop_();_nop_();_nop_(); \
P4 &= ~0x03; /*SCL=0,SDA=0*/\
P4 |= 0x01; /*SCL=1*/ \
_nop_();_nop_();_nop_(); \
}
#endif
84
85
86 /********************************以上是与具体的液晶屏驱动程序*****************************/
87
88 void lcd_delay(void)
89 {
90 1 unsigned int loop;
91 1
92 1 loop = 10000;
93 1 while(loop) loop--;
94 1 }
95
96
97 void lcd_serial_send(unsigned char value)
98 {
99 1 unsigned char i;
100 1
101 1 for(i=0; i<8; i++)
102 1 {
103 2 if( value & 0x80 )
104 2 LCD_HIGH
105 2 else
106 2 LCD_LOW
107 2
108 2 value <<= 1;
109 2 }
110 1 //lcd_delay();
111 1 }
112
113 void lcd_write_command(unsigned char value)
114 {
115 1 unsigned char tmp;
C51 COMPILER V7.09 DISPLAY 09/25/2008 11:56:15 PAGE 3
116 1
117 1 lcd_serial_send(0xF8); /*RW=0, RS=0*/
118 1
119 1 tmp = value & 0xF0;
120 1 lcd_serial_send(tmp);
121 1 tmp = (value & 0x0F) * 16;
122 1 lcd_serial_send(tmp);
123 1 //lcd_delay();
124 1 }
125
126 void lcd_write_data(unsigned char value)
127 {
128 1 unsigned char tmp;
129 1
130 1 lcd_serial_send(0xFA); /*RW=0, RS=0*/
131 1
132 1 tmp = value & 0xF0;
133 1 lcd_serial_send(tmp);
134 1 tmp = (value & 0x0F) * 16;
135 1 lcd_serial_send(tmp);
136 1 }
137
138 void lcd_set_cgram_site(unsigned char lcd_col,unsigned char lcd_line) // set gdram address to AC,bit7=1,bi
-t6~0:address
139 { // need set RE=1 to extern command mode, first set y_addr(AC6...AC0),then set x_addr(AC3...AC0)
140 1 unsigned char lcd_site;
141 1 if(lcd_col==0)
142 1 lcd_site=0x40;
143 1 if(lcd_col==1)
144 1 lcd_site=0x50;
145 1 if(lcd_col==2)
146 1 lcd_site=0x60;
147 1 if(lcd_col==3)
148 1 lcd_site=0x70;
149 1
150 1 lcd_write_command(lcd_site | lcd_line);
151 1 //lcd_delay();
152 1 }
153
154 /*向自定义字库中写入点阵数据,一共有4个自定义字,每个字32个字节*/
155 /*void lcd_write_cgram(char index, char *ptr)
156 {
157 unsigned char i;
158
159 for(i=0; i<32; i++)
160 {
161
162 }
163 }
164 */
165
166 /****************************************************
167 *移动显示位置到指定的行和列
168 *column 0-15列
169 *line 0-3行
170 *flag 0:正常显示,1:反显
171 *****************************************************/
172 static volatile unsigned char display_column,display_row, display_flag;
173 static char displayBuffer[16*4];
174 static char *dispBufPtr;
175 char display_attribute(unsigned char column, unsigned char row, unsigned char flag)
176 {
C51 COMPILER V7.09 DISPLAY 09/25/2008 11:56:15 PAGE 4
177 1 unsigned char tmp;
178 1
179 1 if( (column >= LCD_WIDTH) || (row >= LCD_LINES) )
180 1 return(-1);
181 1
182 1 display_column = column;
183 1 display_row = row;
184 1
185 1 switch( row )
186 1 {
187 2 case 0:
188 2 tmp = 0;
189 2 break;
190 2
191 2 case 1:
192 2 tmp = 0x10;
193 2 break;
194 2
195 2 case 2:
196 2 tmp = 8;
197 2 break;
198 2
199 2 case 3:
200 2 default:
201 2 tmp = 0x18;
202 2 break;
203 2 }
204 1
205 1 tmp |= (column>>1) | LCD_CMD_DDRAM;
206 1
207 1 lcd_write_command(tmp);
208 1 dispBufPtr = displayBuffer + display_row*16 + (display_column&0xFE);
209 1
210 1 display_flag = flag;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -