📄 lcd.lst
字号:
__text_start:
__start:
007A E5CF LDI R28,0x5F
007B E0D4 LDI R29,4
007C BFCD OUT 0x3D,R28
007D BFDE OUT 0x3E,R29
007E 51C0 SUBI R28,0x10
007F 40D0 SBCI R29,0
0080 EA0A LDI R16,0xAA
0081 8308 STD Y+0,R16
0082 2400 CLR R0
0083 E6E0 LDI R30,0x60
0084 E0F0 LDI R31,0
0085 E010 LDI R17,0
0086 36E1 CPI R30,0x61
0087 07F1 CPC R31,R17
0088 F011 BEQ 0x008B
0089 9201 ST R0,Z+
008A CFFB RJMP 0x0086
008B 8300 STD Z+0,R16
008C EFE4 LDI R30,0xF4
008D E0F0 LDI R31,0
008E E6A0 LDI R26,0x60
008F E0B0 LDI R27,0
0090 E010 LDI R17,0
0091 3FE4 CPI R30,0xF4
0092 07F1 CPC R31,R17
0093 F021 BEQ 0x0098
0094 95C8 LPM
0095 9631 ADIW R30,1
0096 920D ST R0,X+
0097 CFF9 RJMP 0x0091
0098 940E0168 CALL _main
_exit:
009A CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\LCD128~1\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 chinese
(0007) // 纵向取模方式 16*16字体
(0008)
(0009) #include <iom128v.h>
(0010) #include <macros.h>
(0011) #include "chinese.h"
(0012) #include "lcd.h"
(0013) typedef unsigned char uchar;
(0014) typedef unsigned int uint;
(0015)
(0016) unsigned char flag;
(0017)
(0018) void port_init(void)
(0019) {
(0020) //访问外部ram的总线端口
(0021) PORTA = 0x00;
_port_init:
009B 2422 CLR R2
009C BA2B OUT 0x1B,R2
(0022) DDRA = 0x00;
009D BA2A OUT 0x1A,R2
(0023) PORTC = 0x00;
009E BA25 OUT 0x15,R2
(0024) DDRC = 0xFF;
009F EF8F LDI R24,0xFF
00A0 BB84 OUT 0x14,R24
00A1 9508 RET
_check_busy:
temp --> R20
cs --> R16
00A2 940E01A0 CALL push_gset1
(0025) }
(0026)
(0027) void check_busy(uchar cs) //查忙函数
(0028) {
00A4 C009 RJMP 0x00AE
(0029) uchar temp;
(0030) while(temp)
(0031) {
(0032) if(cs)
00A5 2300 TST R16
00A6 F021 BEQ 0x00AB
(0033) temp=R_staus&0X80; //将忙状态读到temp中进行确定
00A7 91402005 LDS R20,0x2005
00A9 7840 ANDI R20,0x80
00AA C003 RJMP 0x00AE
(0034) else
(0035) temp=L_staus&0X80;
00AB 91402009 LDS R20,0x2009
00AD 7840 ANDI R20,0x80
00AE 2344 TST R20
00AF F7A9 BNE 0x00A5
00B0 940E01A3 CALL pop_gset1
00B2 9508 RET
_LCD_Clean:
page --> R20
y --> R22
00B3 940E019E CALL push_gset2
(0036) }
(0037) }
(0038)
(0039) void LCD_Clean(void)
(0040) {
(0041) unsigned char page=0,y; //定义表示页和列的局部变量
00B5 2744 CLR R20
(0042)
(0043) for(page=0;page<8;page++)
00B6 C021 RJMP 0x00D8
(0044) {
(0045) //LCD左半屏的操作
(0046) check_busy(0);
00B7 2700 CLR R16
00B8 DFE9 RCALL _check_busy
(0047) L_command=LCD_PAGE+page; //设置LCD左半屏页地址
00B9 2F84 MOV R24,R20
00BA 5488 SUBI R24,0x48
00BB 93802008 STS 0x2008,R24
(0048) check_busy(0);
00BD 2700 CLR R16
00BE DFE3 RCALL _check_busy
(0049) L_command=LCD_Y;
00BF E480 LDI R24,0x40
00C0 93802008 STS 0x2008,R24
(0050) //LCD右半屏的操作
(0051) check_busy(1);
00C2 E001 LDI R16,1
00C3 DFDE RCALL _check_busy
(0052) R_command=LCD_PAGE+page; //设置LCD右半屏页地址
00C4 2F84 MOV R24,R20
00C5 5488 SUBI R24,0x48
00C6 93802004 STS 0x2004,R24
(0053) check_busy(1);
00C8 E001 LDI R16,1
00C9 DFD8 RCALL _check_busy
(0054) R_command=LCD_Y;
00CA E480 LDI R24,0x40
00CB 93802004 STS 0x2004,R24
(0055)
(0056) for(y=0;y<64;y++)
00CD 2766 CLR R22
00CE C006 RJMP 0x00D5
(0057) {
(0058) L_data=0x00;
00CF 2422 CLR R2
00D0 9220200A STS 0x200A,R2
(0059) R_data=0x00;
00D2 92202006 STS 0x2006,R2
00D4 9563 INC R22
00D5 3460 CPI R22,0x40
00D6 F3C0 BCS 0x00CF
00D7 9543 INC R20
00D8 3048 CPI R20,0x8
00D9 F2E8 BCS 0x00B7
00DA 940E0192 CALL pop_gset2
00DC 9508 RET
(0060) }
(0061) }
(0062) }
(0063)
(0064) void LCD_Init(void) //LCD初始化子函数
(0065) {
(0066) /*首先关闭12864的显示*/
(0067) check_busy(0); //LCD左半屏正在工作,等待......
_LCD_Init:
00DD 2700 CLR R16
00DE DFC3 RCALL _check_busy
(0068) L_command=LCD_OFF; //先关闭LCD左半屏的显示
00DF E38E LDI R24,0x3E
00E0 93802008 STS 0x2008,R24
(0069) check_busy(1); //LCD右半屏正在工作,等待......
00E2 E001 LDI R16,1
00E3 DFBE RCALL _check_busy
(0070) R_command=LCD_OFF; //先关闭LCD右半屏的显示
00E4 E38E LDI R24,0x3E
00E5 93802004 STS 0x2004,R24
(0071)
(0072) /*开启12864的显示*/
(0073) check_busy(0);
00E7 2700 CLR R16
00E8 DFB9 RCALL _check_busy
(0074) L_command=LCD_ON; //打开LCD左半屏的显示
00E9 E38F LDI R24,0x3F
00EA 93802008 STS 0x2008,R24
(0075) check_busy(1);
00EC E001 LDI R16,1
00ED DFB4 RCALL _check_busy
(0076) R_command=LCD_ON; //打开LCD右半屏的显示
00EE E38F LDI R24,0x3F
00EF 93802004 STS 0x2004,R24
(0077)
(0078) /*设置LCD显示的起始行*/
(0079) check_busy(0);
00F1 2700 CLR R16
00F2 DFAF RCALL _check_busy
(0080) L_command=LCD_X; //LCD左半屏起始行为0
00F3 EC80 LDI R24,0xC0
00F4 93802008 STS 0x2008,R24
(0081) check_busy(1);
00F6 E001 LDI R16,1
00F7 DFAA RCALL _check_busy
(0082) R_command=LCD_X; //LCD右半屏起始行为0
00F8 EC80 LDI R24,0xC0
00F9 93802004 STS 0x2004,R24
00FB 9508 RET
(0083) }
(0084)
(0085) void init_devices(void)
(0086) {
(0087) XMCRA = 0x00; //外部存储器控制
_init_devices:
00FC 2422 CLR R2
00FD 9220006D STS 0x6D,R2
(0088) XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
00FF E087 LDI R24,7
0100 9380006C STS 0x6C,R24
(0089) port_init();
0102 DF98 RCALL _port_init
(0090) MCUCR = 0x80; //外部SRAM使能
0103 E880 LDI R24,0x80
0104 BF85 OUT 0x35,R24
0105 9508 RET
_write_chineseH:
i --> R20
datas --> R22
y --> Y+4
page --> R18
cs --> R16
0106 940E019E CALL push_gset2
0108 816E LDD R22,Y+6
0109 817F LDD R23,Y+7
(0091) }
(0092)
(0093)
(0094) /*******************cs为左右屏选,page为页数选择(0~15)********************************
(0095) *******************y为水平位置选择(0~3),datas指针指向汉字存储的数组地址 ********************/
(0096)
(0097)
(0098) void write_chineseH(uchar cs,uchar page,uchar y,const unsigned char *datas) //上半部分显示
(0099) {
(0100) uchar i;
(0101) R_command=LCD_PAGE+page; //设置LCD右半屏页地址
010A 2F82 MOV R24,R18
010B 5488 SUBI R24,0x48
010C 93802004 STS 0x2004,R24
(0102) L_command=LCD_PAGE+page; //设置LCD左半屏页地址
010E 2F82 MOV R24,R18
010F 5488 SUBI R24,0x48
0110 93802008 STS 0x2008,R24
(0103) R_command=LCD_Y+y*16; //设置水平显示位置
0112 E180 LDI R24,0x10
0113 800C LDD R0,Y+4
0114 9D80 MUL R24,R0
0115 2D80 MOV R24,R0
0116 5C80 SUBI R24,0xC0
0117 93802004 STS 0x2004,R24
(0104) L_command=LCD_Y+y*16;
0119 E180 LDI R24,0x10
011A 800C LDD R0,Y+4
011B 9D80 MUL R24,R0
011C 2D80 MOV R24,R0
011D 5C80 SUBI R24,0xC0
011E 93802008 STS 0x2008,R24
(0105) for(i=0;i<16;i++)
0120 2744 CLR R20
0121 C00E RJMP 0x0130
(0106) {
(0107) if(cs) R_data=*datas; //右半屏显示
0122 2300 TST R16
0123 F029 BEQ 0x0129
0124 01FB MOVW R30,R22
0125 91E4 LPM R30,0(Z)
0126 93E02006 STS 0x2006,R30
0128 C004 RJMP 0x012D
(0108) else L_data=*datas; //左半屏显示
0129 01FB MOVW R30,R22
012A 91E4 LPM R30,0(Z)
012B 93E0200A STS 0x200A,R30
(0109) *datas++;
012D 5F6F SUBI R22,0xFF
012E 4F7F SBCI R23,0xFF
012F 9543 INC R20
0130 3140 CPI R20,0x10
0131 F380 BCS 0x0122
0132 940E0192 CALL pop_gset2
0134 9508 RET
_write_chineseL:
i --> R20
datas --> R22
y --> Y+6
page --> R20
cs --> R10
0135 940E019C CALL push_gset3
0137 2F42 MOV R20,R18
0138 2EA0 MOV R10,R16
0139 8568 LDD R22,Y+8
013A 8579 LDD R23,Y+9
(0110) }
(0111) }
(0112)
(0113) void write_chineseL(uchar cs,uchar page,uchar y,const unsigned char *datas) //下半部分显示
(0114) {
(0115) uchar i;
(0116) check_busy(1);
013B E001 LDI R16,1
013C DF65 RCALL _check_busy
(0117) R_command=LCD_PAGE+page; //设置LCD右半屏页地址
013D 2F84 MOV R24,R20
013E 5488 SUBI R24,0x48
013F 93802004 STS 0x2004,R24
(0118) L_command=LCD_PAGE+page; //设置LCD左半屏页地址
0141 2F84 MOV R24,R20
0142 5488 SUBI R24,0x48
0143 93802008 STS 0x2008,R24
(0119) R_command=LCD_Y+y*16; //设置水平显示位置
0145 E180 LDI R24,0x10
0146 800E LDD R0,Y+6
0147 9D80 MUL R24,R0
0148 2D80 MOV R24,R0
0149 5C80 SUBI R24,0xC0
014A 93802004 STS 0x2004,R24
(0120) L_command=LCD_Y+y*16;
014C E180 LDI R24,0x10
014D 800E LDD R0,Y+6
014E 9D80 MUL R24,R0
014F 2D80 MOV R24,R0
0150 5C80 SUBI R24,0xC0
0151 93802008 STS 0x2008,R24
(0121) for(i=0;i<16;i++)
0153 2744 CLR R20
0154 C00E RJMP 0x0163
(0122) {
(0123) if(cs) R_data=*datas; //右半屏显示
0155 20AA TST R10
0156 F029 BEQ 0x015C
0157 01FB MOVW R30,R22
0158 91E4 LPM R30,0(Z)
0159 93E02006 STS 0x2006,R30
015B C004 RJMP 0x0160
(0124) else L_data=*datas; //左半屏显示
015C 01FB MOVW R30,R22
015D 91E4 LPM R30,0(Z)
015E 93E0200A STS 0x200A,R30
(0125) *datas++;
0160 5F6F SUBI R22,0xFF
0161 4F7F SBCI R23,0xFF
0162 9543 INC R20
0163 3140 CPI R20,0x10
0164 F380 BCS 0x0155
0165 940E0195 CALL pop_gset3
0167 9508 RET
_main:
0168 9724 SBIW R28,4
(0126) }
(0127) }
(0128)
(0129) void main(void)
(0130) {
(0131) init_devices();
0169 DF92 RCALL _init_devices
(0132) LCD_Clean();
016A DF48 RCALL _LCD_Clean
(0133) LCD_Init();
016B DF71 RCALL _LCD_Init
(0134) write_chineseH(0,0,2,you1);
016C E584 LDI R24,0x54
016D E090 LDI R25,0
016E 839B STD Y+3,R25
016F 838A STD Y+2,R24
0170 E082 LDI R24,2
0171 8388 STD Y+0,R24
0172 2722 CLR R18
0173 2700 CLR R16
0174 DF91 RCALL _write_chineseH
(0135) write_chineseL(0,1,2,you2);
0175 E684 LDI R24,0x64
0176 E090 LDI R25,0
0177 839B STD Y+3,R25
0178 838A STD Y+2,R24
0179 E082 LDI R24,2
017A 8388 STD Y+0,R24
017B E021 LDI R18,1
017C 2700 CLR R16
017D DFB7 RCALL _write_chineseL
(0136) write_chineseH(1,0,0,hu1);
017E ED84 LDI R24,0xD4
017F E090 LDI R25,0
0180 839B STD Y+3,R25
0181 838A STD Y+2,R24
0182 2422 CLR R2
0183 8228 STD Y+0,R2
0184 2722 CLR R18
0185 E001 LDI R16,1
0186 DF7F RCALL _write_chineseH
(0137) write_chineseL(1,1,0,hu2);
FILE: <library>
0187 EE84 LDI R24,0xE4
0188 E090 LDI R25,0
0189 839B STD Y+3,R25
018A 838A STD Y+2,R24
018B 2422 CLR R2
018C 8228 STD Y+0,R2
018D E021 LDI R18,1
018E E001 LDI R16,1
018F DFA5 RCALL _write_chineseL
0190 9624 ADIW R28,4
0191 9508 RET
pop_gset2:
0192 E0E2 LDI R30,2
0193 940C01A4 JMP pop
pop_gset3:
0195 E0E4 LDI R30,4
0196 940C01A4 JMP pop
push_gset5:
0198 92FA ST R15,-Y
0199 92EA ST R14,-Y
push_gset4:
019A 92DA ST R13,-Y
019B 92CA ST R12,-Y
push_gset3:
019C 92BA ST R11,-Y
019D 92AA ST R10,-Y
push_gset2:
019E 937A ST R23,-Y
019F 936A ST R22,-Y
push_gset1:
01A0 935A ST R21,-Y
01A1 934A ST R20,-Y
01A2 9508 RET
pop_gset1:
01A3 E0E1 LDI R30,1
pop:
01A4 9149 LD R20,Y+
01A5 9159 LD R21,Y+
01A6 FDE0 SBRC R30,0
01A7 9508 RET
01A8 9169 LD R22,Y+
01A9 9179 LD R23,Y+
01AA FDE1 SBRC R30,1
01AB 9508 RET
01AC 90A9 LD R10,Y+
01AD 90B9 LD R11,Y+
01AE FDE2 SBRC R30,2
01AF 9508 RET
01B0 90C9 LD R12,Y+
01B1 90D9 LD R13,Y+
01B2 FDE3 SBRC R30,3
01B3 9508 RET
01B4 90E9 LD R14,Y+
01B5 90F9 LD R15,Y+
01B6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -