⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 LCD128*64 atmega16驱动 带仿真文件
💻 LST
字号:
__start:
__text_start:
    0156 EFCF      LDI	R28,0xFF
    0157 E1D0      LDI	R29,0x10
    0158 BFCD      OUT	0x3D,R28
    0159 BFDE      OUT	0x3E,R29
    015A 51C0      SUBI	R28,0x10
    015B 40D0      SBCI	R29,0
    015C EA0A      LDI	R16,0xAA
    015D 8308      STD	Y+0,R16
    015E 2400      CLR	R0
    015F E0E0      LDI	R30,0
    0160 E0F1      LDI	R31,1
    0161 E011      LDI	R17,1
    0162 30E1      CPI	R30,1
    0163 07F1      CPC	R31,R17
    0164 F011      BEQ	0x0167
    0165 9201      ST	R0,Z+
    0166 CFFB      RJMP	0x0162
    0167 8300      STD	Z+0,R16
    0168 EAEC      LDI	R30,0xAC
    0169 E0F2      LDI	R31,2
    016A E0A0      LDI	R26,0
    016B E0B1      LDI	R27,1
    016C E012      LDI	R17,2
    016D 3AEC      CPI	R30,0xAC
    016E 07F1      CPC	R31,R17
    016F F021      BEQ	0x0174
    0170 95C8      LPM
    0171 9631      ADIW	R30,1
    0172 920D      ST	R0,X+
    0173 CFF9      RJMP	0x016D
    0174 940E0280  CALL	_main
_exit:
    0176 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\zhuji\桌面\photo\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 photo  32*32 big
(0007) 
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "main.h"
(0011) #include "photo.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:
    0177 2422      CLR	R2
    0178 BA2B      OUT	0x1B,R2
(0021)  DDRA  = 0x00; 
    0179 BA2A      OUT	0x1A,R2
(0022)  PORTC = 0x00; 
    017A BA25      OUT	0x15,R2
(0023)  DDRC  = 0xFF;
    017B EF8F      LDI	R24,0xFF
    017C BB84      OUT	0x14,R24
(0024) }
    017D 9508      RET
_check_busy:
  temp                 --> R20
  cs                   --> R16
    017E 940E028D  CALL	push_gset1
(0025) 	  
(0026) void check_busy(uchar cs)               
(0027) { 
    0180 C009      RJMP	0x018A
(0028)   uchar temp;
(0029)   while(temp)          
(0030)    { 
(0031)      if(cs)
    0181 2300      TST	R16
    0182 F021      BEQ	0x0187
(0032)         temp=R_staus&0X80;               //将忙状态读到temp中进行确定
    0183 91402005  LDS	R20,0x2005
    0185 7840      ANDI	R20,0x80
    0186 C003      RJMP	0x018A
(0033) 	 else
(0034) 	    temp=L_staus&0X80;
    0187 91402009  LDS	R20,0x2009
    0189 7840      ANDI	R20,0x80
    018A 2344      TST	R20
    018B F7A9      BNE	0x0181
(0035) 	}
(0036) }
    018C 940E0290  CALL	pop_gset1
    018E 9508      RET
_LCD_Clean:
  page                 --> R20
  y                    --> R22
    018F 940E02A4  CALL	push_gset2
(0037) 
(0038) void LCD_Clean(void)
(0039) {
(0040)   unsigned char page=0,y;                //定义表示页和列的局部变量
    0191 2744      CLR	R20
(0041)   
(0042)   for(page=0;page<8;page++)
    0192 C021      RJMP	0x01B4
(0043)      {
(0044) 	                                     //LCD左半屏的操作
(0045) 	   check_busy(0);
    0193 2700      CLR	R16
    0194 DFE9      RCALL	_check_busy
(0046) 	   L_command=LCD_PAGE+page;          //设置LCD左半屏页地址
    0195 2F84      MOV	R24,R20
    0196 5488      SUBI	R24,0x48
    0197 93802008  STS	0x2008,R24
(0047) 	   check_busy(0);
    0199 2700      CLR	R16
    019A DFE3      RCALL	_check_busy
(0048) 	   L_command=LCD_Y; 
    019B E480      LDI	R24,0x40
    019C 93802008  STS	0x2008,R24
(0049) 	                                     //LCD右半屏的操作
(0050) 	  check_busy(1);
    019E E001      LDI	R16,1
    019F DFDE      RCALL	_check_busy
(0051) 	   R_command=LCD_PAGE+page;          //设置LCD右半屏页地址
    01A0 2F84      MOV	R24,R20
    01A1 5488      SUBI	R24,0x48
    01A2 93802004  STS	0x2004,R24
(0052) 	  check_busy(1);
    01A4 E001      LDI	R16,1
    01A5 DFD8      RCALL	_check_busy
(0053) 	   R_command=LCD_Y;
    01A6 E480      LDI	R24,0x40
    01A7 93802004  STS	0x2004,R24
(0054) 	   
(0055) 	   for(y=0;y<64;y++)
    01A9 2766      CLR	R22
    01AA C006      RJMP	0x01B1
(0056) 	      {
(0057)             L_data=0x00;
    01AB 2422      CLR	R2
    01AC 9220200A  STS	0x200A,R2
(0058) 			R_data=0x00;
    01AE 92202006  STS	0x2006,R2
    01B0 9563      INC	R22
    01B1 3460      CPI	R22,0x40
    01B2 F3C0      BCS	0x01AB
    01B3 9543      INC	R20
    01B4 3048      CPI	R20,0x8
    01B5 F2E8      BCS	0x0193
(0059) 		  }  
(0060) 	 }
(0061) }
    01B6 940E0287  CALL	pop_gset2
    01B8 9508      RET
(0062)                                          
(0063) void LCD_Init(void)                     //LCD初始化子函数
(0064) {
(0065)   /*首先关闭12864的显示*/
(0066)   check_busy(0);                        //LCD左半屏正在工作,等待......
_LCD_Init:
    01B9 2700      CLR	R16
    01BA DFC3      RCALL	_check_busy
(0067)   L_command=LCD_OFF;                    //先关闭LCD左半屏的显示
    01BB E38E      LDI	R24,0x3E
    01BC 93802008  STS	0x2008,R24
(0068)   check_busy(1);                        //LCD右半屏正在工作,等待......
    01BE E001      LDI	R16,1
    01BF DFBE      RCALL	_check_busy
(0069)   R_command=LCD_OFF;                    //先关闭LCD右半屏的显示
    01C0 E38E      LDI	R24,0x3E
    01C1 93802004  STS	0x2004,R24
(0070)   
(0071)   /*开启12864的显示*/
(0072)   check_busy(0);
    01C3 2700      CLR	R16
    01C4 DFB9      RCALL	_check_busy
(0073)   L_command=LCD_ON;                     //打开LCD左半屏的显示
    01C5 E38F      LDI	R24,0x3F
    01C6 93802008  STS	0x2008,R24
(0074)   check_busy(1);
    01C8 E001      LDI	R16,1
    01C9 DFB4      RCALL	_check_busy
(0075)   R_command=LCD_ON;                     //打开LCD右半屏的显示
    01CA E38F      LDI	R24,0x3F
    01CB 93802004  STS	0x2004,R24
(0076)   
(0077)   /*设置LCD显示的起始行*/
(0078)   check_busy(0);
    01CD 2700      CLR	R16
    01CE DFAF      RCALL	_check_busy
(0079)   L_command=LCD_X;                      //LCD左半屏起始行为0
    01CF EC80      LDI	R24,0xC0
    01D0 93802008  STS	0x2008,R24
(0080)   check_busy(1);
    01D2 E001      LDI	R16,1
    01D3 DFAA      RCALL	_check_busy
(0081)   R_command=LCD_X;                      //LCD右半屏起始行为0
    01D4 EC80      LDI	R24,0xC0
    01D5 93802004  STS	0x2004,R24
(0082) }
    01D7 9508      RET
(0083) 
(0084) void init_devices(void)
(0085) {
(0086)  XMCRA = 0x00;                          //外部存储器控制
_init_devices:
    01D8 2422      CLR	R2
    01D9 9220006D  STS	0x6D,R2
(0087)  XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
    01DB E087      LDI	R24,7
    01DC 9380006C  STS	0x6C,R24
(0088)  port_init();
    01DE DF98      RCALL	_port_init
(0089)  MCUCR = 0x80;                          //外部SRAM使能
    01DF E880      LDI	R24,0x80
    01E0 BF85      OUT	0x35,R24
(0090) }
    01E1 9508      RET
_ch_pos:
  n                    --> R20
  cs                   --> R22
    01E2 940E02A4  CALL	push_gset2
    01E4 2F42      MOV	R20,R18
    01E5 2F60      MOV	R22,R16
(0091) 
(0092) void ch_pos(unsigned char cs,unsigned char n)   //屏选和页码设置函数
(0093) {
(0094)   if(cs)
    01E6 2366      TST	R22
    01E7 F061      BEQ	0x01F4
(0095)       {
(0096) 	   check_busy(1);
    01E8 E001      LDI	R16,1
    01E9 DF94      RCALL	_check_busy
(0097)        R_command=LCD_PAGE+n;                   //设置LCD右半屏页地址
    01EA 2F84      MOV	R24,R20
    01EB 5488      SUBI	R24,0x48
    01EC 93802004  STS	0x2004,R24
(0098)        check_busy(1);                  
    01EE E001      LDI	R16,1
    01EF DF8E      RCALL	_check_busy
(0099)        R_command=LCD_Y;
    01F0 E480      LDI	R24,0x40
    01F1 93802004  STS	0x2004,R24
(0100) 	  }
    01F3 C00B      RJMP	0x01FF
(0101)   else
(0102)       {
(0103) 	   check_busy(0);
    01F4 2700      CLR	R16
    01F5 DF88      RCALL	_check_busy
(0104)        L_command=LCD_PAGE+n;                   //设置LCD右半屏页地址
    01F6 2F84      MOV	R24,R20
    01F7 5488      SUBI	R24,0x48
    01F8 93802008  STS	0x2008,R24
(0105)        check_busy(0);                  
    01FA 2700      CLR	R16
    01FB DF82      RCALL	_check_busy
(0106)        L_command=LCD_Y;
    01FC E480      LDI	R24,0x40
    01FD 93802008  STS	0x2008,R24
(0107) 	  } 
(0108) }	   	  
    01FF 940E0287  CALL	pop_gset2
    0201 9508      RET
_write_photo:
  j                    --> R20
  i                    --> R10
  cs                   --> R22
    0202 940E02A8  CALL	push_gset3
    0204 2F60      MOV	R22,R16
(0109) void write_photo(unsigned char cs)  
(0110) {
(0111)   uchar i,j;
(0112)   for(j=0;j<3;j++)
    0205 2744      CLR	R20
    0206 C073      RJMP	0x027A
(0113)   { 
(0114)    if(cs)  ch_pos(1,2*j);                   //右屏页码处理
    0207 2366      TST	R22
    0208 F031      BEQ	0x020F
    0209 E082      LDI	R24,2
    020A 9F84      MUL	R24,R20
    020B 2D20      MOV	R18,R0
    020C E001      LDI	R16,1
    020D DFD4      RCALL	_ch_pos
    020E C005      RJMP	0x0214
(0115)    else    ch_pos(0,2*j); 	                //左屏页码处理
    020F E082      LDI	R24,2
    0210 9F84      MUL	R24,R20
    0211 2D20      MOV	R18,R0
    0212 2700      CLR	R16
    0213 DFCE      RCALL	_ch_pos
(0116)    for(i=0;i<64;i++)
    0214 24AA      CLR	R10
    0215 C026      RJMP	0x023C
(0117)     {
(0118) 	 
(0119) 	 if(cs)
    0216 2366      TST	R22
    0217 F091      BEQ	0x022A
(0120) 	    {
(0121) 		 R_data=p3[2*j][i];                 //右半屏显示
    0218 E082      LDI	R24,2
    0219 9F84      MUL	R24,R20
    021A 2D10      MOV	R17,R0
    021B E400      LDI	R16,0x40
    021C 0201      MULS	R16,R17
    021D E28C      LDI	R24,0x2C
    021E E091      LDI	R25,1
    021F 0110      MOVW	R2,R0
    0220 0E28      ADD	R2,R24
    0221 1E39      ADC	R3,R25
    0222 2DEA      MOV	R30,R10
    0223 27FF      CLR	R31
    0224 0DE2      ADD	R30,R2
    0225 1DF3      ADC	R31,R3
    0226 91E4      LPM	R30,0(Z)
    0227 93E02006  STS	0x2006,R30
(0122) 		} 
    0229 C011      RJMP	0x023B
(0123)      else 
(0124) 	    {
(0125) 		 L_data=p3[2*j][i];                 //左半屏显示
    022A E082      LDI	R24,2
    022B 9F84      MUL	R24,R20
    022C 2D10      MOV	R17,R0
    022D E400      LDI	R16,0x40
    022E 0201      MULS	R16,R17
    022F E28C      LDI	R24,0x2C
    0230 E091      LDI	R25,1
    0231 0110      MOVW	R2,R0
    0232 0E28      ADD	R2,R24
    0233 1E39      ADC	R3,R25
    0234 2DEA      MOV	R30,R10
    0235 27FF      CLR	R31
    0236 0DE2      ADD	R30,R2
    0237 1DF3      ADC	R31,R3
    0238 91E4      LPM	R30,0(Z)
    0239 93E0200A  STS	0x200A,R30
    023B 94A3      INC	R10
    023C 2D8A      MOV	R24,R10
    023D 3480      CPI	R24,0x40
    023E F2B8      BCS	0x0216
(0126) 		}  
(0127) 	} 
(0128)    if(cs)  ch_pos(1,2*j+1);                //右屏页码处理
    023F 2366      TST	R22
    0240 F039      BEQ	0x0248
    0241 E082      LDI	R24,2
    0242 9F84      MUL	R24,R20
    0243 2D20      MOV	R18,R0
    0244 5F2F      SUBI	R18,0xFF
    0245 E001      LDI	R16,1
    0246 DF9B      RCALL	_ch_pos
    0247 C006      RJMP	0x024E
(0129)    else    ch_pos(0,2*j+1);                //左屏页码处理
    0248 E082      LDI	R24,2
    0249 9F84      MUL	R24,R20
    024A 2D20      MOV	R18,R0
    024B 5F2F      SUBI	R18,0xFF
    024C 2700      CLR	R16
    024D DF94      RCALL	_ch_pos
(0130)    for(i=0;i<64;i++)
    024E 24AA      CLR	R10
    024F C026      RJMP	0x0276
(0131)     { 
(0132) 	 if(cs) 
    0250 2366      TST	R22
    0251 F091      BEQ	0x0264
(0133) 	    {
(0134) 	     R_data=p3[2*j+1][i];               //右半屏显示
    0252 E082      LDI	R24,2
    0253 9F84      MUL	R24,R20
    0254 2D10      MOV	R17,R0
    0255 E400      LDI	R16,0x40
    0256 0201      MULS	R16,R17
    0257 E68C      LDI	R24,0x6C
    0258 E091      LDI	R25,1
    0259 0110      MOVW	R2,R0
    025A 0E28      ADD	R2,R24
    025B 1E39      ADC	R3,R25
    025C 2DEA      MOV	R30,R10
    025D 27FF      CLR	R31
    025E 0DE2      ADD	R30,R2
    025F 1DF3      ADC	R31,R3
    0260 91E4      LPM	R30,0(Z)
    0261 93E02006  STS	0x2006,R30
(0135) 		}
    0263 C011      RJMP	0x0275
(0136)      else   
(0137) 	    {
(0138) 		 
(0139) 	     L_data=p3[2*j+1][i];               //左半屏显示
    0264 E082      LDI	R24,2
    0265 9F84      MUL	R24,R20
    0266 2D10      MOV	R17,R0
    0267 E400      LDI	R16,0x40
    0268 0201      MULS	R16,R17
    0269 E68C      LDI	R24,0x6C
    026A E091      LDI	R25,1
    026B 0110      MOVW	R2,R0
    026C 0E28      ADD	R2,R24
    026D 1E39      ADC	R3,R25
    026E 2DEA      MOV	R30,R10
    026F 27FF      CLR	R31
    0270 0DE2      ADD	R30,R2
    0271 1DF3      ADC	R31,R3
    0272 91E4      LPM	R30,0(Z)
    0273 93E0200A  STS	0x200A,R30
    0275 94A3      INC	R10
    0276 2D8A      MOV	R24,R10
    0277 3480      CPI	R24,0x40
    0278 F2B8      BCS	0x0250
    0279 9543      INC	R20
    027A 3043      CPI	R20,3
    027B F408      BCC	0x027D
    027C CF8A      RJMP	0x0207
(0140) 		}  
(0141)     }
(0142)   }  
(0143) }
    027D 940E028A  CALL	pop_gset3
    027F 9508      RET
(0144)  
(0145) void main(void)
(0146) {
(0147)   init_devices();
_main:
    0280 DF57      RCALL	_init_devices
(0148)   LCD_Clean();
    0281 DF0D      RCALL	_LCD_Clean
(0149)   LCD_Init();
    0282 DF36      RCALL	_LCD_Init
(0150)  write_photo(0);
    0283 2700      CLR	R16
    0284 DF7D      RCALL	_write_photo
(0151)   write_photo(1);
    0285 E001      LDI	R16,1
(0152) }
FILE: <library>
    0286 CF7B      RJMP	_write_photo
pop_gset2:
    0287 E0E2      LDI	R30,2
    0288 940C0291  JMP	pop
pop_gset3:
    028A E0E4      LDI	R30,4
    028B 940C0291  JMP	pop
push_gset1:
    028D 935A      ST	R21,-Y
    028E 934A      ST	R20,-Y
    028F 9508      RET
pop_gset1:
    0290 E0E1      LDI	R30,1
pop:
    0291 9149      LD	R20,Y+
    0292 9159      LD	R21,Y+
    0293 FDE0      SBRC	R30,0
    0294 9508      RET
    0295 9169      LD	R22,Y+
    0296 9179      LD	R23,Y+
    0297 FDE1      SBRC	R30,1
    0298 9508      RET
    0299 90A9      LD	R10,Y+
    029A 90B9      LD	R11,Y+
    029B FDE2      SBRC	R30,2
    029C 9508      RET
    029D 90C9      LD	R12,Y+
    029E 90D9      LD	R13,Y+
    029F FDE3      SBRC	R30,3
    02A0 9508      RET
    02A1 90E9      LD	R14,Y+
    02A2 90F9      LD	R15,Y+
    02A3 9508      RET
push_gset2:
    02A4 937A      ST	R23,-Y
    02A5 936A      ST	R22,-Y
    02A6 940C028D  JMP	push_gset1
push_gset3:
    02A8 92BA      ST	R11,-Y
    02A9 92AA      ST	R10,-Y
    02AA 940C02A4  JMP	push_gset2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -