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

📄 ac16-1.lst

📁 AVR单片机ATmega16(L)应用实例-驱动128×64点阵图形液晶模块
💻 LST
📖 第 1 页 / 共 2 页
字号:
    03A9 8388      STD	Y+0,R24
    03AA E026      LDI	R18,6
    03AB E082      LDI	R24,2
    03AC 9F84      MUL	R24,R20
    03AD 2D00      MOV	R16,R0
    03AE D0D8      RCALL	_display_hz
    03AF 9543      INC	R20
    03B0 3048      CPI	R20,0x8
    03B1 F408      BCC	0x03B3
    03B2 CFAC      RJMP	0x035F
(0102) /*******************************/
(0103) Delay_nms(3000);				
    03B3 EB08      LDI	R16,0xB8
    03B4 E01B      LDI	R17,0xB
    03B5 DE9F      RCALL	_Delay_nms
    03B6 CEB4      RJMP	0x026B
    03B7 9623      ADIW	R28,3
    03B8 9508      RET
(0104) }								
(0105) }								
(0106) /*----------------ATMEGA16L初始化子函数。-----------------------*/
(0107) void m16_init(void)
(0108) {
(0109) PORTA=0x00;
_m16_init:
    03B9 2422      CLR	R2
    03BA BA2B      OUT	0x1B,R2
(0110) DDRA=0xff;
    03BB EF8F      LDI	R24,0xFF
    03BC BB8A      OUT	0x1A,R24
(0111) PORTB=0x00;
    03BD BA28      OUT	0x18,R2
(0112) DDRB=0xff;
    03BE BB87      OUT	0x17,R24
    03BF 9508      RET
(0113) }
(0114) /*---------------判LCM忙子函数---------------*/
(0115) void lcd_busy(void)      		
(0116) {
(0117) uchar val;                     	
(0118) RS_0;_NOP();
_lcd_busy:
  val                  --> R16
    03C0 98C0      CBI	0x18,0
    03C1 0000      NOP
(0119) RW_1;_NOP();
    03C2 9AC1      SBI	0x18,1
    03C3 0000      NOP
(0120) DataPort=0x00;					
    03C4 2422      CLR	R2
    03C5 BA2B      OUT	0x1B,R2
    03C6 C00A      RJMP	0x03D1
(0121)  	while(1)
(0122) 	{							
(0123) 	EN_1;_NOP();
    03C7 9AC2      SBI	0x18,2
    03C8 0000      NOP
(0124) 	DDRA=0x00;
    03C9 2422      CLR	R2
    03CA BA2A      OUT	0x1A,R2
(0125) 	val=PINA;			 		
    03CB B309      IN	R16,0x19
(0126) 	if(val<0x80) break;      	
    03CC 3800      CPI	R16,0x80
    03CD F408      BCC	0x03CF
    03CE C003      RJMP	0x03D2
(0127) 	EN_0;_NOP();				
    03CF 98C2      CBI	0x18,2
    03D0 0000      NOP
    03D1 CFF5      RJMP	0x03C7
(0128) 	}
(0129) DDRA=0xff;             			
    03D2 EF8F      LDI	R24,0xFF
    03D3 BB8A      OUT	0x1A,R24
(0130) EN_0;_NOP();           			
    03D4 98C2      CBI	0x18,2
    03D5 0000      NOP
    03D6 9508      RET
_wcode:
  sel_r                --> Y+4
  sel_l                --> R22
  c                    --> R20
    03D7 940E04E5  CALL	push_gset2
    03D9 2F62      MOV	R22,R18
    03DA 2F40      MOV	R20,R16
(0131) }                    			
(0132) /*--------------写指令到LCM子函数---------------*/
(0133) void wcode(uchar c,uchar sel_l,uchar sel_r) 
(0134) {	
(0135) if(sel_l==1)CS1_1;
    03DB 3061      CPI	R22,1
    03DC F411      BNE	0x03DF
    03DD 9AC3      SBI	0x18,3
    03DE C001      RJMP	0x03E0
(0136) else CS1_0;						
    03DF 98C3      CBI	0x18,3
(0137) _NOP();                 		
    03E0 0000      NOP
(0138) if(sel_r==1)CS2_1;
    03E1 818C      LDD	R24,Y+4
    03E2 3081      CPI	R24,1
    03E3 F411      BNE	0x03E6
    03E4 9AC4      SBI	0x18,4
    03E5 C001      RJMP	0x03E7
(0139) else CS2_0;
    03E6 98C4      CBI	0x18,4
(0140) _NOP();							
    03E7 0000      NOP
(0141) lcd_busy();						
    03E8 DFD7      RCALL	_lcd_busy
(0142) RS_0;_NOP();					
    03E9 98C0      CBI	0x18,0
    03EA 0000      NOP
(0143) RW_0;_NOP();					
    03EB 98C1      CBI	0x18,1
    03EC 0000      NOP
(0144) DataPort=c;						
    03ED BB4B      OUT	0x1B,R20
(0145) EN_1;_NOP();					
    03EE 9AC2      SBI	0x18,2
    03EF 0000      NOP
(0146) EN_0;_NOP();					
    03F0 98C2      CBI	0x18,2
    03F1 0000      NOP
    03F2 940E04D9  CALL	pop_gset2
    03F4 9508      RET
_wdata:
  sel_r                --> Y+4
  sel_l                --> R22
  c                    --> R20
    03F5 940E04E5  CALL	push_gset2
    03F7 2F62      MOV	R22,R18
    03F8 2F40      MOV	R20,R16
(0147) }								
(0148) /*---------------写数据到LCM子函数-------------*/
(0149) void wdata(uchar c,uchar sel_l,uchar sel_r) 
(0150) {								
(0151) if(sel_l==1)CS1_1;
    03F9 3061      CPI	R22,1
    03FA F411      BNE	0x03FD
    03FB 9AC3      SBI	0x18,3
    03FC C001      RJMP	0x03FE
(0152) else CS1_0;		
    03FD 98C3      CBI	0x18,3
(0153) _NOP();             
    03FE 0000      NOP
(0154) if(sel_r==1)CS2_1;
    03FF 818C      LDD	R24,Y+4
    0400 3081      CPI	R24,1
    0401 F411      BNE	0x0404
    0402 9AC4      SBI	0x18,4
    0403 C001      RJMP	0x0405
(0155) else CS2_0;                 
    0404 98C4      CBI	0x18,4
(0156) _NOP();					
    0405 0000      NOP
(0157) lcd_busy();						
    0406 DFB9      RCALL	_lcd_busy
(0158) RS_1;_NOP();					
    0407 9AC0      SBI	0x18,0
    0408 0000      NOP
(0159) RW_0;_NOP();					
    0409 98C1      CBI	0x18,1
    040A 0000      NOP
(0160) DataPort=c;                   
    040B BB4B      OUT	0x1B,R20
(0161) EN_1;_NOP();			
    040C 9AC2      SBI	0x18,2
    040D 0000      NOP
(0162) EN_0;_NOP();			
    040E 98C2      CBI	0x18,2
    040F 0000      NOP
    0410 940E04D9  CALL	pop_gset2
    0412 9508      RET
_lw:
  dd                   --> Y+5
  y                    --> R22
  x                    --> R20
    0413 940E04E5  CALL	push_gset2
    0415 2F62      MOV	R22,R18
    0416 2F40      MOV	R20,R16
    0417 9721      SBIW	R28,1
(0163) }						
(0164) /*根据x、y地址定位,将数据写入LCM左半屏或右半屏的子函数*/
(0165) void lw(uchar x, uchar y, uchar dd)	
(0166) {								
(0167) if(x>=64) 						
    0418 3440      CPI	R20,0x40
    0419 F050      BCS	0x0424
(0168) {set_xy(x-64,y);				
    041A 2F26      MOV	R18,R22
    041B 2F04      MOV	R16,R20
    041C 5400      SUBI	R16,0x40
    041D D020      RCALL	_set_xy
(0169) wdata(dd,0,1);}		
    041E E081      LDI	R24,1
    041F 8388      STD	Y+0,R24
    0420 2722      CLR	R18
    0421 810D      LDD	R16,Y+5
    0422 DFD2      RCALL	_wdata
    0423 C008      RJMP	0x042C
(0170) else 						
(0171) {set_xy(x,y);				
    0424 2F26      MOV	R18,R22
    0425 2F04      MOV	R16,R20
    0426 D017      RCALL	_set_xy
(0172) wdata(dd,1,0);}			
    0427 2422      CLR	R2
    0428 8228      STD	Y+0,R2
    0429 E021      LDI	R18,1
    042A 810D      LDD	R16,Y+5
    042B DFC9      RCALL	_wdata
    042C 9621      ADIW	R28,1
    042D 940E04D9  CALL	pop_gset2
    042F 9508      RET
_set_startline:
  i                    --> R20
    0430 940E04E7  CALL	push_gset1
    0432 2F40      MOV	R20,R16
    0433 9721      SBIW	R28,1
(0173) }						
(0174) /*---------------设定起始行子函数--------------*/
(0175) void set_startline(uchar i) 	
(0176) {								
(0177) i=0xc0+i;					
    0434 5440      SUBI	R20,0x40
(0178) wcode(i,1,1);				
    0435 E081      LDI	R24,1
    0436 8388      STD	Y+0,R24
    0437 E021      LDI	R18,1
    0438 2F04      MOV	R16,R20
    0439 DF9D      RCALL	_wcode
    043A 9621      ADIW	R28,1
    043B 940E04EA  CALL	pop_gset1
    043D 9508      RET
_set_xy:
  y                    --> R20
  x                    --> R22
    043E 940E04E5  CALL	push_gset2
    0440 2F42      MOV	R20,R18
    0441 2F60      MOV	R22,R16
    0442 9721      SBIW	R28,1
(0179) }						
(0180) /*---------------定位x方向、y方向的子函数--------------*/
(0181) void set_xy(uchar x,uchar y) 	
(0182) {								
(0183) x=x+0x40;                      	
    0443 5C60      SUBI	R22,0xC0
(0184) y=y+0xb8;                    	
    0444 5448      SUBI	R20,0x48
(0185) wcode(x,1,1);                  
    0445 E081      LDI	R24,1
    0446 8388      STD	Y+0,R24
    0447 E021      LDI	R18,1
    0448 2F06      MOV	R16,R22
    0449 DF8D      RCALL	_wcode
(0186) wcode(y,1,1);                  
    044A E081      LDI	R24,1
    044B 8388      STD	Y+0,R24
    044C E021      LDI	R18,1
    044D 2F04      MOV	R16,R20
    044E DF88      RCALL	_wcode
    044F 9621      ADIW	R28,1
    0450 940E04D9  CALL	pop_gset2
    0452 9508      RET
_dison_off:
  o                    --> R20
    0453 940E04E7  CALL	push_gset1
    0455 2F40      MOV	R20,R16
    0456 9721      SBIW	R28,1
(0187) }                             	
(0188) /*---------------屏幕开启、关闭子函数--------------*/
(0189) void dison_off(uchar o) 		
(0190) {                              	
(0191) o=o+0x3e;                    	
    0457 5C42      SUBI	R20,0xC2
(0192) wcode(o,1,1);                
    0458 E081      LDI	R24,1
    0459 8388      STD	Y+0,R24
    045A E021      LDI	R18,1
    045B 2F04      MOV	R16,R20
    045C DF7A      RCALL	_wcode
    045D 9621      ADIW	R28,1
    045E 940E04EA  CALL	pop_gset1
    0460 9508      RET
(0193) }                              
(0194) /*---------------复位子函数---------------*/
(0195) void reset(void)                
(0196) {                       		
(0197) RST_0;                     	
_reset:
    0461 98C5      CBI	0x18,5
(0198) Delay_nms(10);				
    0462 E00A      LDI	R16,0xA
    0463 E010      LDI	R17,0
    0464 DDF0      RCALL	_Delay_nms
(0199) RST_1;							
    0465 9AC5      SBI	0x18,5
(0200) Delay_nms(10);				
    0466 E00A      LDI	R16,0xA
    0467 E010      LDI	R17,0
    0468 DDEC      RCALL	_Delay_nms
    0469 9508      RET
_lcd_init:
  y                    --> R20
  x                    --> R22
    046A 940E04E5  CALL	push_gset2
    046C 9721      SBIW	R28,1
(0201) }								
(0202) /*--------------LCM初始化子函数-------------*/
(0203) void lcd_init(void) 			
(0204) {uchar x,y;              		
(0205) reset();						
    046D DFF3      RCALL	_reset
(0206) set_startline(0);				
    046E 2700      CLR	R16
    046F DFC0      RCALL	_set_startline
(0207) dison_off(0);					
    0470 2700      CLR	R16
    0471 DFE1      RCALL	_dison_off
(0208) for(y=0;y<8;y++)				
    0472 2744      CLR	R20
    0473 C00B      RJMP	0x047F
(0209) 	{							
(0210) 	for(x=0;x<128;x++)lw(x,y,0);
    0474 2766      CLR	R22
    0475 C006      RJMP	0x047C
    0476 2422      CLR	R2
    0477 8228      STD	Y+0,R2
    0478 2F24      MOV	R18,R20
    0479 2F06      MOV	R16,R22
    047A DF98      RCALL	_lw
    047B 9563      INC	R22
    047C 3860      CPI	R22,0x80
    047D F3C0      BCS	0x0476
    047E 9543      INC	R20
    047F 3048      CPI	R20,0x8
    0480 F398      BCS	0x0474
(0211) 	}							
(0212) dison_off(1);				
    0481 E001      LDI	R16,1
    0482 DFD0      RCALL	_dison_off
    0483 9621      ADIW	R28,1
    0484 940E04D9  CALL	pop_gset2
    0486 9508      RET
_display_hz:
  dx                   --> R20
  i                    --> R22
  fb                   --> R10
  n                    --> R12
  yy                   --> R14
  xx                   --> Y+11
    0487 940E04D4  CALL	push_arg4
    0489 940E04DF  CALL	push_gset5
    048B 2EE2      MOV	R14,R18
    048C 9721      SBIW	R28,1
    048D 84CF      LDD	R12,Y+15
    048E 88A9      LDD	R10,Y+17
(0213) }						
(0214) /*---------------显示汉字子函数--------------*/
(0215) void display_hz(uchar xx, uchar yy, uchar n, uchar fb) 
(0216) {					
(0217) uchar i,dx;                     
(0218) for(i=0;i<16;i++)				
    048F 2766      CLR	R22
    0490 C03B      RJMP	0x04CC
(0219) {dx=hz[2*i+n*32];				
    0491 E280      LDI	R24,0x20
    0492 9D8C      MUL	R24,R12
    0493 0110      MOVW	R2,R0
    0494 E082      LDI	R24,2
    0495 9F86      MUL	R24,R22
    0496 01F0      MOVW	R30,R0
    0497 0DE2      ADD	R30,R2
    0498 1DF3      ADC	R31,R3
    0499 E584      LDI	R24,0x54
    049A E090      LDI	R25,0
    049B 0FE8      ADD	R30,R24
    049C 1FF9      ADC	R31,R25
    049D 9144      LPM	R20,0(Z)
(0220) if(fb)dx=255-dx;				
    049E 20AA      TST	R10
    049F F029      BEQ	0x04A5
    04A0 2E24      MOV	R2,R20
    04A1 2433      CLR	R3
    04A2 EF4F      LDI	R20,0xFF
    04A3 1942      SUB	R20,R2
    04A4 0953      SBC	R21,R3
(0221) lw(xx*8+i,yy,dx);				
    04A5 8348      STD	Y+0,R20
    04A6 2D2E      MOV	R18,R14
    04A7 E088      LDI	R24,0x8
    04A8 840B      LDD	R0,Y+11
    04A9 9D80      MUL	R24,R0
    04AA 2D00      MOV	R16,R0
    04AB 0F06      ADD	R16,R22
    04AC DF66      RCALL	_lw
(0222) dx=hz[(2*i+1)+n*32];			
    04AD E280      LDI	R24,0x20
    04AE 9D8C      MUL	R24,R12
    04AF 0110      MOVW	R2,R0
    04B0 E082      LDI	R24,2
    04B1 9F86      MUL	R24,R22
    04B2 01F0      MOVW	R30,R0
    04B3 9631      ADIW	R30,1
    04B4 0DE2      ADD	R30,R2
    04B5 1DF3      ADC	R31,R3
    04B6 E584      LDI	R24,0x54
    04B7 E090      LDI	R25,0
    04B8 0FE8      ADD	R30,R24
    04B9 1FF9      ADC	R31,R25
    04BA 9144      LPM	R20,0(Z)
(0223) if(fb)dx=255-dx;			
    04BB 20AA      TST	R10
    04BC F029      BEQ	0x04C2
    04BD 2E24      MOV	R2,R20
    04BE 2433      CLR	R3
    04BF EF4F      LDI	R20,0xFF
    04C0 1942      SUB	R20,R2
    04C1 0953      SBC	R21,R3
(0224) lw(xx*8+i,yy+1,dx);			
FILE: <library>
    04C2 8348      STD	Y+0,R20
    04C3 2D2E      MOV	R18,R14
    04C4 5F2F      SUBI	R18,0xFF
    04C5 E088      LDI	R24,0x8
    04C6 840B      LDD	R0,Y+11
    04C7 9D80      MUL	R24,R0
    04C8 2D00      MOV	R16,R0
    04C9 0F06      ADD	R16,R22
    04CA DF48      RCALL	_lw
    04CB 9563      INC	R22
    04CC 3160      CPI	R22,0x10
    04CD F408      BCC	0x04CF
    04CE CFC2      RJMP	0x0491
    04CF 9621      ADIW	R28,1
    04D0 940E04DC  CALL	pop_gset5
    04D2 9624      ADIW	R28,4
    04D3 9508      RET
push_arg4:
    04D4 933A      ST	R19,-Y
    04D5 932A      ST	R18,-Y
push_arg2:
    04D6 931A      ST	R17,-Y
    04D7 930A      ST	R16,-Y
    04D8 9508      RET
pop_gset2:
    04D9 E0E2      LDI	R30,2
    04DA 940C04EB  JMP	pop
pop_gset5:
    04DC 27EE      CLR	R30
    04DD 940C04EB  JMP	pop
push_gset5:
    04DF 92FA      ST	R15,-Y
    04E0 92EA      ST	R14,-Y
push_gset4:
    04E1 92DA      ST	R13,-Y
    04E2 92CA      ST	R12,-Y
push_gset3:
    04E3 92BA      ST	R11,-Y
    04E4 92AA      ST	R10,-Y
push_gset2:
    04E5 937A      ST	R23,-Y
    04E6 936A      ST	R22,-Y
push_gset1:
    04E7 935A      ST	R21,-Y
    04E8 934A      ST	R20,-Y
    04E9 9508      RET
pop_gset1:
    04EA E0E1      LDI	R30,1
pop:
    04EB 9149      LD	R20,Y+
    04EC 9159      LD	R21,Y+
    04ED FDE0      SBRC	R30,0
    04EE 9508      RET
    04EF 9169      LD	R22,Y+
    04F0 9179      LD	R23,Y+
    04F1 FDE1      SBRC	R30,1
    04F2 9508      RET
    04F3 90A9      LD	R10,Y+
    04F4 90B9      LD	R11,Y+
    04F5 FDE2      SBRC	R30,2
    04F6 9508      RET
    04F7 90C9      LD	R12,Y+
    04F8 90D9      LD	R13,Y+
    04F9 FDE3      SBRC	R30,3
    04FA 9508      RET
    04FB 90E9      LD	R14,Y+
    04FC 90F9      LD	R15,Y+
    04FD 9508      RET

⌨️ 快捷键说明

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