📄 ds12887.lst
字号:
__text_start:
__start:
00FE EFCF LDI R28,0xFF
00FF E1D0 LDI R29,0x10
0100 BFCD OUT 0x3D,R28
0101 BFDE OUT 0x3E,R29
0102 51C0 SUBI R28,0x10
0103 40D0 SBCI R29,0
0104 EA0A LDI R16,0xAA
0105 8308 STD Y+0,R16
0106 2400 CLR R0
0107 E7E0 LDI R30,0x70
0108 E0F2 LDI R31,2
0109 E012 LDI R17,2
010A 38E5 CPI R30,0x85
010B 07F1 CPC R31,R17
010C F011 BEQ 0x010F
010D 9201 ST R0,Z+
010E CFFB RJMP 0x010A
010F 8300 STD Z+0,R16
0110 E8EC LDI R30,0x8C
0111 E0F0 LDI R31,0
0112 E0A0 LDI R26,0
0113 E0B1 LDI R27,1
0114 E011 LDI R17,1
0115 3FEC CPI R30,0xFC
0116 07F1 CPC R31,R17
0117 F021 BEQ 0x011C
0118 95C8 LPM
0119 9631 ADIW R30,1
011A 920D ST R0,X+
011B CFF9 RJMP 0x0115
011C 940E040F CALL _main
_exit:
011E CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\USING07-07\Mega128\12c887\lcd.c
(0001) #include <iom128v.h>
(0002) #include <macros.h>
(0003) #include "lcd.h"
(0004) typedef unsigned char uchar;
(0005) typedef unsigned int uint;
(0006)
(0007) void port_init(void)
(0008) {
(0009) //访问外部ram的总线端口
(0010) PORTA = 0x00;
_port_init:
011F 2422 CLR R2
0120 BA2B OUT 0x1B,R2
(0011) DDRA = 0x00;
0121 BA2A OUT 0x1A,R2
(0012) PORTC = 0x00;
0122 BA25 OUT 0x15,R2
(0013) DDRC = 0xFF;
0123 EF8F LDI R24,0xFF
0124 BB84 OUT 0x14,R24
0125 9508 RET
_check_busy:
temp --> R20
cs --> R16
0126 940E048F CALL push_gset1
(0014) }
(0015)
(0016) void check_busy(uchar cs)
(0017) {
0128 C009 RJMP 0x0132
(0018) uchar temp;
(0019) while(temp)
(0020) {
(0021) if(cs)
0129 2300 TST R16
012A F021 BEQ 0x012F
(0022) temp=R_staus&0X80; //将忙状态读到temp中进行确定
012B 91409900 LDS R20,0x9900
012D 7840 ANDI R20,0x80
012E C003 RJMP 0x0132
(0023) else
(0024) temp=L_staus&0X80;
012F 91409500 LDS R20,0x9500
0131 7840 ANDI R20,0x80
0132 2344 TST R20
0133 F7A9 BNE 0x0129
0134 940E0492 CALL pop_gset1
0136 9508 RET
_lcdcommand:
com --> R20
cs --> R22
0137 940E048D CALL push_gset2
0139 2F42 MOV R20,R18
013A 2F60 MOV R22,R16
(0025) }
(0026) }
(0027)
(0028)
(0029) void lcdcommand(uchar cs,uchar com)
(0030) {
(0031) if(cs)
013B 2366 TST R22
013C F029 BEQ 0x0142
(0032) {
(0033) check_busy(1);
013D E001 LDI R16,1
013E DFE7 RCALL _check_busy
(0034) R_command=com;
013F 93409800 STS 0x9800,R20
(0035) }
0141 C004 RJMP 0x0146
(0036) else
(0037) {
(0038) check_busy(0);
0142 2700 CLR R16
0143 DFE2 RCALL _check_busy
(0039) L_command=com;
0144 93409400 STS 0x9400,R20
(0040) }
0146 940E047E CALL pop_gset2
0148 9508 RET
_lcddatas:
dd --> R20
cs --> R22
0149 940E048D CALL push_gset2
014B 2F42 MOV R20,R18
014C 2F60 MOV R22,R16
(0041) }
(0042)
(0043) /*************************向LCD写数据函数*************************/
(0044)
(0045) void lcddatas(char cs,uchar dd)
(0046) {
(0047) if(cs)
014D 2366 TST R22
014E F029 BEQ 0x0154
(0048) {
(0049) check_busy(1);
014F E001 LDI R16,1
0150 DFD5 RCALL _check_busy
(0050) R_data=dd;
0151 93409A00 STS 0x9A00,R20
(0051) }
0153 C004 RJMP 0x0158
(0052) else
(0053) {
(0054) check_busy(0);
0154 2700 CLR R16
0155 DFD0 RCALL _check_busy
(0055) L_data=dd;
0156 93409600 STS 0x9600,R20
(0056) }
0158 940E047E CALL pop_gset2
015A 9508 RET
_LCD_Clean:
x --> R20
y --> R22
015B 940E048D CALL push_gset2
(0057) }
(0058)
(0059) /**************************** LCD清屏函数*******************************/
(0060)
(0061) void LCD_Clean(void)
(0062) {
(0063) unsigned char x,y;
(0064) for(x=0xb8;x<=0xbf;x++) //一页一页的写
015D EB48 LDI R20,0xB8
015E C018 RJMP 0x0177
(0065) {
(0066) lcdcommand(0,x);
015F 2F24 MOV R18,R20
0160 2700 CLR R16
0161 DFD5 RCALL _lcdcommand
(0067) lcdcommand(1,x); //设定X方向地址,X地址不能自增。要靠程序加
0162 2F24 MOV R18,R20
0163 E001 LDI R16,1
0164 DFD2 RCALL _lcdcommand
(0068) lcdcommand(0,LCD_Y); //设置Y的初始地址,Y可自加
0165 E420 LDI R18,0x40
0166 2700 CLR R16
0167 DFCF RCALL _lcdcommand
(0069) lcdcommand(1,LCD_Y);
0168 E420 LDI R18,0x40
0169 E001 LDI R16,1
016A DFCC RCALL _lcdcommand
(0070) for(y=0;y<64;y++)
016B 2766 CLR R22
016C C007 RJMP 0x0174
(0071) {
(0072) lcddatas(0,0x00);
016D 2722 CLR R18
016E 2700 CLR R16
016F DFD9 RCALL _lcddatas
(0073) lcddatas(1,0x00); //Y地址可以自增
0170 2722 CLR R18
0171 E001 LDI R16,1
0172 DFD6 RCALL _lcddatas
0173 9563 INC R22
0174 3460 CPI R22,0x40
0175 F3B8 BCS 0x016D
0176 9543 INC R20
0177 EB8F LDI R24,0xBF
0178 1784 CP R24,R20
0179 F728 BCC 0x015F
017A 940E047E CALL pop_gset2
017C 9508 RET
(0074) }
(0075) }
(0076) }
(0077)
(0078) void LCD_Init(void) //LCD初始化子函数
(0079) {
(0080) /*首先关闭12864的显示*/
(0081) check_busy(0); //LCD左半屏正在工作,等待......
_LCD_Init:
017D 2700 CLR R16
017E DFA7 RCALL _check_busy
(0082) L_command=LCD_OFF; //先关闭LCD左半屏的显示
017F E38E LDI R24,0x3E
0180 93809400 STS 0x9400,R24
(0083) check_busy(1); //LCD右半屏正在工作,等待......
0182 E001 LDI R16,1
0183 DFA2 RCALL _check_busy
(0084) R_command=LCD_OFF; //先关闭LCD右半屏的显示
0184 E38E LDI R24,0x3E
0185 93809800 STS 0x9800,R24
(0085)
(0086) /*开启12864的显示*/
(0087) check_busy(0);
0187 2700 CLR R16
0188 DF9D RCALL _check_busy
(0088) L_command=LCD_ON; //打开LCD左半屏的显示
0189 E38F LDI R24,0x3F
018A 93809400 STS 0x9400,R24
(0089) check_busy(1);
018C E001 LDI R16,1
018D DF98 RCALL _check_busy
(0090) R_command=LCD_ON; //打开LCD右半屏的显示
018E E38F LDI R24,0x3F
018F 93809800 STS 0x9800,R24
(0091)
(0092) /*设置LCD显示的起始行*/
(0093) check_busy(0);
0191 2700 CLR R16
0192 DF93 RCALL _check_busy
(0094) L_command=LCD_X; //LCD左半屏起始行为0
0193 EC80 LDI R24,0xC0
0194 93809400 STS 0x9400,R24
(0095) check_busy(1);
0196 E001 LDI R16,1
0197 DF8E RCALL _check_busy
(0096) R_command=LCD_X; //LCD右半屏起始行为0
0198 EC80 LDI R24,0xC0
0199 93809800 STS 0x9800,R24
019B 9508 RET
(0097) }
(0098)
(0099) void init_devices(void)
(0100) {
(0101) XMCRA = 0x00; //外部存储器控制
_init_devices:
019C 2422 CLR R2
019D 9220006D STS 0x6D,R2
(0102) XMCRB = 0x00; //外存储高位地址屏蔽,释放端口C
019F 9220006C STS 0x6C,R2
(0103) port_init();
01A1 DF7D RCALL _port_init
(0104) MCUCR = 0x80; //外部SRAM使能
01A2 E880 LDI R24,0x80
01A3 BF85 OUT 0x35,R24
01A4 9508 RET
_displaychar_left:
i --> R20
y --> Y+4
x --> R20
array --> R22
01A5 940E048D CALL push_gset2
01A7 2F42 MOV R20,R18
01A8 01B8 MOVW R22,R16
(0105) }
(0106)
(0107) /**********************************LCD字符显示函数(8*8)**********************************************/
(0108)
(0109) void displaychar_left(uchar *array,uchar x,uchar y)
(0110) {
(0111) uchar i;
(0112) lcdcommand(0,LCD_PAGE+x);
01A9 2F24 MOV R18,R20
01AA 5428 SUBI R18,0x48
01AB 2700 CLR R16
01AC DF8A RCALL _lcdcommand
(0113) lcdcommand(0,LCD_Y+y);
01AD 812C LDD R18,Y+4
01AE 5C20 SUBI R18,0xC0
01AF 2700 CLR R16
01B0 DF86 RCALL _lcdcommand
(0114) for(i=0;i<8;i++)
01B1 2744 CLR R20
01B2 C008 RJMP 0x01BB
(0115) {
(0116) lcddatas(0,*(array+i));
01B3 2FE4 MOV R30,R20
01B4 27FF CLR R31
01B5 0FE6 ADD R30,R22
01B6 1FF7 ADC R31,R23
01B7 8120 LDD R18,Z+0
01B8 2700 CLR R16
01B9 DF8F RCALL _lcddatas
01BA 9543 INC R20
01BB 3048 CPI R20,0x8
01BC F3B0 BCS 0x01B3
01BD 940E047E CALL pop_gset2
01BF 9508 RET
_displaychar_right:
i --> R20
y --> Y+4
x --> R20
array --> R22
01C0 940E048D CALL push_gset2
01C2 2F42 MOV R20,R18
01C3 01B8 MOVW R22,R16
(0117) }
(0118) }
(0119)
(0120)
(0121) void displaychar_right(uchar *array,uchar x,uchar y)
(0122) {
(0123) uchar i;
(0124) lcdcommand(1,LCD_PAGE+x);
01C4 2F24 MOV R18,R20
01C5 5428 SUBI R18,0x48
01C6 E001 LDI R16,1
01C7 DF6F RCALL _lcdcommand
(0125) lcdcommand(1,LCD_Y+y);
01C8 812C LDD R18,Y+4
01C9 5C20 SUBI R18,0xC0
01CA E001 LDI R16,1
01CB DF6B RCALL _lcdcommand
(0126) for(i=0;i<8;i++)
01CC 2744 CLR R20
01CD C008 RJMP 0x01D6
(0127) {
(0128) lcddatas(1,*(array+i));
01CE 2FE4 MOV R30,R20
01CF 27FF CLR R31
01D0 0FE6 ADD R30,R22
01D1 1FF7 ADC R31,R23
01D2 8120 LDD R18,Z+0
01D3 E001 LDI R16,1
01D4 DF74 RCALL _lcddatas
01D5 9543 INC R20
01D6 3048 CPI R20,0x8
01D7 F3B0 BCS 0x01CE
01D8 940E047E CALL pop_gset2
01DA 9508 RET
_display_char:
heng --> R10
zong --> R22
array2 --> R20
array1 --> R12
01DB 940E0489 CALL push_gset4
01DD 01A9 MOVW R20,R18
01DE 0168 MOVW R12,R16
01DF 9721 SBIW R28,1
01E0 8569 LDD R22,Y+9
01E1 84AB LDD R10,Y+11
(0129) }
(0130) }
(0131)
(0132)
(0133) void display_char(uchar*array1,uchar*array2,uchar zong,uchar heng)
(0134) {
(0135) if((heng>=0)&&(heng<=7))
01E2 2D8A MOV R24,R10
01E3 3080 CPI R24,0
01E4 F080 BCS 0x01F5
01E5 E087 LDI R24,7
01E6 158A CP R24,R10
01E7 F068 BCS 0x01F5
(0136) {displaychar_left(array1,zong,heng*8); displaychar_left(array2,zong+1,heng*8);}
01E8 E088 LDI R24,0x8
01E9 9D8A MUL R24,R10
01EA 8208 STD Y+0,R0
01EB 2F26 MOV R18,R22
01EC 0186 MOVW R16,R12
01ED DFB7 RCALL _displaychar_left
01EE E088 LDI R24,0x8
01EF 9D8A MUL R24,R10
01F0 8208 STD Y+0,R0
01F1 2F26 MOV R18,R22
01F2 5F2F SUBI R18,0xFF
01F3 018A MOVW R16,R20
01F4 DFB0 RCALL _displaychar_left
(0137)
(0138) if((heng>=8)&&(heng<=15))
01F5 2D8A MOV R24,R10
01F6 3088 CPI R24,0x8
01F7 F0A0 BCS 0x020C
01F8 E08F LDI R24,0xF
01F9 158A CP R24,R10
01FA F088 BCS 0x020C
(0139) {displaychar_right(array1,zong,(heng-8)*8); displaychar_right(array2,zong+1,(heng-8)*8);}
01FB E088 LDI R24,0x8
01FC 9D8A MUL R24,R10
01FD 2D80 MOV R24,R0
01FE 5480 SUBI R24,0x40
01FF 8388 STD Y+0,R24
0200 2F26 MOV R18,R22
0201 0186 MOVW R16,R12
0202 DFBD RCALL _displaychar_right
0203 E088 LDI R24,0x8
0204 9D8A MUL R24,R10
0205 2D80 MOV R24,R0
0206 5480 SUBI R24,0x40
0207 8388 STD Y+0,R24
0208 2F26 MOV R18,R22
0209 5F2F SUBI R18,0xFF
020A 018A MOVW R16,R20
020B DFB4 RCALL _displaychar_right
020C 9621 ADIW R28,1
020D 940E0484 CALL pop_gset4
020F 9508 RET
_displayL:
i --> R20
y --> Y+4
x --> R20
array --> R22
0210 940E048D CALL push_gset2
0212 2F42 MOV R20,R18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -