📄 main.lst
字号:
__text_start:
__start:
0096 EFCF LDI R28,0xFF
0097 E1D0 LDI R29,0x10
0098 BFCD OUT 0x3D,R28
0099 BFDE OUT 0x3E,R29
009A 51C0 SUBI R28,0x10
009B 40D0 SBCI R29,0
009C EA0A LDI R16,0xAA
009D 8308 STD Y+0,R16
009E 2400 CLR R0
009F E0E0 LDI R30,0
00A0 E0F1 LDI R31,1
00A1 E011 LDI R17,1
00A2 30E1 CPI R30,1
00A3 07F1 CPC R31,R17
00A4 F011 BEQ 0x00A7
00A5 9201 ST R0,Z+
00A6 CFFB RJMP 0x00A2
00A7 8300 STD Z+0,R16
00A8 E2EC LDI R30,0x2C
00A9 E0F1 LDI R31,1
00AA E0A0 LDI R26,0
00AB E0B1 LDI R27,1
00AC E011 LDI R17,1
00AD 32EC CPI R30,0x2C
00AE 07F1 CPC R31,R17
00AF F021 BEQ 0x00B4
00B0 95C8 LPM
00B1 9631 ADIW R30,1
00B2 920D ST R0,X+
00B3 CFF9 RJMP 0x00AD
00B4 940E0184 CALL _main
_exit:
00B6 CFFF RJMP _exit
FILE: C:\DOCUME~1\zhuji\桌面\新建文~2\main.c
(0001) // Project :12864 LCD Display
(0002) // ICC-AVR application builder :2008-3-23
(0003) // Target : M128
(0004) // Crystal: 8.0000Mhz
(0005) // Description : display chinese
(0006) // 纵向取模方式 16*16字体
(0007)
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "chinese.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:
00B7 2422 CLR R2
00B8 BA2B OUT 0x1B,R2
(0021) DDRA = 0x00;
00B9 BA2A OUT 0x1A,R2
(0022) PORTC = 0x00;
00BA BA25 OUT 0x15,R2
(0023) DDRC = 0xFF;
00BB EF8F LDI R24,0xFF
00BC BB84 OUT 0x14,R24
(0024) }
00BD 9508 RET
_check_busy:
temp --> R20
cs --> R16
00BE 940E0199 CALL push_gset1
(0025)
(0026) void check_busy(uchar cs) //查忙函数
(0027) {
00C0 C009 RJMP 0x00CA
(0028) uchar temp;
(0029) while(temp)
(0030) {
(0031) if(cs)
00C1 2300 TST R16
00C2 F021 BEQ 0x00C7
(0032) temp=R_staus&0X80; //将忙状态读到temp中进行确定
00C3 91402005 LDS R20,0x2005
00C5 7840 ANDI R20,0x80
00C6 C003 RJMP 0x00CA
(0033) else
(0034) temp=L_staus&0X80;
00C7 91402009 LDS R20,0x2009
00C9 7840 ANDI R20,0x80
00CA 2344 TST R20
00CB F7A9 BNE 0x00C1
(0035) }
(0036) }
00CC 940E019C CALL pop_gset1
00CE 9508 RET
_LCD_Clean:
page --> R20
y --> R22
00CF 940E01B0 CALL push_gset2
(0037)
(0038) void LCD_Clean(void)
(0039) {
(0040) unsigned char page=0,y; //定义表示页和列的局部变量
00D1 2744 CLR R20
(0041)
(0042) for(page=0;page<8;page++)
00D2 C021 RJMP 0x00F4
(0043) {
(0044) //LCD左半屏的操作
(0045) check_busy(0);
00D3 2700 CLR R16
00D4 DFE9 RCALL _check_busy
(0046) L_command=LCD_PAGE+page; //设置LCD左半屏页地址
00D5 2F84 MOV R24,R20
00D6 5488 SUBI R24,0x48
00D7 93802008 STS 0x2008,R24
(0047) check_busy(0);
00D9 2700 CLR R16
00DA DFE3 RCALL _check_busy
(0048) L_command=LCD_Y;
00DB E480 LDI R24,0x40
00DC 93802008 STS 0x2008,R24
(0049) //LCD右半屏的操作
(0050) check_busy(1);
00DE E001 LDI R16,1
00DF DFDE RCALL _check_busy
(0051) R_command=LCD_PAGE+page; //设置LCD右半屏页地址
00E0 2F84 MOV R24,R20
00E1 5488 SUBI R24,0x48
00E2 93802004 STS 0x2004,R24
(0052) check_busy(1);
00E4 E001 LDI R16,1
00E5 DFD8 RCALL _check_busy
(0053) R_command=LCD_Y;
00E6 E480 LDI R24,0x40
00E7 93802004 STS 0x2004,R24
(0054)
(0055) for(y=0;y<64;y++)
00E9 2766 CLR R22
00EA C006 RJMP 0x00F1
(0056) {
(0057) L_data=0x00;
00EB 2422 CLR R2
00EC 9220200A STS 0x200A,R2
(0058) R_data=0x00;
00EE 92202006 STS 0x2006,R2
00F0 9563 INC R22
00F1 3460 CPI R22,0x40
00F2 F3C0 BCS 0x00EB
00F3 9543 INC R20
00F4 3048 CPI R20,0x8
00F5 F2E8 BCS 0x00D3
(0059) }
(0060) }
(0061) }
00F6 940E0193 CALL pop_gset2
00F8 9508 RET
(0062)
(0063) void LCD_Init(void) //LCD初始化子函数
(0064) {
(0065) /*首先关闭12864的显示*/
(0066) check_busy(0); //LCD左半屏正在工作,等待......
_LCD_Init:
00F9 2700 CLR R16
00FA DFC3 RCALL _check_busy
(0067) L_command=LCD_OFF; //先关闭LCD左半屏的显示
00FB E38E LDI R24,0x3E
00FC 93802008 STS 0x2008,R24
(0068) check_busy(1); //LCD右半屏正在工作,等待......
00FE E001 LDI R16,1
00FF DFBE RCALL _check_busy
(0069) R_command=LCD_OFF; //先关闭LCD右半屏的显示
0100 E38E LDI R24,0x3E
0101 93802004 STS 0x2004,R24
(0070)
(0071) /*开启12864的显示*/
(0072) check_busy(0);
0103 2700 CLR R16
0104 DFB9 RCALL _check_busy
(0073) L_command=LCD_ON; //打开LCD左半屏的显示
0105 E38F LDI R24,0x3F
0106 93802008 STS 0x2008,R24
(0074) check_busy(1);
0108 E001 LDI R16,1
0109 DFB4 RCALL _check_busy
(0075) R_command=LCD_ON; //打开LCD右半屏的显示
010A E38F LDI R24,0x3F
010B 93802004 STS 0x2004,R24
(0076)
(0077) /*设置LCD显示的起始行*/
(0078) check_busy(0);
010D 2700 CLR R16
010E DFAF RCALL _check_busy
(0079) L_command=LCD_X; //LCD左半屏起始行为0
010F EC80 LDI R24,0xC0
0110 93802008 STS 0x2008,R24
(0080) check_busy(1);
0112 E001 LDI R16,1
0113 DFAA RCALL _check_busy
(0081) R_command=LCD_X; //LCD右半屏起始行为0
0114 EC80 LDI R24,0xC0
0115 93802004 STS 0x2004,R24
(0082) }
0117 9508 RET
(0083)
(0084) void init_devices(void)
(0085) {
(0086) XMCRA = 0x00; //外部存储器控制
_init_devices:
0118 2422 CLR R2
0119 9220006D STS 0x6D,R2
(0087) XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
011B E087 LDI R24,7
011C 9380006C STS 0x6C,R24
(0088) port_init();
011E DF98 RCALL _port_init
(0089) MCUCR = 0x80; //外部SRAM使能
011F E880 LDI R24,0x80
0120 BF85 OUT 0x35,R24
(0090) }
0121 9508 RET
_write_chineseH:
i --> R20
datas --> R22
y --> Y+4
page --> R18
cs --> R16
0122 940E01B0 CALL push_gset2
0124 816E LDD R22,Y+6
0125 817F LDD R23,Y+7
(0091)
(0092)
(0093) /*******************cs为左右屏选,page为页数选择(0~15)********************************
(0094) *******************y为水平位置选择(0~3),datas指针指向汉字存储的数组地址 ********************/
(0095)
(0096)
(0097) void write_chineseH(uchar cs,uchar page,uchar y,const unsigned char *datas) //上半部分显示
(0098) {
(0099) uchar i;
(0100) R_command=LCD_PAGE+page; //设置LCD右半屏页地址
0126 2F82 MOV R24,R18
0127 5488 SUBI R24,0x48
0128 93802004 STS 0x2004,R24
(0101) L_command=LCD_PAGE+page; //设置LCD左半屏页地址
012A 2F82 MOV R24,R18
012B 5488 SUBI R24,0x48
012C 93802008 STS 0x2008,R24
(0102) R_command=LCD_Y+y*16; //设置水平显示位置
012E E180 LDI R24,0x10
012F 800C LDD R0,Y+4
0130 9D80 MUL R24,R0
0131 2D80 MOV R24,R0
0132 5C80 SUBI R24,0xC0
0133 93802004 STS 0x2004,R24
(0103) L_command=LCD_Y+y*16;
0135 E180 LDI R24,0x10
0136 800C LDD R0,Y+4
0137 9D80 MUL R24,R0
0138 2D80 MOV R24,R0
0139 5C80 SUBI R24,0xC0
013A 93802008 STS 0x2008,R24
(0104) for(i=0;i<16;i++)
013C 2744 CLR R20
013D C00E RJMP 0x014C
(0105) {
(0106) if(cs) R_data=*datas; //右半屏显示
013E 2300 TST R16
013F F029 BEQ 0x0145
0140 01FB MOVW R30,R22
0141 91E4 LPM R30,0(Z)
0142 93E02006 STS 0x2006,R30
0144 C004 RJMP 0x0149
(0107) else L_data=*datas; //左半屏显示
0145 01FB MOVW R30,R22
0146 91E4 LPM R30,0(Z)
0147 93E0200A STS 0x200A,R30
(0108) *datas++;
0149 5F6F SUBI R22,0xFF
014A 4F7F SBCI R23,0xFF
014B 9543 INC R20
014C 3140 CPI R20,0x10
014D F380 BCS 0x013E
(0109) }
(0110) }
014E 940E0193 CALL pop_gset2
0150 9508 RET
_write_chineseL:
i --> R20
datas --> R22
y --> Y+6
page --> R20
cs --> R10
0151 940E01B4 CALL push_gset3
0153 2F42 MOV R20,R18
0154 2EA0 MOV R10,R16
0155 8568 LDD R22,Y+8
0156 8579 LDD R23,Y+9
(0111)
(0112) void write_chineseL(uchar cs,uchar page,uchar y,const unsigned char *datas) //下半部分显示
(0113) {
(0114) uchar i;
(0115) check_busy(1);
0157 E001 LDI R16,1
0158 DF65 RCALL _check_busy
(0116) R_command=LCD_PAGE+page; //设置LCD右半屏页地址
0159 2F84 MOV R24,R20
015A 5488 SUBI R24,0x48
015B 93802004 STS 0x2004,R24
(0117) L_command=LCD_PAGE+page; //设置LCD左半屏页地址
015D 2F84 MOV R24,R20
015E 5488 SUBI R24,0x48
015F 93802008 STS 0x2008,R24
(0118) R_command=LCD_Y+y*16; //设置水平显示位置
0161 E180 LDI R24,0x10
0162 800E LDD R0,Y+6
0163 9D80 MUL R24,R0
0164 2D80 MOV R24,R0
0165 5C80 SUBI R24,0xC0
0166 93802004 STS 0x2004,R24
(0119) L_command=LCD_Y+y*16;
0168 E180 LDI R24,0x10
0169 800E LDD R0,Y+6
016A 9D80 MUL R24,R0
016B 2D80 MOV R24,R0
016C 5C80 SUBI R24,0xC0
016D 93802008 STS 0x2008,R24
(0120) for(i=0;i<16;i++)
016F 2744 CLR R20
0170 C00E RJMP 0x017F
(0121) {
(0122) if(cs) R_data=*datas; //右半屏显示
0171 20AA TST R10
0172 F029 BEQ 0x0178
0173 01FB MOVW R30,R22
0174 91E4 LPM R30,0(Z)
0175 93E02006 STS 0x2006,R30
0177 C004 RJMP 0x017C
(0123) else L_data=*datas; //左半屏显示
0178 01FB MOVW R30,R22
0179 91E4 LPM R30,0(Z)
017A 93E0200A STS 0x200A,R30
(0124) *datas++;
017C 5F6F SUBI R22,0xFF
017D 4F7F SBCI R23,0xFF
017E 9543 INC R20
017F 3140 CPI R20,0x10
0180 F380 BCS 0x0171
(0125) }
(0126) }
0181 940E0196 CALL pop_gset3
0183 9508 RET
_main:
0184 9724 SBIW R28,4
(0127)
(0128) void main(void)
(0129) {
(0130) init_devices();
0185 DF92 RCALL _init_devices
(0131) LCD_Clean();
0186 DF48 RCALL _LCD_Clean
(0132) LCD_Init();
0187 DF71 RCALL _LCD_Init
(0133) write_chineseH(0,0,2,you1);
0188 E88C LDI R24,0x8C
0189 E090 LDI R25,0
018A 839B STD Y+3,R25
018B 838A STD Y+2,R24
018C E082 LDI R24,2
018D 8388 STD Y+0,R24
018E 2722 CLR R18
018F 2700 CLR R16
0190 DF91 RCALL _write_chineseH
(0134) // write_chineseL(0,1,2,you2);
(0135) // write_chineseH(1,0,0,hu1);
(0136) //write_chineseL(1,1,0,hu2);
(0137) }
FILE: <library>
0191 9624 ADIW R28,4
0192 9508 RET
pop_gset2:
0193 E0E2 LDI R30,2
0194 940C019D JMP pop
pop_gset3:
0196 E0E4 LDI R30,4
0197 940C019D JMP pop
push_gset1:
0199 935A ST R21,-Y
019A 934A ST R20,-Y
019B 9508 RET
pop_gset1:
019C E0E1 LDI R30,1
pop:
019D 9149 LD R20,Y+
019E 9159 LD R21,Y+
019F FDE0 SBRC R30,0
01A0 9508 RET
01A1 9169 LD R22,Y+
01A2 9179 LD R23,Y+
01A3 FDE1 SBRC R30,1
01A4 9508 RET
01A5 90A9 LD R10,Y+
01A6 90B9 LD R11,Y+
01A7 FDE2 SBRC R30,2
01A8 9508 RET
01A9 90C9 LD R12,Y+
01AA 90D9 LD R13,Y+
01AB FDE3 SBRC R30,3
01AC 9508 RET
01AD 90E9 LD R14,Y+
01AE 90F9 LD R15,Y+
01AF 9508 RET
push_gset2:
01B0 937A ST R23,-Y
01B1 936A ST R22,-Y
01B2 940C0199 JMP push_gset1
push_gset3:
01B4 92BA ST R11,-Y
01B5 92AA ST R10,-Y
01B6 940C01B0 JMP push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -