📄 lcd.lst
字号:
__text_start:
__start:
013A E5CF LDI R28,0x5F
013B E0D4 LDI R29,4
013C BFCD OUT 0x3D,R28
013D BFDE OUT 0x3E,R29
013E 51C0 SUBI R28,0x10
013F 40D0 SBCI R29,0
0140 EA0A LDI R16,0xAA
0141 8308 STD Y+0,R16
0142 2400 CLR R0
0143 E6E0 LDI R30,0x60
0144 E0F0 LDI R31,0
0145 E010 LDI R17,0
0146 36E1 CPI R30,0x61
0147 07F1 CPC R31,R17
0148 F011 BEQ 0x014B
0149 9201 ST R0,Z+
014A CFFB RJMP 0x0146
014B 8300 STD Z+0,R16
014C E7E4 LDI R30,0x74
014D E0F2 LDI R31,2
014E E6A0 LDI R26,0x60
014F E0B0 LDI R27,0
0150 E012 LDI R17,2
0151 37E4 CPI R30,0x74
0152 07F1 CPC R31,R17
0153 F021 BEQ 0x0158
0154 95C8 LPM
0155 9631 ADIW R30,1
0156 920D ST R0,X+
0157 CFF9 RJMP 0x0151
0158 940E0264 CALL _main
_exit:
015A CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\USING07-05\Mega128\LCDDIS~1\lcd.c
(0001) // Project :12864 LCD Display
(0002) // Writer : you hu
(0003) // ICC-AVR application builder :2005-7-12
(0004) // Target : M128
(0005) // Crystal: 8.0000Mhz
(0006) // Description : display photo 32*32 big
(0007)
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "lcd.h"
(0011) #include "photo.h"
(0012) typedef unsigned char uchar;
(0013) typedef unsigned int uint;
(0014)
(0015) unsigned char flag;
(0016)
(0017) void port_init(void)
(0018) {
(0019) //访问外部ram的总线端口
(0020) PORTA = 0x00;
_port_init:
015B 2422 CLR R2
015C BA2B OUT 0x1B,R2
(0021) DDRA = 0x00;
015D BA2A OUT 0x1A,R2
(0022) PORTC = 0x00;
015E BA25 OUT 0x15,R2
(0023) DDRC = 0xFF;
015F EF8F LDI R24,0xFF
0160 BB84 OUT 0x14,R24
0161 9508 RET
_check_busy:
temp --> R20
cs --> R16
0162 940E027A CALL push_gset1
(0024) }
(0025)
(0026) void check_busy(uchar cs)
(0027) {
0164 C009 RJMP 0x016E
(0028) uchar temp;
(0029) while(temp)
(0030) {
(0031) if(cs)
0165 2300 TST R16
0166 F021 BEQ 0x016B
(0032) temp=R_staus&0X80; //将忙状态读到temp中进行确定
0167 91402005 LDS R20,0x2005
0169 7840 ANDI R20,0x80
016A C003 RJMP 0x016E
(0033) else
(0034) temp=L_staus&0X80;
016B 91402009 LDS R20,0x2009
016D 7840 ANDI R20,0x80
016E 2344 TST R20
016F F7A9 BNE 0x0165
0170 940E027D CALL pop_gset1
0172 9508 RET
_LCD_Clean:
page --> R20
y --> R22
0173 940E0278 CALL push_gset2
(0035) }
(0036) }
(0037)
(0038) void LCD_Clean(void)
(0039) {
(0040) unsigned char page=0,y; //定义表示页和列的局部变量
0175 2744 CLR R20
(0041)
(0042) for(page=0;page<8;page++)
0176 C021 RJMP 0x0198
(0043) {
(0044) //LCD左半屏的操作
(0045) check_busy(0);
0177 2700 CLR R16
0178 DFE9 RCALL _check_busy
(0046) L_command=LCD_PAGE+page; //设置LCD左半屏页地址
0179 2F84 MOV R24,R20
017A 5488 SUBI R24,0x48
017B 93802008 STS 0x2008,R24
(0047) check_busy(0);
017D 2700 CLR R16
017E DFE3 RCALL _check_busy
(0048) L_command=LCD_Y;
017F E480 LDI R24,0x40
0180 93802008 STS 0x2008,R24
(0049) //LCD右半屏的操作
(0050) check_busy(1);
0182 E001 LDI R16,1
0183 DFDE RCALL _check_busy
(0051) R_command=LCD_PAGE+page; //设置LCD右半屏页地址
0184 2F84 MOV R24,R20
0185 5488 SUBI R24,0x48
0186 93802004 STS 0x2004,R24
(0052) check_busy(1);
0188 E001 LDI R16,1
0189 DFD8 RCALL _check_busy
(0053) R_command=LCD_Y;
018A E480 LDI R24,0x40
018B 93802004 STS 0x2004,R24
(0054)
(0055) for(y=0;y<64;y++)
018D 2766 CLR R22
018E C006 RJMP 0x0195
(0056) {
(0057) L_data=0x00;
018F 2422 CLR R2
0190 9220200A STS 0x200A,R2
(0058) R_data=0x00;
0192 92202006 STS 0x2006,R2
0194 9563 INC R22
0195 3460 CPI R22,0x40
0196 F3C0 BCS 0x018F
0197 9543 INC R20
0198 3048 CPI R20,0x8
0199 F2E8 BCS 0x0177
019A 940E026C CALL pop_gset2
019C 9508 RET
(0059) }
(0060) }
(0061) }
(0062)
(0063) void LCD_Init(void) //LCD初始化子函数
(0064) {
(0065) /*首先关闭12864的显示*/
(0066) check_busy(0); //LCD左半屏正在工作,等待......
_LCD_Init:
019D 2700 CLR R16
019E DFC3 RCALL _check_busy
(0067) L_command=LCD_OFF; //先关闭LCD左半屏的显示
019F E38E LDI R24,0x3E
01A0 93802008 STS 0x2008,R24
(0068) check_busy(1); //LCD右半屏正在工作,等待......
01A2 E001 LDI R16,1
01A3 DFBE RCALL _check_busy
(0069) R_command=LCD_OFF; //先关闭LCD右半屏的显示
01A4 E38E LDI R24,0x3E
01A5 93802004 STS 0x2004,R24
(0070)
(0071) /*开启12864的显示*/
(0072) check_busy(0);
01A7 2700 CLR R16
01A8 DFB9 RCALL _check_busy
(0073) L_command=LCD_ON; //打开LCD左半屏的显示
01A9 E38F LDI R24,0x3F
01AA 93802008 STS 0x2008,R24
(0074) check_busy(1);
01AC E001 LDI R16,1
01AD DFB4 RCALL _check_busy
(0075) R_command=LCD_ON; //打开LCD右半屏的显示
01AE E38F LDI R24,0x3F
01AF 93802004 STS 0x2004,R24
(0076)
(0077) /*设置LCD显示的起始行*/
(0078) check_busy(0);
01B1 2700 CLR R16
01B2 DFAF RCALL _check_busy
(0079) L_command=LCD_X; //LCD左半屏起始行为0
01B3 EC80 LDI R24,0xC0
01B4 93802008 STS 0x2008,R24
(0080) check_busy(1);
01B6 E001 LDI R16,1
01B7 DFAA RCALL _check_busy
(0081) R_command=LCD_X; //LCD右半屏起始行为0
01B8 EC80 LDI R24,0xC0
01B9 93802004 STS 0x2004,R24
01BB 9508 RET
(0082) }
(0083)
(0084) void init_devices(void)
(0085) {
(0086) XMCRA = 0x00; //外部存储器控制
_init_devices:
01BC 2422 CLR R2
01BD 9220006D STS 0x6D,R2
(0087) XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
01BF E087 LDI R24,7
01C0 9380006C STS 0x6C,R24
(0088) port_init();
01C2 DF98 RCALL _port_init
(0089) MCUCR = 0x80; //外部SRAM使能
01C3 E880 LDI R24,0x80
01C4 BF85 OUT 0x35,R24
01C5 9508 RET
_ch_pos:
n --> R20
cs --> R22
01C6 940E0278 CALL push_gset2
01C8 2F42 MOV R20,R18
01C9 2F60 MOV R22,R16
(0090) }
(0091)
(0092) void ch_pos(unsigned char cs,unsigned char n) //屏选和页码设置函数
(0093) {
(0094) if(cs)
01CA 2366 TST R22
01CB F061 BEQ 0x01D8
(0095) {
(0096) check_busy(1);
01CC E001 LDI R16,1
01CD DF94 RCALL _check_busy
(0097) R_command=LCD_PAGE+n; //设置LCD右半屏页地址
01CE 2F84 MOV R24,R20
01CF 5488 SUBI R24,0x48
01D0 93802004 STS 0x2004,R24
(0098) check_busy(1);
01D2 E001 LDI R16,1
01D3 DF8E RCALL _check_busy
(0099) R_command=LCD_Y;
01D4 E480 LDI R24,0x40
01D5 93802004 STS 0x2004,R24
(0100) }
01D7 C00B RJMP 0x01E3
(0101) else
(0102) {
(0103) check_busy(0);
01D8 2700 CLR R16
01D9 DF88 RCALL _check_busy
(0104) L_command=LCD_PAGE+n; //设置LCD右半屏页地址
01DA 2F84 MOV R24,R20
01DB 5488 SUBI R24,0x48
01DC 93802008 STS 0x2008,R24
(0105) check_busy(0);
01DE 2700 CLR R16
01DF DF82 RCALL _check_busy
(0106) L_command=LCD_Y;
01E0 E480 LDI R24,0x40
01E1 93802008 STS 0x2008,R24
(0107) }
01E3 940E026C CALL pop_gset2
01E5 9508 RET
_write_photo:
j --> R20
i --> R10
cs --> R22
01E6 940E0276 CALL push_gset3
01E8 2F60 MOV R22,R16
(0108) }
(0109) void write_photo(unsigned char cs)
(0110) {
(0111) uchar i,j;
(0112) for(j=0;j<3;j++)
01E9 2744 CLR R20
01EA C073 RJMP 0x025E
(0113) {
(0114) if(cs) ch_pos(1,2*j); //右屏页码处理
01EB 2366 TST R22
01EC F031 BEQ 0x01F3
01ED E082 LDI R24,2
01EE 9F84 MUL R24,R20
01EF 2D20 MOV R18,R0
01F0 E001 LDI R16,1
01F1 DFD4 RCALL _ch_pos
01F2 C005 RJMP 0x01F8
(0115) else ch_pos(0,2*j); //左屏页码处理
01F3 E082 LDI R24,2
01F4 9F84 MUL R24,R20
01F5 2D20 MOV R18,R0
01F6 2700 CLR R16
01F7 DFCE RCALL _ch_pos
(0116) for(i=0;i<64;i++)
01F8 24AA CLR R10
01F9 C026 RJMP 0x0220
(0117) {
(0118)
(0119) if(cs)
01FA 2366 TST R22
01FB F091 BEQ 0x020E
(0120) {
(0121) R_data=p3[2*j][i]; //右半屏显示
01FC E082 LDI R24,2
01FD 9F84 MUL R24,R20
01FE 2D10 MOV R17,R0
01FF E400 LDI R16,0x40
0200 0201 MULS R16,R17
0201 EF84 LDI R24,0xF4
0202 E090 LDI R25,0
0203 0110 MOVW R2,R0
0204 0E28 ADD R2,R24
0205 1E39 ADC R3,R25
0206 2DEA MOV R30,R10
0207 27FF CLR R31
0208 0DE2 ADD R30,R2
0209 1DF3 ADC R31,R3
020A 91E4 LPM R30,0(Z)
020B 93E02006 STS 0x2006,R30
(0122) }
020D C011 RJMP 0x021F
(0123) else
(0124) {
(0125) L_data=p3[2*j][i]; //左半屏显示
020E E082 LDI R24,2
020F 9F84 MUL R24,R20
0210 2D10 MOV R17,R0
0211 E400 LDI R16,0x40
0212 0201 MULS R16,R17
0213 EF84 LDI R24,0xF4
0214 E090 LDI R25,0
0215 0110 MOVW R2,R0
0216 0E28 ADD R2,R24
0217 1E39 ADC R3,R25
0218 2DEA MOV R30,R10
0219 27FF CLR R31
021A 0DE2 ADD R30,R2
021B 1DF3 ADC R31,R3
021C 91E4 LPM R30,0(Z)
021D 93E0200A STS 0x200A,R30
021F 94A3 INC R10
0220 2D8A MOV R24,R10
0221 3480 CPI R24,0x40
0222 F2B8 BCS 0x01FA
(0126) }
(0127) }
(0128) if(cs) ch_pos(1,2*j+1); //右屏页码处理
0223 2366 TST R22
0224 F039 BEQ 0x022C
0225 E082 LDI R24,2
0226 9F84 MUL R24,R20
0227 2D20 MOV R18,R0
0228 5F2F SUBI R18,0xFF
0229 E001 LDI R16,1
022A DF9B RCALL _ch_pos
022B C006 RJMP 0x0232
(0129) else ch_pos(0,2*j+1); //左屏页码处理
022C E082 LDI R24,2
022D 9F84 MUL R24,R20
022E 2D20 MOV R18,R0
022F 5F2F SUBI R18,0xFF
0230 2700 CLR R16
0231 DF94 RCALL _ch_pos
(0130) for(i=0;i<64;i++)
0232 24AA CLR R10
0233 C026 RJMP 0x025A
(0131) {
(0132) if(cs)
0234 2366 TST R22
0235 F091 BEQ 0x0248
(0133) {
(0134) R_data=p3[2*j+1][i]; //右半屏显示
0236 E082 LDI R24,2
0237 9F84 MUL R24,R20
0238 2D10 MOV R17,R0
0239 E400 LDI R16,0x40
023A 0201 MULS R16,R17
023B E384 LDI R24,0x34
023C E091 LDI R25,1
023D 0110 MOVW R2,R0
023E 0E28 ADD R2,R24
023F 1E39 ADC R3,R25
0240 2DEA MOV R30,R10
0241 27FF CLR R31
0242 0DE2 ADD R30,R2
0243 1DF3 ADC R31,R3
0244 91E4 LPM R30,0(Z)
0245 93E02006 STS 0x2006,R30
(0135) }
0247 C011 RJMP 0x0259
(0136) else
(0137) {
(0138)
(0139) L_data=p3[2*j+1][i]; //左半屏显示
0248 E082 LDI R24,2
0249 9F84 MUL R24,R20
024A 2D10 MOV R17,R0
024B E400 LDI R16,0x40
024C 0201 MULS R16,R17
024D E384 LDI R24,0x34
024E E091 LDI R25,1
024F 0110 MOVW R2,R0
0250 0E28 ADD R2,R24
0251 1E39 ADC R3,R25
0252 2DEA MOV R30,R10
0253 27FF CLR R31
0254 0DE2 ADD R30,R2
0255 1DF3 ADC R31,R3
0256 91E4 LPM R30,0(Z)
0257 93E0200A STS 0x200A,R30
0259 94A3 INC R10
025A 2D8A MOV R24,R10
025B 3480 CPI R24,0x40
025C F2B8 BCS 0x0234
025D 9543 INC R20
025E 3043 CPI R20,3
025F F408 BCC 0x0261
0260 CF8A RJMP 0x01EB
0261 940E026F CALL pop_gset3
0263 9508 RET
(0140) }
(0141) }
(0142) }
(0143) }
(0144)
(0145) void main(void)
(0146) {
(0147) init_devices();
_main:
0264 DF57 RCALL _init_devices
(0148) LCD_Clean();
0265 DF0D RCALL _LCD_Clean
(0149) LCD_Init();
0266 DF36 RCALL _LCD_Init
(0150) write_photo(0);
0267 2700 CLR R16
0268 DF7D RCALL _write_photo
(0151) write_photo(1);
FILE: <library>
0269 E001 LDI R16,1
026A DF7B RCALL _write_photo
026B 9508 RET
pop_gset2:
026C E0E2 LDI R30,2
026D 940C027E JMP pop
pop_gset3:
026F E0E4 LDI R30,4
0270 940C027E JMP pop
push_gset5:
0272 92FA ST R15,-Y
0273 92EA ST R14,-Y
push_gset4:
0274 92DA ST R13,-Y
0275 92CA ST R12,-Y
push_gset3:
0276 92BA ST R11,-Y
0277 92AA ST R10,-Y
push_gset2:
0278 937A ST R23,-Y
0279 936A ST R22,-Y
push_gset1:
027A 935A ST R21,-Y
027B 934A ST R20,-Y
027C 9508 RET
pop_gset1:
027D E0E1 LDI R30,1
pop:
027E 9149 LD R20,Y+
027F 9159 LD R21,Y+
0280 FDE0 SBRC R30,0
0281 9508 RET
0282 9169 LD R22,Y+
0283 9179 LD R23,Y+
0284 FDE1 SBRC R30,1
0285 9508 RET
0286 90A9 LD R10,Y+
0287 90B9 LD R11,Y+
0288 FDE2 SBRC R30,2
0289 9508 RET
028A 90C9 LD R12,Y+
028B 90D9 LD R13,Y+
028C FDE3 SBRC R30,3
028D 9508 RET
028E 90E9 LD R14,Y+
028F 90F9 LD R15,Y+
0290 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -