📄 lcd12864.lst
字号:
1 .file "lcd12864.c"
2 .arch atmega16
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
70 .global lcd_delay
72 lcd_delay:
1:lcd12864.c **** /******************************************************************************
2:lcd12864.c **** /* LCD12864驱动程序
3:lcd12864.c **** /* 文 件 名:LCD12864
4:lcd12864.c **** /* 创建时间:2004年12月24日
5:lcd12864.c **** /* 创 建 人:胡勇刚
6:lcd12864.c **** /* Email: hygbeyond@163.com
7:lcd12864.c **** //******************************************************************************
8:lcd12864.c **** /* 这是根据我以前所做的C51的程序移值的,这个驱动已经在mega16L上运行成功了
9:lcd12864.c **** /* 这个驱动要注意的是:你用的mega系列的话,要注意和JTAG,ISP的冲突问题,如果
10:lcd12864.c **** /* 用的是C口作为数据口的话,就一定要关闭JTAG,记住如果要用JTAG作为仿真用的话
11:lcd12864.c **** /* 尽量的不要用这几个脚,否则就关闭JTAG(特别是作为I/O口)
12:lcd12864.c **** /* 我就是因为这个问题浪费了不少时间,主要的现象是插上LCD就不工作,
13:lcd12864.c **** /* 拔掉LCD就一切正常,好像应该是LCD触发了JTAG,从而使芯片进入仿真状态了
14:lcd12864.c **** /* 还有一点就是时钟频率,如果时钟频率高的话,需要修改DELAY_COUNT值
15:lcd12864.c **** /* 不然的话显示会有问题,这是因为12864本身的反应速度比较慢的原因
16:lcd12864.c **** /* 我现在所用的是mege16L 频率: 3.6864M
17:lcd12864.c **** /*
18:lcd12864.c **** /* 各位大虾如果有比这个驱动更优化的程序,请给我一份,就用上面的邮箱.谢谢了
19:lcd12864.c **** //*****************************************************************************/
20:lcd12864.c ****
21:lcd12864.c **** /*2005-8-27 21:38 把以前的ICC下的LCD12864驱动重新写了一遍 又移植到GCC*/
22:lcd12864.c ****
23:lcd12864.c **** #define __LCD_12864_H
24:lcd12864.c ****
25:lcd12864.c **** #include "config.h"
26:lcd12864.c ****
27:lcd12864.c **** /******************************************************************************/
28:lcd12864.c **** #ifndef uchar
29:lcd12864.c **** #define uchar unsigned char
30:lcd12864.c **** #endif
31:lcd12864.c **** //***************************************************************************/
32:lcd12864.c ****
33:lcd12864.c ****
34:lcd12864.c **** /***************************************************************************
35:lcd12864.c **** #ifndef LCD_DI
36:lcd12864.c ****
37:lcd12864.c **** #define LCD_DI PB0
38:lcd12864.c **** #define LCD_RW PB1
39:lcd12864.c **** #define LCD_EN PB2
40:lcd12864.c **** #define LCD_CS1 PB3
41:lcd12864.c **** #define LCD_CS2 PB4
42:lcd12864.c ****
43:lcd12864.c **** #define LCD_DATA_IN PINC
44:lcd12864.c **** #define LCD_DATA_OUT PORTC
45:lcd12864.c **** #define LCD_DATA_DDR DDRC
46:lcd12864.c ****
47:lcd12864.c **** #define LCD_CODE_OUT PORTB
48:lcd12864.c ****
49:lcd12864.c **** #define LCD_DI_H LCD_CODE_OUT |= BIT(LCD_DI)
50:lcd12864.c **** #define LCD_DI_L LCD_CODE_OUT &= ~BIT(LCD_DI)
51:lcd12864.c **** #define LCD_RW_H LCD_CODE_OUT |= BIT(LCD_RW)
52:lcd12864.c **** #define LCD_RW_L LCD_CODE_OUT &= ~BIT(LCD_RW)
53:lcd12864.c **** #define LCD_EN_H LCD_CODE_OUT |= BIT(LCD_EN)
54:lcd12864.c **** #define LCD_EN_L LCD_CODE_OUT &= ~BIT(LCD_EN)
55:lcd12864.c **** #define LCD_CS1_H LCD_CODE_OUT |= BIT(LCD_CS1)
56:lcd12864.c **** #define LCD_CS1_L LCD_CODE_OUT &= ~BIT(LCD_CS1)
57:lcd12864.c **** #define LCD_CS2_H LCD_CODE_OUT |= BIT(LCD_CS2)
58:lcd12864.c **** #define LCD_CS2_L LCD_CODE_OUT &= ~BIT(LCD_CS2)
59:lcd12864.c ****
60:lcd12864.c **** #endif
61:lcd12864.c **** //****************************************************************************/
62:lcd12864.c ****
63:lcd12864.c **** #define pre_page 0xb8
64:lcd12864.c **** /*预设LCD页地址*/
65:lcd12864.c **** #define pre_col 0x40
66:lcd12864.c **** /*预设LCD列地址*/
67:lcd12864.c **** #define DELAY_COUNT 25
68:lcd12864.c **** /*LCD延迟时间数*/
69:lcd12864.c ****
70:lcd12864.c **** #define LCD_NOP() lcd_delay()
71:lcd12864.c **** /*LCD延迟*/
72:lcd12864.c ****
73:lcd12864.c **** #define LCD_STAY
74:lcd12864.c ****
75:lcd12864.c **** /*写入左屏的地址初始*/
76:lcd12864.c **** #define addressL( page, col) wcodeL(pre_page+page);\
77:lcd12864.c **** wcodeL(pre_col+col)
78:lcd12864.c **** /*写入右屏的地址初始*/
79:lcd12864.c **** #define addressR( page, col) wcodeR(pre_page+page);\
80:lcd12864.c **** wcodeR(pre_col+col)
81:lcd12864.c **** //*****************************************************************************
82:lcd12864.c **** void lcd_delay(void); //延迟
83:lcd12864.c **** void wcodeL(uchar left_code); //左屏写入命令
84:lcd12864.c **** void wdataL(uchar left_data); //左屏写入数据
85:lcd12864.c **** void wcodeR(uchar right_code); //右屏写入命令
86:lcd12864.c **** void wdataR(uchar right_data); //右屏写入数据
87:lcd12864.c **** void lcd_init(void); //LCD初始化
88:lcd12864.c **** void lcd_clear_range(uchar range);
89:lcd12864.c **** void lcd_clear_left(void);
90:lcd12864.c **** void lcd_print(uchar x,uchar y,uchar lcd_char);
91:lcd12864.c **** void lcd_print88(uchar x,uchar y,const prog_uchar *lcd_char); //输出8*8的字符
92:lcd12864.c **** void lcd_print1616(uchar x,uchar y,const prog_uchar *lcd_char); //输出16*16的汉字
93:lcd12864.c **** void lcd_print816(uchar x,uchar y,const prog_uchar *lcd_char); //输出8*16的字符
94:lcd12864.c **** //***************************************************************************/
95:lcd12864.c **** void wcodeL(uchar left_code)//左屏写指令
96:lcd12864.c **** {
97:lcd12864.c **** LCD_DATA_DDR=0X00;
98:lcd12864.c **** while(1)
99:lcd12864.c **** {
100:lcd12864.c **** //如果液晶空闲开始写数据和命令
101:lcd12864.c **** LCD_CODE_OUT |=((1<<LCD_EN) | (1<<LCD_RW) | (1<<LCD_CS2));
102:lcd12864.c **** LCD_CODE_OUT &= ~((1<<LCD_DI) | (1<<LCD_CS1));
103:lcd12864.c **** if(!(LCD_DATA_IN & 0x80))
104:lcd12864.c **** {
105:lcd12864.c **** break;
106:lcd12864.c **** }
107:lcd12864.c **** }
108:lcd12864.c **** LCD_RW_L;
109:lcd12864.c **** LCD_DATA_DDR = 0XFF;
110:lcd12864.c **** LCD_DATA_OUT = left_code;
111:lcd12864.c **** LCD_NOP();
112:lcd12864.c **** LCD_EN_L;
113:lcd12864.c **** }
114:lcd12864.c **** /******************************************************************************/
115:lcd12864.c **** void wdataL(uchar left_data)//左屏写数据
116:lcd12864.c **** {
117:lcd12864.c **** LCD_DATA_DDR=0X00;
118:lcd12864.c **** while(1)
119:lcd12864.c **** {
120:lcd12864.c **** //如果液晶空闲开始写数据和命令
121:lcd12864.c **** LCD_CODE_OUT |= ((1<<LCD_EN) | (1<<LCD_RW) | (1<<LCD_CS2));
122:lcd12864.c **** LCD_CODE_OUT &= ~((1<<LCD_DI) | (1<<LCD_CS1));
123:lcd12864.c **** if(!(LCD_DATA_IN & 0x80))
124:lcd12864.c **** {
125:lcd12864.c **** break;
126:lcd12864.c **** }
127:lcd12864.c **** }
128:lcd12864.c **** LCD_RW_L;
129:lcd12864.c **** LCD_DI_H;
130:lcd12864.c **** LCD_DATA_DDR=0XFF;
131:lcd12864.c **** LCD_DATA_OUT=left_data;
132:lcd12864.c **** LCD_NOP();
133:lcd12864.c **** LCD_EN_L;
134:lcd12864.c **** }
135:lcd12864.c **** /******************************************************************************/
136:lcd12864.c **** void wcodeR(uchar right_code)//右屏写指令
137:lcd12864.c **** {
138:lcd12864.c **** LCD_DATA_DDR=0X00;
139:lcd12864.c **** while(1)
140:lcd12864.c **** {
141:lcd12864.c **** //如果液晶空闲开始写数据和命令
142:lcd12864.c **** LCD_CODE_OUT |= ((1<<LCD_EN) | (1<<LCD_RW) | (1<<LCD_CS1));
143:lcd12864.c **** LCD_CODE_OUT &= ~((1<<LCD_DI) | (1<<LCD_CS2));
144:lcd12864.c **** if(!(LCD_DATA_IN & 0x80))
145:lcd12864.c **** {
146:lcd12864.c **** break;
147:lcd12864.c **** }
148:lcd12864.c **** }
149:lcd12864.c **** LCD_RW_L;
150:lcd12864.c **** LCD_DATA_DDR=0XFF;
151:lcd12864.c **** LCD_DATA_OUT=right_code;
152:lcd12864.c **** LCD_NOP();
153:lcd12864.c **** LCD_EN_L;
154:lcd12864.c **** }
155:lcd12864.c **** /******************************************************************************/
156:lcd12864.c **** void wdataR(uchar right_data)//写右屏数据
157:lcd12864.c **** {
158:lcd12864.c **** LCD_DATA_DDR=0X00;
159:lcd12864.c **** while(1)
160:lcd12864.c **** {
161:lcd12864.c **** //如果液晶空闲开始写数据和命令
162:lcd12864.c **** LCD_CODE_OUT |= ((1<<LCD_EN) | (1<<LCD_RW) | (1<<LCD_CS1));
163:lcd12864.c **** LCD_CODE_OUT &= ~((1<<LCD_DI) | (1<<LCD_CS2));
164:lcd12864.c **** if(!(LCD_DATA_IN & 0x80))
165:lcd12864.c **** {
166:lcd12864.c **** break;
167:lcd12864.c **** }
168:lcd12864.c **** }
169:lcd12864.c **** LCD_RW_L;
170:lcd12864.c **** LCD_DI_H;
171:lcd12864.c **** LCD_DATA_DDR=0XFF;
172:lcd12864.c **** LCD_DATA_OUT=right_data;
173:lcd12864.c **** LCD_NOP();
174:lcd12864.c **** LCD_EN_L;
175:lcd12864.c **** }
176:lcd12864.c **** /******************************************************************************/
177:lcd12864.c **** void lcd_init(void)
178:lcd12864.c **** {
179:lcd12864.c **** uchar x,y;
180:lcd12864.c **** //设置显示起始行
181:lcd12864.c **** wcodeL(0x0c0);
182:lcd12864.c **** wcodeR(0x0c0);
183:lcd12864.c ****
184:lcd12864.c **** //开显示
185:lcd12864.c **** wcodeL(0x3f);
186:lcd12864.c **** wcodeR(0x3f);
187:lcd12864.c ****
188:lcd12864.c **** for(x=0;x<8;x++)
189:lcd12864.c **** {
190:lcd12864.c **** wcodeL(pre_page+x);
191:lcd12864.c **** for(y=0;y<64;y++)
192:lcd12864.c **** {
193:lcd12864.c **** wcodeL(pre_col+y);
194:lcd12864.c **** wdataL(0);
195:lcd12864.c **** }
196:lcd12864.c **** }
197:lcd12864.c **** for(x=0;x<8;x++)
198:lcd12864.c **** {
199:lcd12864.c **** wcodeR(pre_page+x);
200:lcd12864.c **** for(y=0;y<64;y++)
201:lcd12864.c **** {
202:lcd12864.c **** wcodeR(pre_col+y);
203:lcd12864.c **** wdataR(0);
204:lcd12864.c **** }
205:lcd12864.c **** }
206:lcd12864.c **** }
207:lcd12864.c **** /******************************************************************************/
208:lcd12864.c **** void lcd_clear_range(uchar range)
209:lcd12864.c **** {
210:lcd12864.c **** uchar x=0;
211:lcd12864.c **** for(x=0;x<64;x++)
212:lcd12864.c **** {
213:lcd12864.c **** addressL(range,x);
214:lcd12864.c **** wdataL(0);
215:lcd12864.c **** }
216:lcd12864.c **** }
217:lcd12864.c **** /******************************************************************************/
218:lcd12864.c **** void lcd_clear_left(void)
219:lcd12864.c **** {
220:lcd12864.c **** uchar x,y;
221:lcd12864.c **** for(x=0;x<8;x++)
222:lcd12864.c **** {
223:lcd12864.c **** for(y=0;y<64;y++)
224:lcd12864.c **** {
225:lcd12864.c **** addressL(x,y);
226:lcd12864.c **** wdataL(0);
227:lcd12864.c **** }
228:lcd12864.c **** }
229:lcd12864.c **** }
230:lcd12864.c **** /******************************************************************************/
231:lcd12864.c **** void lcd_print(uchar x,uchar y,uchar lcd_char)
232:lcd12864.c **** {
233:lcd12864.c **** if(x > 7)
234:lcd12864.c **** {
235:lcd12864.c **** x -= 7;
236:lcd12864.c **** }
237:lcd12864.c **** if(y > 63)
238:lcd12864.c **** {
239:lcd12864.c **** y -= 63;
240:lcd12864.c **** addressL(x,y);
241:lcd12864.c **** wdataL(lcd_char);
242:lcd12864.c **** }else
243:lcd12864.c **** {
244:lcd12864.c **** addressR(x,y);
245:lcd12864.c **** wdataR(lcd_char);
246:lcd12864.c **** }
247:lcd12864.c **** }
248:lcd12864.c **** /******************************************************************************/
249:lcd12864.c **** void lcd_print88(uchar x,uchar y,const prog_uchar *lcd_char)//显示8*8字符
250:lcd12864.c **** {
251:lcd12864.c **** uchar i;
252:lcd12864.c **** for(i=0;i<8;i++)
253:lcd12864.c **** {
254:lcd12864.c **** lcd_print(x,y+i,pgm_read_byte(lcd_char++));
255:lcd12864.c **** }
256:lcd12864.c **** }
257:lcd12864.c **** /******************************************************************************/
258:lcd12864.c **** void lcd_print1616(uchar x,uchar y,const prog_uchar *lcd_char)//显示16*16的汉字
259:lcd12864.c **** {
260:lcd12864.c **** uchar i,j;
261:lcd12864.c **** for(i=0;i<2;i++)
262:lcd12864.c **** {
263:lcd12864.c **** for(j=0;j<16;j++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -