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

📄 lcd.lst

📁 atmega64单片机下的中文液晶显示
💻 LST
字号:
__text_start:
__start:
    013A E5CF      LDI	R28,0x5F
    013B E0D4      LDI	R29,4
    013C BFCD      OUT	0x3D,R28
    013D BFDE      OUT	0x3E,R29
    013E 51C0      SUBI	R28,0x10
    013F 40D0      SBCI	R29,0
    0140 EA0A      LDI	R16,0xAA
    0141 8308      STD	Y+0,R16
    0142 2400      CLR	R0
    0143 E6E0      LDI	R30,0x60
    0144 E0F0      LDI	R31,0
    0145 E010      LDI	R17,0
    0146 36E1      CPI	R30,0x61
    0147 07F1      CPC	R31,R17
    0148 F011      BEQ	0x014B
    0149 9201      ST	R0,Z+
    014A CFFB      RJMP	0x0146
    014B 8300      STD	Z+0,R16
    014C E7E4      LDI	R30,0x74
    014D E0F2      LDI	R31,2
    014E E6A0      LDI	R26,0x60
    014F E0B0      LDI	R27,0
    0150 E012      LDI	R17,2
    0151 37E4      CPI	R30,0x74
    0152 07F1      CPC	R31,R17
    0153 F021      BEQ	0x0158
    0154 95C8      LPM
    0155 9631      ADIW	R30,1
    0156 920D      ST	R0,X+
    0157 CFF9      RJMP	0x0151
    0158 940E0264  CALL	_main
_exit:
    015A CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Administrator\桌面\USING07-05\Mega128\LCDDIS~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 photo  32*32 big
(0007) 
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "lcd.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:
    015B 2422      CLR	R2
    015C BA2B      OUT	0x1B,R2
(0021)  DDRA  = 0x00; 
    015D BA2A      OUT	0x1A,R2
(0022)  PORTC = 0x00; 
    015E BA25      OUT	0x15,R2
(0023)  DDRC  = 0xFF;
    015F EF8F      LDI	R24,0xFF
    0160 BB84      OUT	0x14,R24
    0161 9508      RET
_check_busy:
  temp                 --> R20
  cs                   --> R16
    0162 940E027A  CALL	push_gset1
(0024) }
(0025) 	  
(0026) void check_busy(uchar cs)               
(0027) { 
    0164 C009      RJMP	0x016E
(0028)   uchar temp;
(0029)   while(temp)          
(0030)    { 
(0031)      if(cs)
    0165 2300      TST	R16
    0166 F021      BEQ	0x016B
(0032)         temp=R_staus&0X80;               //将忙状态读到temp中进行确定
    0167 91402005  LDS	R20,0x2005
    0169 7840      ANDI	R20,0x80
    016A C003      RJMP	0x016E
(0033) 	 else
(0034) 	    temp=L_staus&0X80;
    016B 91402009  LDS	R20,0x2009
    016D 7840      ANDI	R20,0x80
    016E 2344      TST	R20
    016F F7A9      BNE	0x0165
    0170 940E027D  CALL	pop_gset1
    0172 9508      RET
_LCD_Clean:
  page                 --> R20
  y                    --> R22
    0173 940E0278  CALL	push_gset2
(0035) 	}
(0036) }
(0037) 
(0038) void LCD_Clean(void)
(0039) {
(0040)   unsigned char page=0,y;                //定义表示页和列的局部变量
    0175 2744      CLR	R20
(0041)   
(0042)   for(page=0;page<8;page++)
    0176 C021      RJMP	0x0198
(0043)      {
(0044) 	                                     //LCD左半屏的操作
(0045) 	   check_busy(0);
    0177 2700      CLR	R16
    0178 DFE9      RCALL	_check_busy
(0046) 	   L_command=LCD_PAGE+page;          //设置LCD左半屏页地址
    0179 2F84      MOV	R24,R20
    017A 5488      SUBI	R24,0x48
    017B 93802008  STS	0x2008,R24
(0047) 	   check_busy(0);
    017D 2700      CLR	R16
    017E DFE3      RCALL	_check_busy
(0048) 	   L_command=LCD_Y; 
    017F E480      LDI	R24,0x40
    0180 93802008  STS	0x2008,R24
(0049) 	                                     //LCD右半屏的操作
(0050) 	  check_busy(1);
    0182 E001      LDI	R16,1
    0183 DFDE      RCALL	_check_busy
(0051) 	   R_command=LCD_PAGE+page;          //设置LCD右半屏页地址
    0184 2F84      MOV	R24,R20
    0185 5488      SUBI	R24,0x48
    0186 93802004  STS	0x2004,R24
(0052) 	  check_busy(1);
    0188 E001      LDI	R16,1
    0189 DFD8      RCALL	_check_busy
(0053) 	   R_command=LCD_Y;
    018A E480      LDI	R24,0x40
    018B 93802004  STS	0x2004,R24
(0054) 	   
(0055) 	   for(y=0;y<64;y++)
    018D 2766      CLR	R22
    018E C006      RJMP	0x0195
(0056) 	      {
(0057)             L_data=0x00;
    018F 2422      CLR	R2
    0190 9220200A  STS	0x200A,R2
(0058) 			R_data=0x00;
    0192 92202006  STS	0x2006,R2
    0194 9563      INC	R22
    0195 3460      CPI	R22,0x40
    0196 F3C0      BCS	0x018F
    0197 9543      INC	R20
    0198 3048      CPI	R20,0x8
    0199 F2E8      BCS	0x0177
    019A 940E026C  CALL	pop_gset2
    019C 9508      RET
(0059) 		  }  
(0060) 	 }
(0061) }
(0062)                                          
(0063) void LCD_Init(void)                     //LCD初始化子函数
(0064) {
(0065)   /*首先关闭12864的显示*/
(0066)   check_busy(0);                        //LCD左半屏正在工作,等待......
_LCD_Init:
    019D 2700      CLR	R16
    019E DFC3      RCALL	_check_busy
(0067)   L_command=LCD_OFF;                    //先关闭LCD左半屏的显示
    019F E38E      LDI	R24,0x3E
    01A0 93802008  STS	0x2008,R24
(0068)   check_busy(1);                        //LCD右半屏正在工作,等待......
    01A2 E001      LDI	R16,1
    01A3 DFBE      RCALL	_check_busy
(0069)   R_command=LCD_OFF;                    //先关闭LCD右半屏的显示
    01A4 E38E      LDI	R24,0x3E
    01A5 93802004  STS	0x2004,R24
(0070)   
(0071)   /*开启12864的显示*/
(0072)   check_busy(0);
    01A7 2700      CLR	R16
    01A8 DFB9      RCALL	_check_busy
(0073)   L_command=LCD_ON;                     //打开LCD左半屏的显示
    01A9 E38F      LDI	R24,0x3F
    01AA 93802008  STS	0x2008,R24
(0074)   check_busy(1);
    01AC E001      LDI	R16,1
    01AD DFB4      RCALL	_check_busy
(0075)   R_command=LCD_ON;                     //打开LCD右半屏的显示
    01AE E38F      LDI	R24,0x3F
    01AF 93802004  STS	0x2004,R24
(0076)   
(0077)   /*设置LCD显示的起始行*/
(0078)   check_busy(0);
    01B1 2700      CLR	R16
    01B2 DFAF      RCALL	_check_busy
(0079)   L_command=LCD_X;                      //LCD左半屏起始行为0
    01B3 EC80      LDI	R24,0xC0
    01B4 93802008  STS	0x2008,R24
(0080)   check_busy(1);
    01B6 E001      LDI	R16,1
    01B7 DFAA      RCALL	_check_busy
(0081)   R_command=LCD_X;                      //LCD右半屏起始行为0
    01B8 EC80      LDI	R24,0xC0
    01B9 93802004  STS	0x2004,R24
    01BB 9508      RET
(0082) }
(0083) 
(0084) void init_devices(void)
(0085) {
(0086)  XMCRA = 0x00;                          //外部存储器控制
_init_devices:
    01BC 2422      CLR	R2
    01BD 9220006D  STS	0x6D,R2
(0087)  XMCRB = (1<<XMM2)|(1<<XMM1)|(1<<XMM0); //外存储高位地址屏蔽,释放端口C
    01BF E087      LDI	R24,7
    01C0 9380006C  STS	0x6C,R24
(0088)  port_init();
    01C2 DF98      RCALL	_port_init
(0089)  MCUCR = 0x80;                          //外部SRAM使能
    01C3 E880      LDI	R24,0x80
    01C4 BF85      OUT	0x35,R24
    01C5 9508      RET
_ch_pos:
  n                    --> R20
  cs                   --> R22
    01C6 940E0278  CALL	push_gset2
    01C8 2F42      MOV	R20,R18
    01C9 2F60      MOV	R22,R16
(0090) }
(0091) 
(0092) void ch_pos(unsigned char cs,unsigned char n)   //屏选和页码设置函数
(0093) {
(0094)   if(cs)
    01CA 2366      TST	R22
    01CB F061      BEQ	0x01D8
(0095)       {
(0096) 	   check_busy(1);
    01CC E001      LDI	R16,1
    01CD DF94      RCALL	_check_busy
(0097)        R_command=LCD_PAGE+n;                   //设置LCD右半屏页地址
    01CE 2F84      MOV	R24,R20
    01CF 5488      SUBI	R24,0x48
    01D0 93802004  STS	0x2004,R24
(0098)        check_busy(1);                  
    01D2 E001      LDI	R16,1
    01D3 DF8E      RCALL	_check_busy
(0099)        R_command=LCD_Y;
    01D4 E480      LDI	R24,0x40
    01D5 93802004  STS	0x2004,R24
(0100) 	  }
    01D7 C00B      RJMP	0x01E3
(0101)   else
(0102)       {
(0103) 	   check_busy(0);
    01D8 2700      CLR	R16
    01D9 DF88      RCALL	_check_busy
(0104)        L_command=LCD_PAGE+n;                   //设置LCD右半屏页地址
    01DA 2F84      MOV	R24,R20
    01DB 5488      SUBI	R24,0x48
    01DC 93802008  STS	0x2008,R24
(0105)        check_busy(0);                  
    01DE 2700      CLR	R16
    01DF DF82      RCALL	_check_busy
(0106)        L_command=LCD_Y;
    01E0 E480      LDI	R24,0x40
    01E1 93802008  STS	0x2008,R24
(0107) 	  } 
    01E3 940E026C  CALL	pop_gset2
    01E5 9508      RET
_write_photo:
  j                    --> R20
  i                    --> R10
  cs                   --> R22
    01E6 940E0276  CALL	push_gset3
    01E8 2F60      MOV	R22,R16
(0108) }	   	  
(0109) void write_photo(unsigned char cs)  
(0110) {
(0111)   uchar i,j;
(0112)   for(j=0;j<3;j++)
    01E9 2744      CLR	R20
    01EA C073      RJMP	0x025E
(0113)   { 
(0114)    if(cs)  ch_pos(1,2*j);                   //右屏页码处理
    01EB 2366      TST	R22
    01EC F031      BEQ	0x01F3
    01ED E082      LDI	R24,2
    01EE 9F84      MUL	R24,R20
    01EF 2D20      MOV	R18,R0
    01F0 E001      LDI	R16,1
    01F1 DFD4      RCALL	_ch_pos
    01F2 C005      RJMP	0x01F8
(0115)    else    ch_pos(0,2*j); 	                //左屏页码处理
    01F3 E082      LDI	R24,2
    01F4 9F84      MUL	R24,R20
    01F5 2D20      MOV	R18,R0
    01F6 2700      CLR	R16
    01F7 DFCE      RCALL	_ch_pos
(0116)    for(i=0;i<64;i++)
    01F8 24AA      CLR	R10
    01F9 C026      RJMP	0x0220
(0117)     {
(0118) 	 
(0119) 	 if(cs)
    01FA 2366      TST	R22
    01FB F091      BEQ	0x020E
(0120) 	    {
(0121) 		 R_data=p3[2*j][i];                 //右半屏显示
    01FC E082      LDI	R24,2
    01FD 9F84      MUL	R24,R20
    01FE 2D10      MOV	R17,R0
    01FF E400      LDI	R16,0x40
    0200 0201      MULS	R16,R17
    0201 EF84      LDI	R24,0xF4
    0202 E090      LDI	R25,0
    0203 0110      MOVW	R2,R0
    0204 0E28      ADD	R2,R24
    0205 1E39      ADC	R3,R25
    0206 2DEA      MOV	R30,R10
    0207 27FF      CLR	R31
    0208 0DE2      ADD	R30,R2
    0209 1DF3      ADC	R31,R3
    020A 91E4      LPM	R30,0(Z)
    020B 93E02006  STS	0x2006,R30
(0122) 		} 
    020D C011      RJMP	0x021F
(0123)      else 
(0124) 	    {
(0125) 		 L_data=p3[2*j][i];                 //左半屏显示
    020E E082      LDI	R24,2
    020F 9F84      MUL	R24,R20
    0210 2D10      MOV	R17,R0
    0211 E400      LDI	R16,0x40
    0212 0201      MULS	R16,R17
    0213 EF84      LDI	R24,0xF4
    0214 E090      LDI	R25,0
    0215 0110      MOVW	R2,R0
    0216 0E28      ADD	R2,R24
    0217 1E39      ADC	R3,R25
    0218 2DEA      MOV	R30,R10
    0219 27FF      CLR	R31
    021A 0DE2      ADD	R30,R2
    021B 1DF3      ADC	R31,R3
    021C 91E4      LPM	R30,0(Z)
    021D 93E0200A  STS	0x200A,R30
    021F 94A3      INC	R10
    0220 2D8A      MOV	R24,R10
    0221 3480      CPI	R24,0x40
    0222 F2B8      BCS	0x01FA
(0126) 		}  
(0127) 	} 
(0128)    if(cs)  ch_pos(1,2*j+1);                //右屏页码处理
    0223 2366      TST	R22
    0224 F039      BEQ	0x022C
    0225 E082      LDI	R24,2
    0226 9F84      MUL	R24,R20
    0227 2D20      MOV	R18,R0
    0228 5F2F      SUBI	R18,0xFF
    0229 E001      LDI	R16,1
    022A DF9B      RCALL	_ch_pos
    022B C006      RJMP	0x0232
(0129)    else    ch_pos(0,2*j+1);                //左屏页码处理
    022C E082      LDI	R24,2
    022D 9F84      MUL	R24,R20
    022E 2D20      MOV	R18,R0
    022F 5F2F      SUBI	R18,0xFF
    0230 2700      CLR	R16
    0231 DF94      RCALL	_ch_pos
(0130)    for(i=0;i<64;i++)
    0232 24AA      CLR	R10
    0233 C026      RJMP	0x025A
(0131)     { 
(0132) 	 if(cs) 
    0234 2366      TST	R22
    0235 F091      BEQ	0x0248
(0133) 	    {
(0134) 	     R_data=p3[2*j+1][i];               //右半屏显示
    0236 E082      LDI	R24,2
    0237 9F84      MUL	R24,R20
    0238 2D10      MOV	R17,R0
    0239 E400      LDI	R16,0x40
    023A 0201      MULS	R16,R17
    023B E384      LDI	R24,0x34
    023C E091      LDI	R25,1
    023D 0110      MOVW	R2,R0
    023E 0E28      ADD	R2,R24
    023F 1E39      ADC	R3,R25
    0240 2DEA      MOV	R30,R10
    0241 27FF      CLR	R31
    0242 0DE2      ADD	R30,R2
    0243 1DF3      ADC	R31,R3
    0244 91E4      LPM	R30,0(Z)
    0245 93E02006  STS	0x2006,R30
(0135) 		}
    0247 C011      RJMP	0x0259
(0136)      else   
(0137) 	    {
(0138) 		 
(0139) 	     L_data=p3[2*j+1][i];               //左半屏显示
    0248 E082      LDI	R24,2
    0249 9F84      MUL	R24,R20
    024A 2D10      MOV	R17,R0
    024B E400      LDI	R16,0x40
    024C 0201      MULS	R16,R17
    024D E384      LDI	R24,0x34
    024E E091      LDI	R25,1
    024F 0110      MOVW	R2,R0
    0250 0E28      ADD	R2,R24
    0251 1E39      ADC	R3,R25
    0252 2DEA      MOV	R30,R10
    0253 27FF      CLR	R31
    0254 0DE2      ADD	R30,R2
    0255 1DF3      ADC	R31,R3
    0256 91E4      LPM	R30,0(Z)
    0257 93E0200A  STS	0x200A,R30
    0259 94A3      INC	R10
    025A 2D8A      MOV	R24,R10
    025B 3480      CPI	R24,0x40
    025C F2B8      BCS	0x0234
    025D 9543      INC	R20
    025E 3043      CPI	R20,3
    025F F408      BCC	0x0261
    0260 CF8A      RJMP	0x01EB
    0261 940E026F  CALL	pop_gset3
    0263 9508      RET
(0140) 		}  
(0141)     }
(0142)   }  
(0143) }
(0144)  
(0145) void main(void)
(0146) {
(0147)   init_devices();
_main:
    0264 DF57      RCALL	_init_devices
(0148)   LCD_Clean();
    0265 DF0D      RCALL	_LCD_Clean
(0149)   LCD_Init();
    0266 DF36      RCALL	_LCD_Init
(0150)  write_photo(0);
    0267 2700      CLR	R16
    0268 DF7D      RCALL	_write_photo
(0151)   write_photo(1);
FILE: <library>
    0269 E001      LDI	R16,1
    026A DF7B      RCALL	_write_photo
    026B 9508      RET
pop_gset2:
    026C E0E2      LDI	R30,2
    026D 940C027E  JMP	pop
pop_gset3:
    026F E0E4      LDI	R30,4
    0270 940C027E  JMP	pop
push_gset5:
    0272 92FA      ST	R15,-Y
    0273 92EA      ST	R14,-Y
push_gset4:
    0274 92DA      ST	R13,-Y
    0275 92CA      ST	R12,-Y
push_gset3:
    0276 92BA      ST	R11,-Y
    0277 92AA      ST	R10,-Y
push_gset2:
    0278 937A      ST	R23,-Y
    0279 936A      ST	R22,-Y
push_gset1:
    027A 935A      ST	R21,-Y
    027B 934A      ST	R20,-Y
    027C 9508      RET
pop_gset1:
    027D E0E1      LDI	R30,1
pop:
    027E 9149      LD	R20,Y+
    027F 9159      LD	R21,Y+
    0280 FDE0      SBRC	R30,0
    0281 9508      RET
    0282 9169      LD	R22,Y+
    0283 9179      LD	R23,Y+
    0284 FDE1      SBRC	R30,1
    0285 9508      RET
    0286 90A9      LD	R10,Y+
    0287 90B9      LD	R11,Y+
    0288 FDE2      SBRC	R30,2
    0289 9508      RET
    028A 90C9      LD	R12,Y+
    028B 90D9      LD	R13,Y+
    028C FDE3      SBRC	R30,3
    028D 9508      RET
    028E 90E9      LD	R14,Y+
    028F 90F9      LD	R15,Y+
    0290 9508      RET

⌨️ 快捷键说明

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