📄 main.lst
字号:
__text_start:
__start:
0101 EFCF LDI R28,0xFF
0102 E1D0 LDI R29,0x10
0103 BFCD OUT 0x3D,R28
0104 BFDE OUT 0x3E,R29
0105 51C0 SUBI R28,0x10
0106 40D0 SBCI R29,0
0107 EA0A LDI R16,0xAA
0108 8308 STD Y+0,R16
0109 2400 CLR R0
010A E0E1 LDI R30,1
010B E0F1 LDI R31,1
010C E011 LDI R17,1
010D 30E2 CPI R30,2
010E 07F1 CPC R31,R17
010F F011 BEQ 0x0112
0110 9201 ST R0,Z+
0111 CFFB RJMP 0x010D
0112 8300 STD Z+0,R16
0113 E0E0 LDI R30,0
0114 E0F2 LDI R31,2
0115 E0A0 LDI R26,0
0116 E0B1 LDI R27,1
0117 E012 LDI R17,2
0118 30E1 CPI R30,1
0119 07F1 CPC R31,R17
011A F021 BEQ 0x011F
011B 95C8 LPM
011C 9631 ADIW R30,1
011D 920D ST R0,X+
011E CFF9 RJMP 0x0118
011F 940E0234 CALL _main
_exit:
0121 CFFF RJMP _exit
FILE: C:\DOCUME~1\zhuji\桌面\char\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 char
(0007)
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "char.h"
(0011) #include "main.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:
0122 2422 CLR R2
0123 BA2B OUT 0x1B,R2
(0021) DDRA = 0x00;
0124 BA2A OUT 0x1A,R2
(0022) PORTC = 0x00;
0125 BA25 OUT 0x15,R2
(0023) DDRC = 0xFF;
0126 EF8F LDI R24,0xFF
0127 BB84 OUT 0x14,R24
(0024) }
0128 9508 RET
_check_busy:
temp --> R20
cs --> R16
0129 940E0240 CALL push_gset1
(0025)
(0026) void check_busy(uchar cs)
(0027) {
012B C009 RJMP 0x0135
(0028) uchar temp;
(0029) while(temp)
(0030) {
(0031) if(cs)
012C 2300 TST R16
012D F021 BEQ 0x0132
(0032) temp=R_staus&0X80; //将忙状态读到temp中进行确定
012E 91402005 LDS R20,0x2005
0130 7840 ANDI R20,0x80
0131 C003 RJMP 0x0135
(0033) else
(0034) temp=L_staus&0X80;
0132 91402009 LDS R20,0x2009
0134 7840 ANDI R20,0x80
0135 2344 TST R20
0136 F7A9 BNE 0x012C
(0035) }
(0036) }
0137 940E0243 CALL pop_gset1
0139 9508 RET
_LCD_Clean:
page --> R20
y --> R22
013A 940E0257 CALL push_gset2
(0037)
(0038) void LCD_Clean(void)
(0039) {
(0040) unsigned char page=0,y; //定义表示页和列的局部变量
013C 2744 CLR R20
(0041)
(0042) for(page=0;page<8;page++)
013D C021 RJMP 0x015F
(0043) {
(0044) //LCD左半屏的操作
(0045) check_busy(0);
013E 2700 CLR R16
013F DFE9 RCALL _check_busy
(0046) L_command=LCD_PAGE+page; //设置LCD左半屏页地址
0140 2F84 MOV R24,R20
0141 5488 SUBI R24,0x48
0142 93802008 STS 0x2008,R24
(0047) check_busy(0);
0144 2700 CLR R16
0145 DFE3 RCALL _check_busy
(0048) L_command=LCD_Y;
0146 E480 LDI R24,0x40
0147 93802008 STS 0x2008,R24
(0049) //LCD右半屏的操作
(0050) check_busy(1);
0149 E001 LDI R16,1
014A DFDE RCALL _check_busy
(0051) R_command=LCD_PAGE+page; //设置LCD右半屏页地址
014B 2F84 MOV R24,R20
014C 5488 SUBI R24,0x48
014D 93802004 STS 0x2004,R24
(0052) check_busy(1);
014F E001 LDI R16,1
0150 DFD8 RCALL _check_busy
(0053) R_command=LCD_Y;
0151 E480 LDI R24,0x40
0152 93802004 STS 0x2004,R24
(0054)
(0055) for(y=0;y<64;y++)
0154 2766 CLR R22
0155 C006 RJMP 0x015C
(0056) {
(0057) L_data=0x00;
0156 2422 CLR R2
0157 9220200A STS 0x200A,R2
(0058) R_data=0x00;
0159 92202006 STS 0x2006,R2
015B 9563 INC R22
015C 3460 CPI R22,0x40
015D F3C0 BCS 0x0156
015E 9543 INC R20
015F 3048 CPI R20,0x8
0160 F2E8 BCS 0x013E
(0059) }
(0060) }
(0061) }
0161 940E023D CALL pop_gset2
0163 9508 RET
(0062)
(0063) void LCD_Init(void) //LCD初始化子函数
(0064) {
(0065) /*首先关闭12864的显示*/
(0066) check_busy(0); //LCD左半屏正在工作,等待......
_LCD_Init:
0164 2700 CLR R16
0165 DFC3 RCALL _check_busy
(0067) L_command=LCD_OFF; //先关闭LCD左半屏的显示
0166 E38E LDI R24,0x3E
0167 93802008 STS 0x2008,R24
(0068) check_busy(1); //LCD右半屏正在工作,等待......
0169 E001 LDI R16,1
016A DFBE RCALL _check_busy
(0069) R_command=LCD_OFF; //先关闭LCD右半屏的显示
016B E38E LDI R24,0x3E
016C 93802004 STS 0x2004,R24
(0070)
(0071) /*开启12864的显示*/
(0072) check_busy(0);
016E 2700 CLR R16
016F DFB9 RCALL _check_busy
(0073) L_command=LCD_ON; //打开LCD左半屏的显示
0170 E38F LDI R24,0x3F
0171 93802008 STS 0x2008,R24
(0074) check_busy(1);
0173 E001 LDI R16,1
0174 DFB4 RCALL _check_busy
(0075) R_command=LCD_ON; //打开LCD右半屏的显示
0175 E38F LDI R24,0x3F
0176 93802004 STS 0x2004,R24
(0076)
(0077) /*设置LCD显示的起始行*/
(0078) check_busy(0);
0178 2700 CLR R16
0179 DFAF RCALL _check_busy
(0079) L_command=LCD_X; //LCD左半屏起始行为0
017A EC80 LDI R24,0xC0
017B 93802008 STS 0x2008,R24
(0080) check_busy(1);
017D E001 LDI R16,1
017E DFAA RCALL _check_busy
(0081) R_command=LCD_X; //LCD右半屏起始行为0
017F EC80 LDI R24,0xC0
0180 93802004 STS 0x2004,R24
(0082) }
0182 9508 RET
(0083)
(0084) void init_devices(void)
(0085) {
(0086) XMCRA = 0x00; //外部存储器控制
_init_devices:
0183 2422 CLR R2
0184 9220006D STS 0x6D,R2
(0087) XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
0186 E087 LDI R24,7
0187 9380006C STS 0x6C,R24
(0088) // mapping_init();
(0089) port_init();
0189 DF98 RCALL _port_init
(0090) MCUCR = 0x80; //外部SRAM使能
018A E880 LDI R24,0x80
018B BF85 OUT 0x35,R24
(0091) }
018C 9508 RET
_write_Bchar:
i --> R20
n --> R18
cs --> R16
018D 940E0240 CALL push_gset1
(0092)
(0093) void write_Bchar(unsigned char cs,unsigned char n) // 大写字母显示函数
(0094) {
(0095) unsigned char i;
(0096) for(i=0;i<6;i++)
018F 2744 CLR R20
0190 C020 RJMP 0x01B1
(0097) {
(0098) if(cs) R_data=big_char[n][i]; //右半屏显示
0191 2300 TST R16
0192 F079 BEQ 0x01A2
0193 E086 LDI R24,6
0194 9F82 MUL R24,R18
0195 0110 MOVW R2,R0
0196 EC88 LDI R24,0xC8
0197 E090 LDI R25,0
0198 0E28 ADD R2,R24
0199 1E39 ADC R3,R25
019A 2FE4 MOV R30,R20
019B 27FF CLR R31
019C 0DE2 ADD R30,R2
019D 1DF3 ADC R31,R3
019E 91E4 LPM R30,0(Z)
019F 93E02006 STS 0x2006,R30
01A1 C00E RJMP 0x01B0
(0099) else L_data=big_char[n][i]; //左半屏显示
01A2 E086 LDI R24,6
01A3 9F82 MUL R24,R18
01A4 0110 MOVW R2,R0
01A5 EC88 LDI R24,0xC8
01A6 E090 LDI R25,0
01A7 0E28 ADD R2,R24
01A8 1E39 ADC R3,R25
01A9 2FE4 MOV R30,R20
01AA 27FF CLR R31
01AB 0DE2 ADD R30,R2
01AC 1DF3 ADC R31,R3
01AD 91E4 LPM R30,0(Z)
01AE 93E0200A STS 0x200A,R30
01B0 9543 INC R20
01B1 3046 CPI R20,6
01B2 F2F0 BCS 0x0191
(0100) }
(0101) }
01B3 940E0243 CALL pop_gset1
01B5 9508 RET
_write_Schar:
i --> R20
n --> R18
cs --> R16
01B6 940E0240 CALL push_gset1
(0102)
(0103) void write_Schar(unsigned char cs,unsigned char n) // 小写字母显示函数
(0104) {
(0105) unsigned char i;
(0106) for(i=0;i<6;i++)
01B8 2744 CLR R20
01B9 C020 RJMP 0x01DA
(0107) {
(0108) if(cs) R_data=small_char[n][i]; //右半屏显示
01BA 2300 TST R16
01BB F079 BEQ 0x01CB
01BC E086 LDI R24,6
01BD 9F82 MUL R24,R18
01BE 0110 MOVW R2,R0
01BF E684 LDI R24,0x64
01C0 E091 LDI R25,1
01C1 0E28 ADD R2,R24
01C2 1E39 ADC R3,R25
01C3 2FE4 MOV R30,R20
01C4 27FF CLR R31
01C5 0DE2 ADD R30,R2
01C6 1DF3 ADC R31,R3
01C7 91E4 LPM R30,0(Z)
01C8 93E02006 STS 0x2006,R30
01CA C00E RJMP 0x01D9
(0109) else L_data=small_char[n][i]; //左半屏显示
01CB E086 LDI R24,6
01CC 9F82 MUL R24,R18
01CD 0110 MOVW R2,R0
01CE E684 LDI R24,0x64
01CF E091 LDI R25,1
01D0 0E28 ADD R2,R24
01D1 1E39 ADC R3,R25
01D2 2FE4 MOV R30,R20
01D3 27FF CLR R31
01D4 0DE2 ADD R30,R2
01D5 1DF3 ADC R31,R3
01D6 91E4 LPM R30,0(Z)
01D7 93E0200A STS 0x200A,R30
01D9 9543 INC R20
01DA 3046 CPI R20,6
01DB F2F0 BCS 0x01BA
(0110) }
(0111) }
01DC 940E0243 CALL pop_gset1
01DE 9508 RET
_write_Nchar:
i --> R20
n --> R18
cs --> R16
01DF 940E0240 CALL push_gset1
(0112)
(0113) void write_Nchar(unsigned char cs,unsigned char n) //数字显示函数
(0114) {
(0115) unsigned char i;
(0116) for(i=0;i<6;i++)
01E1 2744 CLR R20
01E2 C020 RJMP 0x0203
(0117) {
(0118) if(cs) R_data=num[n][i]; //右半屏显示
01E3 2300 TST R16
01E4 F079 BEQ 0x01F4
01E5 E086 LDI R24,6
01E6 9F82 MUL R24,R18
01E7 0110 MOVW R2,R0
01E8 E88C LDI R24,0x8C
01E9 E090 LDI R25,0
01EA 0E28 ADD R2,R24
01EB 1E39 ADC R3,R25
01EC 2FE4 MOV R30,R20
01ED 27FF CLR R31
01EE 0DE2 ADD R30,R2
01EF 1DF3 ADC R31,R3
01F0 91E4 LPM R30,0(Z)
01F1 93E02006 STS 0x2006,R30
01F3 C00E RJMP 0x0202
(0119) else L_data=num[n][i]; //左半屏显示
01F4 E086 LDI R24,6
01F5 9F82 MUL R24,R18
01F6 0110 MOVW R2,R0
01F7 E88C LDI R24,0x8C
01F8 E090 LDI R25,0
01F9 0E28 ADD R2,R24
01FA 1E39 ADC R3,R25
01FB 2FE4 MOV R30,R20
01FC 27FF CLR R31
01FD 0DE2 ADD R30,R2
01FE 1DF3 ADC R31,R3
01FF 91E4 LPM R30,0(Z)
0200 93E0200A STS 0x200A,R30
0202 9543 INC R20
0203 3046 CPI R20,6
0204 F2F0 BCS 0x01E3
(0120) }
(0121) }
0205 940E0243 CALL pop_gset1
0207 9508 RET
_display_char:
i --> R20
0208 940E0240 CALL push_gset1
(0122)
(0123) void display_char(void) //字符显示函数
(0124) {
(0125) unsigned char i;
(0126) static unsigned char adder=0;
(0127) write_Bchar(0, 24);
020A E128 LDI R18,0x18
020B 2700 CLR R16
020C DF80 RCALL _write_Bchar
(0128) write_Schar(0, 14);
020D E02E LDI R18,0xE
020E 2700 CLR R16
020F DFA6 RCALL _write_Schar
(0129) write_Schar(0, 20);
0210 E124 LDI R18,0x14
0211 2700 CLR R16
0212 DFA3 RCALL _write_Schar
(0130) for(i=0;i<4;i++){L_data=0x00;}
0213 2744 CLR R20
0214 C004 RJMP 0x0219
0215 2422 CLR R2
0216 9220200A STS 0x200A,R2
0218 9543 INC R20
0219 3044 CPI R20,4
021A F3D0 BCS 0x0215
(0131) write_Bchar(0, 7);
021B E027 LDI R18,7
021C 2700 CLR R16
021D DF6F RCALL _write_Bchar
(0132) write_Schar(0, 20);
021E E124 LDI R18,0x14
021F 2700 CLR R16
0220 DF95 RCALL _write_Schar
(0133) adder++;
0221 91800100 LDS R24,0x100
0223 5F8F SUBI R24,0xFF
0224 93800100 STS 0x100,R24
(0134) if(adder>15){flag=1;adder=0;}
0226 E08F LDI R24,0xF
0227 90200100 LDS R2,0x100
0229 1582 CP R24,R2
022A F430 BCC 0x0231
022B E081 LDI R24,1
022C 93800101 STS _flag,R24
022E 2422 CLR R2
022F 92200100 STS 0x100,R2
(0135) }
0231 940E0243 CALL pop_gset1
0233 9508 RET
(0136)
(0137)
(0138) void main(void)
(0139) {
(0140) unsigned char i;
(0141) init_devices();
_main:
i --> Y+1
0234 DF4E RCALL _init_devices
(0142) LCD_Clean();
0235 DF04 RCALL _LCD_Clean
(0143) LCD_Init();
0236 DF2D RCALL _LCD_Init
0237 C003 RJMP 0x023B
(0144) //display_char();
(0145) while(1)
(0146) {
(0147) //write_Bchar(0,1);
(0148) write_Schar(0,3);
0238 E023 LDI R18,3
0239 2700 CLR R16
023A DF7B RCALL _write_Schar
023B CFFC RJMP 0x0238
(0149) }
(0150) }
FILE: <library>
023C 9508 RET
pop_gset2:
023D E0E2 LDI R30,2
023E 940C0244 JMP pop
push_gset1:
0240 935A ST R21,-Y
0241 934A ST R20,-Y
0242 9508 RET
pop_gset1:
0243 E0E1 LDI R30,1
pop:
0244 9149 LD R20,Y+
0245 9159 LD R21,Y+
0246 FDE0 SBRC R30,0
0247 9508 RET
0248 9169 LD R22,Y+
0249 9179 LD R23,Y+
024A FDE1 SBRC R30,1
024B 9508 RET
024C 90A9 LD R10,Y+
024D 90B9 LD R11,Y+
024E FDE2 SBRC R30,2
024F 9508 RET
0250 90C9 LD R12,Y+
0251 90D9 LD R13,Y+
0252 FDE3 SBRC R30,3
0253 9508 RET
0254 90E9 LD R14,Y+
0255 90F9 LD R15,Y+
0256 9508 RET
push_gset2:
0257 937A ST R23,-Y
0258 936A ST R22,-Y
0259 940C0240 JMP push_gset1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -