📄 lcd.lst
字号:
__text_start:
__start:
00E5 E5CF LDI R28,0x5F
00E6 E0D4 LDI R29,4
00E7 BFCD OUT 0x3D,R28
00E8 BFDE OUT 0x3E,R29
00E9 51C0 SUBI R28,0x10
00EA 40D0 SBCI R29,0
00EB EA0A LDI R16,0xAA
00EC 8308 STD Y+0,R16
00ED 2400 CLR R0
00EE E6E1 LDI R30,0x61
00EF E0F0 LDI R31,0
00F0 E010 LDI R17,0
00F1 36E2 CPI R30,0x62
00F2 07F1 CPC R31,R17
00F3 F011 BEQ 0x00F6
00F4 9201 ST R0,Z+
00F5 CFFB RJMP 0x00F1
00F6 8300 STD Z+0,R16
00F7 ECE8 LDI R30,0xC8
00F8 E0F1 LDI R31,1
00F9 E6A0 LDI R26,0x60
00FA E0B0 LDI R27,0
00FB E011 LDI R17,1
00FC 3CE9 CPI R30,0xC9
00FD 07F1 CPC R31,R17
00FE F021 BEQ 0x0103
00FF 95C8 LPM
0100 9631 ADIW R30,1
0101 920D ST R0,X+
0102 CFF9 RJMP 0x00FC
0103 940E0218 CALL _main
_exit:
0105 CFFF RJMP _exit
FILE: F:\单片机源程序\AVR单片机程序\Mega128\LCD128~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 char
(0007)
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "char.h"
(0011) #include "lcd.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:
0106 2422 CLR R2
0107 BA2B OUT 0x1B,R2
(0021) DDRA = 0x00;
0108 BA2A OUT 0x1A,R2
(0022) PORTC = 0x00;
0109 BA25 OUT 0x15,R2
(0023) DDRC = 0xFF;
010A EF8F LDI R24,0xFF
010B BB84 OUT 0x14,R24
010C 9508 RET
_check_busy:
temp --> R20
cs --> R16
010D 940E0228 CALL push_gset1
(0024) }
(0025)
(0026) void check_busy(uchar cs)
(0027) {
010F C009 RJMP 0x0119
(0028) uchar temp;
(0029) while(temp)
(0030) {
(0031) if(cs)
0110 2300 TST R16
0111 F021 BEQ 0x0116
(0032) temp=R_staus&0X80; //将忙状态读到temp中进行确定
0112 91402005 LDS R20,0x2005
0114 7840 ANDI R20,0x80
0115 C003 RJMP 0x0119
(0033) else
(0034) temp=L_staus&0X80;
0116 91402009 LDS R20,0x2009
0118 7840 ANDI R20,0x80
0119 2344 TST R20
011A F7A9 BNE 0x0110
011B 940E022B CALL pop_gset1
011D 9508 RET
_LCD_Clean:
page --> R20
y --> R22
011E 940E0226 CALL push_gset2
(0035) }
(0036) }
(0037)
(0038) void LCD_Clean(void)
(0039) {
(0040) unsigned char page=0,y; //定义表示页和列的局部变量
0120 2744 CLR R20
(0041)
(0042) for(page=0;page<8;page++)
0121 C021 RJMP 0x0143
(0043) {
(0044) //LCD左半屏的操作
(0045) check_busy(0);
0122 2700 CLR R16
0123 DFE9 RCALL _check_busy
(0046) L_command=LCD_PAGE+page; //设置LCD左半屏页地址
0124 2F84 MOV R24,R20
0125 5488 SUBI R24,0x48
0126 93802008 STS 0x2008,R24
(0047) check_busy(0);
0128 2700 CLR R16
0129 DFE3 RCALL _check_busy
(0048) L_command=LCD_Y;
012A E480 LDI R24,0x40
012B 93802008 STS 0x2008,R24
(0049) //LCD右半屏的操作
(0050) check_busy(1);
012D E001 LDI R16,1
012E DFDE RCALL _check_busy
(0051) R_command=LCD_PAGE+page; //设置LCD右半屏页地址
012F 2F84 MOV R24,R20
0130 5488 SUBI R24,0x48
0131 93802004 STS 0x2004,R24
(0052) check_busy(1);
0133 E001 LDI R16,1
0134 DFD8 RCALL _check_busy
(0053) R_command=LCD_Y;
0135 E480 LDI R24,0x40
0136 93802004 STS 0x2004,R24
(0054)
(0055) for(y=0;y<64;y++)
0138 2766 CLR R22
0139 C006 RJMP 0x0140
(0056) {
(0057) L_data=0x00;
013A 2422 CLR R2
013B 9220200A STS 0x200A,R2
(0058) R_data=0x00;
013D 92202006 STS 0x2006,R2
013F 9563 INC R22
0140 3460 CPI R22,0x40
0141 F3C0 BCS 0x013A
0142 9543 INC R20
0143 3048 CPI R20,0x8
0144 F2E8 BCS 0x0122
0145 940E021D CALL pop_gset2
0147 9508 RET
(0059) }
(0060) }
(0061) }
(0062)
(0063) void LCD_Init(void) //LCD初始化子函数
(0064) {
(0065) /*首先关闭12864的显示*/
(0066) check_busy(0); //LCD左半屏正在工作,等待......
_LCD_Init:
0148 2700 CLR R16
0149 DFC3 RCALL _check_busy
(0067) L_command=LCD_OFF; //先关闭LCD左半屏的显示
014A E38E LDI R24,0x3E
014B 93802008 STS 0x2008,R24
(0068) check_busy(1); //LCD右半屏正在工作,等待......
014D E001 LDI R16,1
014E DFBE RCALL _check_busy
(0069) R_command=LCD_OFF; //先关闭LCD右半屏的显示
014F E38E LDI R24,0x3E
0150 93802004 STS 0x2004,R24
(0070)
(0071) /*开启12864的显示*/
(0072) check_busy(0);
0152 2700 CLR R16
0153 DFB9 RCALL _check_busy
(0073) L_command=LCD_ON; //打开LCD左半屏的显示
0154 E38F LDI R24,0x3F
0155 93802008 STS 0x2008,R24
(0074) check_busy(1);
0157 E001 LDI R16,1
0158 DFB4 RCALL _check_busy
(0075) R_command=LCD_ON; //打开LCD右半屏的显示
0159 E38F LDI R24,0x3F
015A 93802004 STS 0x2004,R24
(0076)
(0077) /*设置LCD显示的起始行*/
(0078) check_busy(0);
015C 2700 CLR R16
015D DFAF RCALL _check_busy
(0079) L_command=LCD_X; //LCD左半屏起始行为0
015E EC80 LDI R24,0xC0
015F 93802008 STS 0x2008,R24
(0080) check_busy(1);
0161 E001 LDI R16,1
0162 DFAA RCALL _check_busy
(0081) R_command=LCD_X; //LCD右半屏起始行为0
0163 EC80 LDI R24,0xC0
0164 93802004 STS 0x2004,R24
0166 9508 RET
(0082) }
(0083)
(0084) void init_devices(void)
(0085) {
(0086) XMCRA = 0x00; //外部存储器控制
_init_devices:
0167 2422 CLR R2
0168 9220006D STS 0x6D,R2
(0087) XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
016A E087 LDI R24,7
016B 9380006C STS 0x6C,R24
(0088) // mapping_init();
(0089) port_init();
016D DF98 RCALL _port_init
(0090) MCUCR = 0x80; //外部SRAM使能
016E E880 LDI R24,0x80
016F BF85 OUT 0x35,R24
0170 9508 RET
_write_Bchar:
i --> R20
n --> R18
cs --> R16
0171 940E0228 CALL push_gset1
(0091) }
(0092)
(0093) void write_Bchar(unsigned char cs,unsigned char n) // 大写字母显示函数
(0094) {
(0095) unsigned char i;
(0096) for(i=0;i<6;i++)
0173 2744 CLR R20
0174 C020 RJMP 0x0195
(0097) {
(0098) if(cs) R_data=big_char[n][i]; //右半屏显示
0175 2300 TST R16
0176 F079 BEQ 0x0186
0177 E086 LDI R24,6
0178 9F82 MUL R24,R18
0179 0110 MOVW R2,R0
017A E980 LDI R24,0x90
017B E090 LDI R25,0
017C 0E28 ADD R2,R24
017D 1E39 ADC R3,R25
017E 2FE4 MOV R30,R20
017F 27FF CLR R31
0180 0DE2 ADD R30,R2
0181 1DF3 ADC R31,R3
0182 91E4 LPM R30,0(Z)
0183 93E02006 STS 0x2006,R30
0185 C00E RJMP 0x0194
(0099) else L_data=big_char[n][i]; //左半屏显示
0186 E086 LDI R24,6
0187 9F82 MUL R24,R18
0188 0110 MOVW R2,R0
0189 E980 LDI R24,0x90
018A E090 LDI R25,0
018B 0E28 ADD R2,R24
018C 1E39 ADC R3,R25
018D 2FE4 MOV R30,R20
018E 27FF CLR R31
018F 0DE2 ADD R30,R2
0190 1DF3 ADC R31,R3
0191 91E4 LPM R30,0(Z)
0192 93E0200A STS 0x200A,R30
0194 9543 INC R20
0195 3046 CPI R20,6
0196 F2F0 BCS 0x0175
0197 940E022B CALL pop_gset1
0199 9508 RET
_write_Schar:
i --> R20
n --> R18
cs --> R16
019A 940E0228 CALL push_gset1
(0100) }
(0101) }
(0102)
(0103) void write_Schar(unsigned char cs,unsigned char n) // 小写字母显示函数
(0104) {
(0105) unsigned char i;
(0106) for(i=0;i<6;i++)
019C 2744 CLR R20
019D C020 RJMP 0x01BE
(0107) {
(0108) if(cs) R_data=small_char[n][i]; //右半屏显示
019E 2300 TST R16
019F F079 BEQ 0x01AF
01A0 E086 LDI R24,6
01A1 9F82 MUL R24,R18
01A2 0110 MOVW R2,R0
01A3 E28C LDI R24,0x2C
01A4 E091 LDI R25,1
01A5 0E28 ADD R2,R24
01A6 1E39 ADC R3,R25
01A7 2FE4 MOV R30,R20
01A8 27FF CLR R31
01A9 0DE2 ADD R30,R2
01AA 1DF3 ADC R31,R3
01AB 91E4 LPM R30,0(Z)
01AC 93E02006 STS 0x2006,R30
01AE C00E RJMP 0x01BD
(0109) else L_data=small_char[n][i]; //左半屏显示
01AF E086 LDI R24,6
01B0 9F82 MUL R24,R18
01B1 0110 MOVW R2,R0
01B2 E28C LDI R24,0x2C
01B3 E091 LDI R25,1
01B4 0E28 ADD R2,R24
01B5 1E39 ADC R3,R25
01B6 2FE4 MOV R30,R20
01B7 27FF CLR R31
01B8 0DE2 ADD R30,R2
01B9 1DF3 ADC R31,R3
01BA 91E4 LPM R30,0(Z)
01BB 93E0200A STS 0x200A,R30
01BD 9543 INC R20
01BE 3046 CPI R20,6
01BF F2F0 BCS 0x019E
01C0 940E022B CALL pop_gset1
01C2 9508 RET
_write_Nchar:
i --> R20
n --> R18
cs --> R16
01C3 940E0228 CALL push_gset1
(0110) }
(0111) }
(0112)
(0113) void write_Nchar(unsigned char cs,unsigned char n) //数字显示函数
(0114) {
(0115) unsigned char i;
(0116) for(i=0;i<6;i++)
01C5 2744 CLR R20
01C6 C020 RJMP 0x01E7
(0117) {
(0118) if(cs) R_data=num[n][i]; //右半屏显示
01C7 2300 TST R16
01C8 F079 BEQ 0x01D8
01C9 E086 LDI R24,6
01CA 9F82 MUL R24,R18
01CB 0110 MOVW R2,R0
01CC E584 LDI R24,0x54
01CD E090 LDI R25,0
01CE 0E28 ADD R2,R24
01CF 1E39 ADC R3,R25
01D0 2FE4 MOV R30,R20
01D1 27FF CLR R31
01D2 0DE2 ADD R30,R2
01D3 1DF3 ADC R31,R3
01D4 91E4 LPM R30,0(Z)
01D5 93E02006 STS 0x2006,R30
01D7 C00E RJMP 0x01E6
(0119) else L_data=num[n][i]; //左半屏显示
01D8 E086 LDI R24,6
01D9 9F82 MUL R24,R18
01DA 0110 MOVW R2,R0
01DB E584 LDI R24,0x54
01DC E090 LDI R25,0
01DD 0E28 ADD R2,R24
01DE 1E39 ADC R3,R25
01DF 2FE4 MOV R30,R20
01E0 27FF CLR R31
01E1 0DE2 ADD R30,R2
01E2 1DF3 ADC R31,R3
01E3 91E4 LPM R30,0(Z)
01E4 93E0200A STS 0x200A,R30
01E6 9543 INC R20
01E7 3046 CPI R20,6
01E8 F2F0 BCS 0x01C7
01E9 940E022B CALL pop_gset1
01EB 9508 RET
_display_char:
i --> R20
01EC 940E0228 CALL push_gset1
(0120) }
(0121) }
(0122)
(0123) void display_char(void) //字符显示函数
(0124) {
(0125) unsigned char i;
(0126) static unsigned char adder=0;
(0127) write_Bchar(0, 24);
01EE E128 LDI R18,0x18
01EF 2700 CLR R16
01F0 DF80 RCALL _write_Bchar
(0128) write_Schar(0, 14);
01F1 E02E LDI R18,0xE
01F2 2700 CLR R16
01F3 DFA6 RCALL _write_Schar
(0129) write_Schar(0, 20);
01F4 E124 LDI R18,0x14
01F5 2700 CLR R16
01F6 DFA3 RCALL _write_Schar
(0130) for(i=0;i<4;i++){L_data=0x00;}
01F7 2744 CLR R20
01F8 C004 RJMP 0x01FD
01F9 2422 CLR R2
01FA 9220200A STS 0x200A,R2
01FC 9543 INC R20
01FD 3044 CPI R20,4
01FE F3D0 BCS 0x01F9
(0131) write_Bchar(0, 7);
01FF E027 LDI R18,7
0200 2700 CLR R16
0201 DF6F RCALL _write_Bchar
(0132) write_Schar(0, 20);
0202 E124 LDI R18,0x14
0203 2700 CLR R16
0204 DF95 RCALL _write_Schar
(0133) adder++;
0205 91800060 LDS R24,adder
0207 5F8F SUBI R24,0xFF
0208 93800060 STS adder,R24
(0134) if(adder>15){flag=1;adder=0;}
020A E08F LDI R24,0xF
020B 90200060 LDS R2,adder
020D 1582 CP R24,R2
020E F430 BCC 0x0215
020F E081 LDI R24,1
0210 93800061 STS flag,R24
0212 2422 CLR R2
0213 92200060 STS adder,R2
0215 940E022B CALL pop_gset1
0217 9508 RET
(0135) }
(0136)
(0137)
(0138) void main(void)
(0139) {
(0140) unsigned char i;
(0141) init_devices();
_main:
i --> Y+1
0218 DF4E RCALL _init_devices
(0142) LCD_Clean();
0219 DF04 RCALL _LCD_Clean
(0143) LCD_Init();
021A DF2D RCALL _LCD_Init
(0144) display_char();
FILE: <library>
021B DFD0 RCALL _display_char
021C 9508 RET
pop_gset2:
021D E0E2 LDI R30,2
021E 940C022C JMP pop
push_gset5:
0220 92FA ST R15,-Y
0221 92EA ST R14,-Y
push_gset4:
0222 92DA ST R13,-Y
0223 92CA ST R12,-Y
push_gset3:
0224 92BA ST R11,-Y
0225 92AA ST R10,-Y
push_gset2:
0226 937A ST R23,-Y
0227 936A ST R22,-Y
push_gset1:
0228 935A ST R21,-Y
0229 934A ST R20,-Y
022A 9508 RET
pop_gset1:
022B E0E1 LDI R30,1
pop:
022C 9149 LD R20,Y+
022D 9159 LD R21,Y+
022E FDE0 SBRC R30,0
022F 9508 RET
0230 9169 LD R22,Y+
0231 9179 LD R23,Y+
0232 FDE1 SBRC R30,1
0233 9508 RET
0234 90A9 LD R10,Y+
0235 90B9 LD R11,Y+
0236 FDE2 SBRC R30,2
0237 9508 RET
0238 90C9 LD R12,Y+
0239 90D9 LD R13,Y+
023A FDE3 SBRC R30,3
023B 9508 RET
023C 90E9 LD R14,Y+
023D 90F9 LD R15,Y+
023E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -