📄 main.lst
字号:
__start:
__text_start:
0156 EFCF LDI R28,0xFF
0157 E1D0 LDI R29,0x10
0158 BFCD OUT 0x3D,R28
0159 BFDE OUT 0x3E,R29
015A 51C0 SUBI R28,0x10
015B 40D0 SBCI R29,0
015C EA0A LDI R16,0xAA
015D 8308 STD Y+0,R16
015E 2400 CLR R0
015F E0E0 LDI R30,0
0160 E0F1 LDI R31,1
0161 E011 LDI R17,1
0162 30E1 CPI R30,1
0163 07F1 CPC R31,R17
0164 F011 BEQ 0x0167
0165 9201 ST R0,Z+
0166 CFFB RJMP 0x0162
0167 8300 STD Z+0,R16
0168 EAEC LDI R30,0xAC
0169 E0F2 LDI R31,2
016A E0A0 LDI R26,0
016B E0B1 LDI R27,1
016C E012 LDI R17,2
016D 3AEC CPI R30,0xAC
016E 07F1 CPC R31,R17
016F F021 BEQ 0x0174
0170 95C8 LPM
0171 9631 ADIW R30,1
0172 920D ST R0,X+
0173 CFF9 RJMP 0x016D
0174 940E0280 CALL _main
_exit:
0176 CFFF RJMP _exit
FILE: C:\DOCUME~1\zhuji\桌面\photo\main.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 "main.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:
0177 2422 CLR R2
0178 BA2B OUT 0x1B,R2
(0021) DDRA = 0x00;
0179 BA2A OUT 0x1A,R2
(0022) PORTC = 0x00;
017A BA25 OUT 0x15,R2
(0023) DDRC = 0xFF;
017B EF8F LDI R24,0xFF
017C BB84 OUT 0x14,R24
(0024) }
017D 9508 RET
_check_busy:
temp --> R20
cs --> R16
017E 940E028D CALL push_gset1
(0025)
(0026) void check_busy(uchar cs)
(0027) {
0180 C009 RJMP 0x018A
(0028) uchar temp;
(0029) while(temp)
(0030) {
(0031) if(cs)
0181 2300 TST R16
0182 F021 BEQ 0x0187
(0032) temp=R_staus&0X80; //将忙状态读到temp中进行确定
0183 91402005 LDS R20,0x2005
0185 7840 ANDI R20,0x80
0186 C003 RJMP 0x018A
(0033) else
(0034) temp=L_staus&0X80;
0187 91402009 LDS R20,0x2009
0189 7840 ANDI R20,0x80
018A 2344 TST R20
018B F7A9 BNE 0x0181
(0035) }
(0036) }
018C 940E0290 CALL pop_gset1
018E 9508 RET
_LCD_Clean:
page --> R20
y --> R22
018F 940E02A4 CALL push_gset2
(0037)
(0038) void LCD_Clean(void)
(0039) {
(0040) unsigned char page=0,y; //定义表示页和列的局部变量
0191 2744 CLR R20
(0041)
(0042) for(page=0;page<8;page++)
0192 C021 RJMP 0x01B4
(0043) {
(0044) //LCD左半屏的操作
(0045) check_busy(0);
0193 2700 CLR R16
0194 DFE9 RCALL _check_busy
(0046) L_command=LCD_PAGE+page; //设置LCD左半屏页地址
0195 2F84 MOV R24,R20
0196 5488 SUBI R24,0x48
0197 93802008 STS 0x2008,R24
(0047) check_busy(0);
0199 2700 CLR R16
019A DFE3 RCALL _check_busy
(0048) L_command=LCD_Y;
019B E480 LDI R24,0x40
019C 93802008 STS 0x2008,R24
(0049) //LCD右半屏的操作
(0050) check_busy(1);
019E E001 LDI R16,1
019F DFDE RCALL _check_busy
(0051) R_command=LCD_PAGE+page; //设置LCD右半屏页地址
01A0 2F84 MOV R24,R20
01A1 5488 SUBI R24,0x48
01A2 93802004 STS 0x2004,R24
(0052) check_busy(1);
01A4 E001 LDI R16,1
01A5 DFD8 RCALL _check_busy
(0053) R_command=LCD_Y;
01A6 E480 LDI R24,0x40
01A7 93802004 STS 0x2004,R24
(0054)
(0055) for(y=0;y<64;y++)
01A9 2766 CLR R22
01AA C006 RJMP 0x01B1
(0056) {
(0057) L_data=0x00;
01AB 2422 CLR R2
01AC 9220200A STS 0x200A,R2
(0058) R_data=0x00;
01AE 92202006 STS 0x2006,R2
01B0 9563 INC R22
01B1 3460 CPI R22,0x40
01B2 F3C0 BCS 0x01AB
01B3 9543 INC R20
01B4 3048 CPI R20,0x8
01B5 F2E8 BCS 0x0193
(0059) }
(0060) }
(0061) }
01B6 940E0287 CALL pop_gset2
01B8 9508 RET
(0062)
(0063) void LCD_Init(void) //LCD初始化子函数
(0064) {
(0065) /*首先关闭12864的显示*/
(0066) check_busy(0); //LCD左半屏正在工作,等待......
_LCD_Init:
01B9 2700 CLR R16
01BA DFC3 RCALL _check_busy
(0067) L_command=LCD_OFF; //先关闭LCD左半屏的显示
01BB E38E LDI R24,0x3E
01BC 93802008 STS 0x2008,R24
(0068) check_busy(1); //LCD右半屏正在工作,等待......
01BE E001 LDI R16,1
01BF DFBE RCALL _check_busy
(0069) R_command=LCD_OFF; //先关闭LCD右半屏的显示
01C0 E38E LDI R24,0x3E
01C1 93802004 STS 0x2004,R24
(0070)
(0071) /*开启12864的显示*/
(0072) check_busy(0);
01C3 2700 CLR R16
01C4 DFB9 RCALL _check_busy
(0073) L_command=LCD_ON; //打开LCD左半屏的显示
01C5 E38F LDI R24,0x3F
01C6 93802008 STS 0x2008,R24
(0074) check_busy(1);
01C8 E001 LDI R16,1
01C9 DFB4 RCALL _check_busy
(0075) R_command=LCD_ON; //打开LCD右半屏的显示
01CA E38F LDI R24,0x3F
01CB 93802004 STS 0x2004,R24
(0076)
(0077) /*设置LCD显示的起始行*/
(0078) check_busy(0);
01CD 2700 CLR R16
01CE DFAF RCALL _check_busy
(0079) L_command=LCD_X; //LCD左半屏起始行为0
01CF EC80 LDI R24,0xC0
01D0 93802008 STS 0x2008,R24
(0080) check_busy(1);
01D2 E001 LDI R16,1
01D3 DFAA RCALL _check_busy
(0081) R_command=LCD_X; //LCD右半屏起始行为0
01D4 EC80 LDI R24,0xC0
01D5 93802004 STS 0x2004,R24
(0082) }
01D7 9508 RET
(0083)
(0084) void init_devices(void)
(0085) {
(0086) XMCRA = 0x00; //外部存储器控制
_init_devices:
01D8 2422 CLR R2
01D9 9220006D STS 0x6D,R2
(0087) XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
01DB E087 LDI R24,7
01DC 9380006C STS 0x6C,R24
(0088) port_init();
01DE DF98 RCALL _port_init
(0089) MCUCR = 0x80; //外部SRAM使能
01DF E880 LDI R24,0x80
01E0 BF85 OUT 0x35,R24
(0090) }
01E1 9508 RET
_ch_pos:
n --> R20
cs --> R22
01E2 940E02A4 CALL push_gset2
01E4 2F42 MOV R20,R18
01E5 2F60 MOV R22,R16
(0091)
(0092) void ch_pos(unsigned char cs,unsigned char n) //屏选和页码设置函数
(0093) {
(0094) if(cs)
01E6 2366 TST R22
01E7 F061 BEQ 0x01F4
(0095) {
(0096) check_busy(1);
01E8 E001 LDI R16,1
01E9 DF94 RCALL _check_busy
(0097) R_command=LCD_PAGE+n; //设置LCD右半屏页地址
01EA 2F84 MOV R24,R20
01EB 5488 SUBI R24,0x48
01EC 93802004 STS 0x2004,R24
(0098) check_busy(1);
01EE E001 LDI R16,1
01EF DF8E RCALL _check_busy
(0099) R_command=LCD_Y;
01F0 E480 LDI R24,0x40
01F1 93802004 STS 0x2004,R24
(0100) }
01F3 C00B RJMP 0x01FF
(0101) else
(0102) {
(0103) check_busy(0);
01F4 2700 CLR R16
01F5 DF88 RCALL _check_busy
(0104) L_command=LCD_PAGE+n; //设置LCD右半屏页地址
01F6 2F84 MOV R24,R20
01F7 5488 SUBI R24,0x48
01F8 93802008 STS 0x2008,R24
(0105) check_busy(0);
01FA 2700 CLR R16
01FB DF82 RCALL _check_busy
(0106) L_command=LCD_Y;
01FC E480 LDI R24,0x40
01FD 93802008 STS 0x2008,R24
(0107) }
(0108) }
01FF 940E0287 CALL pop_gset2
0201 9508 RET
_write_photo:
j --> R20
i --> R10
cs --> R22
0202 940E02A8 CALL push_gset3
0204 2F60 MOV R22,R16
(0109) void write_photo(unsigned char cs)
(0110) {
(0111) uchar i,j;
(0112) for(j=0;j<3;j++)
0205 2744 CLR R20
0206 C073 RJMP 0x027A
(0113) {
(0114) if(cs) ch_pos(1,2*j); //右屏页码处理
0207 2366 TST R22
0208 F031 BEQ 0x020F
0209 E082 LDI R24,2
020A 9F84 MUL R24,R20
020B 2D20 MOV R18,R0
020C E001 LDI R16,1
020D DFD4 RCALL _ch_pos
020E C005 RJMP 0x0214
(0115) else ch_pos(0,2*j); //左屏页码处理
020F E082 LDI R24,2
0210 9F84 MUL R24,R20
0211 2D20 MOV R18,R0
0212 2700 CLR R16
0213 DFCE RCALL _ch_pos
(0116) for(i=0;i<64;i++)
0214 24AA CLR R10
0215 C026 RJMP 0x023C
(0117) {
(0118)
(0119) if(cs)
0216 2366 TST R22
0217 F091 BEQ 0x022A
(0120) {
(0121) R_data=p3[2*j][i]; //右半屏显示
0218 E082 LDI R24,2
0219 9F84 MUL R24,R20
021A 2D10 MOV R17,R0
021B E400 LDI R16,0x40
021C 0201 MULS R16,R17
021D E28C LDI R24,0x2C
021E E091 LDI R25,1
021F 0110 MOVW R2,R0
0220 0E28 ADD R2,R24
0221 1E39 ADC R3,R25
0222 2DEA MOV R30,R10
0223 27FF CLR R31
0224 0DE2 ADD R30,R2
0225 1DF3 ADC R31,R3
0226 91E4 LPM R30,0(Z)
0227 93E02006 STS 0x2006,R30
(0122) }
0229 C011 RJMP 0x023B
(0123) else
(0124) {
(0125) L_data=p3[2*j][i]; //左半屏显示
022A E082 LDI R24,2
022B 9F84 MUL R24,R20
022C 2D10 MOV R17,R0
022D E400 LDI R16,0x40
022E 0201 MULS R16,R17
022F E28C LDI R24,0x2C
0230 E091 LDI R25,1
0231 0110 MOVW R2,R0
0232 0E28 ADD R2,R24
0233 1E39 ADC R3,R25
0234 2DEA MOV R30,R10
0235 27FF CLR R31
0236 0DE2 ADD R30,R2
0237 1DF3 ADC R31,R3
0238 91E4 LPM R30,0(Z)
0239 93E0200A STS 0x200A,R30
023B 94A3 INC R10
023C 2D8A MOV R24,R10
023D 3480 CPI R24,0x40
023E F2B8 BCS 0x0216
(0126) }
(0127) }
(0128) if(cs) ch_pos(1,2*j+1); //右屏页码处理
023F 2366 TST R22
0240 F039 BEQ 0x0248
0241 E082 LDI R24,2
0242 9F84 MUL R24,R20
0243 2D20 MOV R18,R0
0244 5F2F SUBI R18,0xFF
0245 E001 LDI R16,1
0246 DF9B RCALL _ch_pos
0247 C006 RJMP 0x024E
(0129) else ch_pos(0,2*j+1); //左屏页码处理
0248 E082 LDI R24,2
0249 9F84 MUL R24,R20
024A 2D20 MOV R18,R0
024B 5F2F SUBI R18,0xFF
024C 2700 CLR R16
024D DF94 RCALL _ch_pos
(0130) for(i=0;i<64;i++)
024E 24AA CLR R10
024F C026 RJMP 0x0276
(0131) {
(0132) if(cs)
0250 2366 TST R22
0251 F091 BEQ 0x0264
(0133) {
(0134) R_data=p3[2*j+1][i]; //右半屏显示
0252 E082 LDI R24,2
0253 9F84 MUL R24,R20
0254 2D10 MOV R17,R0
0255 E400 LDI R16,0x40
0256 0201 MULS R16,R17
0257 E68C LDI R24,0x6C
0258 E091 LDI R25,1
0259 0110 MOVW R2,R0
025A 0E28 ADD R2,R24
025B 1E39 ADC R3,R25
025C 2DEA MOV R30,R10
025D 27FF CLR R31
025E 0DE2 ADD R30,R2
025F 1DF3 ADC R31,R3
0260 91E4 LPM R30,0(Z)
0261 93E02006 STS 0x2006,R30
(0135) }
0263 C011 RJMP 0x0275
(0136) else
(0137) {
(0138)
(0139) L_data=p3[2*j+1][i]; //左半屏显示
0264 E082 LDI R24,2
0265 9F84 MUL R24,R20
0266 2D10 MOV R17,R0
0267 E400 LDI R16,0x40
0268 0201 MULS R16,R17
0269 E68C LDI R24,0x6C
026A E091 LDI R25,1
026B 0110 MOVW R2,R0
026C 0E28 ADD R2,R24
026D 1E39 ADC R3,R25
026E 2DEA MOV R30,R10
026F 27FF CLR R31
0270 0DE2 ADD R30,R2
0271 1DF3 ADC R31,R3
0272 91E4 LPM R30,0(Z)
0273 93E0200A STS 0x200A,R30
0275 94A3 INC R10
0276 2D8A MOV R24,R10
0277 3480 CPI R24,0x40
0278 F2B8 BCS 0x0250
0279 9543 INC R20
027A 3043 CPI R20,3
027B F408 BCC 0x027D
027C CF8A RJMP 0x0207
(0140) }
(0141) }
(0142) }
(0143) }
027D 940E028A CALL pop_gset3
027F 9508 RET
(0144)
(0145) void main(void)
(0146) {
(0147) init_devices();
_main:
0280 DF57 RCALL _init_devices
(0148) LCD_Clean();
0281 DF0D RCALL _LCD_Clean
(0149) LCD_Init();
0282 DF36 RCALL _LCD_Init
(0150) write_photo(0);
0283 2700 CLR R16
0284 DF7D RCALL _write_photo
(0151) write_photo(1);
0285 E001 LDI R16,1
(0152) }
FILE: <library>
0286 CF7B RJMP _write_photo
pop_gset2:
0287 E0E2 LDI R30,2
0288 940C0291 JMP pop
pop_gset3:
028A E0E4 LDI R30,4
028B 940C0291 JMP pop
push_gset1:
028D 935A ST R21,-Y
028E 934A ST R20,-Y
028F 9508 RET
pop_gset1:
0290 E0E1 LDI R30,1
pop:
0291 9149 LD R20,Y+
0292 9159 LD R21,Y+
0293 FDE0 SBRC R30,0
0294 9508 RET
0295 9169 LD R22,Y+
0296 9179 LD R23,Y+
0297 FDE1 SBRC R30,1
0298 9508 RET
0299 90A9 LD R10,Y+
029A 90B9 LD R11,Y+
029B FDE2 SBRC R30,2
029C 9508 RET
029D 90C9 LD R12,Y+
029E 90D9 LD R13,Y+
029F FDE3 SBRC R30,3
02A0 9508 RET
02A1 90E9 LD R14,Y+
02A2 90F9 LD R15,Y+
02A3 9508 RET
push_gset2:
02A4 937A ST R23,-Y
02A5 936A ST R22,-Y
02A6 940C028D JMP push_gset1
push_gset3:
02A8 92BA ST R11,-Y
02A9 92AA ST R10,-Y
02AA 940C02A4 JMP push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -