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

📄 icc17-1.lst

📁 手把手教你学AVR单片机C程序设计实验程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    081E E5CF      LDI	R28,0x5F
    081F E0D4      LDI	R29,4
    0820 BFCD      OUT	0x3D,R28
    0821 BFDE      OUT	0x3E,R29
    0822 51C0      SUBI	R28,0x10
    0823 40D0      SBCI	R29,0
    0824 EA0A      LDI	R16,0xAA
    0825 8308      STD	Y+0,R16
    0826 2400      CLR	R0
    0827 E6EF      LDI	R30,0x6F
    0828 E0F0      LDI	R31,0
    0829 E010      LDI	R17,0
    082A 39E0      CPI	R30,0x90
    082B 07F1      CPC	R31,R17
    082C F011      BEQ	0x082F
    082D 9201      ST	R0,Z+
    082E CFFB      RJMP	0x082A
    082F 8300      STD	Z+0,R16
    0830 E2EC      LDI	R30,0x2C
    0831 E1F0      LDI	R31,0x10
    0832 E6A0      LDI	R26,0x60
    0833 E0B0      LDI	R27,0
    0834 E110      LDI	R17,0x10
    0835 33EB      CPI	R30,0x3B
    0836 07F1      CPC	R31,R17
    0837 F021      BEQ	0x083C
    0838 95C8      LPM
    0839 9631      ADIW	R30,1
    083A 920D      ST	R0,X+
    083B CFF9      RJMP	0x0835
    083C 940E10D7  CALL	_main
_exit:
    083E CFFF      RJMP	_exit
FILE: D:\文稿\手把手教你学AVR单片机C程序设计\第17章~1\第17章实验程序\icc17-1\lcd.c
(0001) /*---------------判LCM忙子函数---------------*/
(0002) void lcd_busy(void)      		
(0003) {
(0004) uchar val;                     	
(0005) RS_0;_NOP();_NOP();
_lcd_busy:
  val                  --> R16
    083F 98C0      CBI	0x18,0
    0840 0000      NOP
    0841 0000      NOP
(0006) RW_1;_NOP();_NOP();
    0842 9AC1      SBI	0x18,1
    0843 0000      NOP
    0844 0000      NOP
(0007) DataPort=0x00;					
    0845 2422      CLR	R2
    0846 BA2B      OUT	0x1B,R2
    0847 C00C      RJMP	0x0854
(0008)  	while(1)
(0009) 	{							
(0010) 	EN_1;_NOP();_NOP();  
    0848 9AC2      SBI	0x18,2
    0849 0000      NOP
    084A 0000      NOP
(0011) 	DDRA=0x00;
    084B 2422      CLR	R2
    084C BA2A      OUT	0x1A,R2
(0012) 	val=PINA;			 		
    084D B309      IN	R16,0x19
(0013) 	if(val<0x80) break;      	
    084E 3800      CPI	R16,0x80
    084F F408      BCC	0x0851
    0850 C004      RJMP	0x0855
(0014) 	EN_0;_NOP();_NOP(); 			
    0851 98C2      CBI	0x18,2
    0852 0000      NOP
    0853 0000      NOP
    0854 CFF3      RJMP	0x0848
(0015) 	}
(0016) DDRA=0xff;             			
    0855 EF8F      LDI	R24,0xFF
    0856 BB8A      OUT	0x1A,R24
(0017) EN_0;_NOP();_NOP();         			
    0857 98C2      CBI	0x18,2
    0858 0000      NOP
    0859 0000      NOP
    085A 9508      RET
_wcode:
  sel_r                --> Y+4
  sel_l                --> R22
  c                    --> R20
    085B 940E129B  CALL	push_gset2
    085D 2F62      MOV	R22,R18
    085E 2F40      MOV	R20,R16
(0018) }                    			
(0019) /*--------------写指令到LCM子函数---------------*/
(0020) void wcode(uchar c,uchar sel_l,uchar sel_r) 
(0021) {	
(0022) if(sel_l==1)CS1_1;
    085F 3061      CPI	R22,1
    0860 F411      BNE	0x0863
    0861 9AC3      SBI	0x18,3
    0862 C001      RJMP	0x0864
(0023) else CS1_0;						
    0863 98C3      CBI	0x18,3
(0024) _NOP();_NOP();            		
    0864 0000      NOP
    0865 0000      NOP
(0025) if(sel_r==1)CS2_1;
    0866 818C      LDD	R24,Y+4
    0867 3081      CPI	R24,1
    0868 F411      BNE	0x086B
    0869 9AC4      SBI	0x18,4
    086A C001      RJMP	0x086C
(0026) else CS2_0;
    086B 98C4      CBI	0x18,4
(0027) _NOP();_NOP();					
    086C 0000      NOP
    086D 0000      NOP
(0028) lcd_busy();						
    086E DFD0      RCALL	_lcd_busy
(0029) RS_0;_NOP();_NOP();				
    086F 98C0      CBI	0x18,0
    0870 0000      NOP
    0871 0000      NOP
(0030) RW_0;_NOP();_NOP();					
    0872 98C1      CBI	0x18,1
    0873 0000      NOP
    0874 0000      NOP
(0031) DataPort=c;						
    0875 BB4B      OUT	0x1B,R20
(0032) EN_1;_NOP();_NOP();				
    0876 9AC2      SBI	0x18,2
    0877 0000      NOP
    0878 0000      NOP
(0033) EN_0;_NOP();_NOP();				
    0879 98C2      CBI	0x18,2
    087A 0000      NOP
    087B 0000      NOP
    087C 940E1289  CALL	pop_gset2
    087E 9508      RET
_wdata:
  sel_r                --> Y+4
  sel_l                --> R22
  c                    --> R20
    087F 940E129B  CALL	push_gset2
    0881 2F62      MOV	R22,R18
    0882 2F40      MOV	R20,R16
(0034) }								
(0035) /*---------------写数据到LCM子函数-------------*/
(0036) void wdata(uchar c,uchar sel_l,uchar sel_r) 
(0037) {								
(0038) if(sel_l==1)CS1_1;
    0883 3061      CPI	R22,1
    0884 F411      BNE	0x0887
    0885 9AC3      SBI	0x18,3
    0886 C001      RJMP	0x0888
(0039) else CS1_0;		
    0887 98C3      CBI	0x18,3
(0040) _NOP();_NOP();             
    0888 0000      NOP
    0889 0000      NOP
(0041) if(sel_r==1)CS2_1;
    088A 818C      LDD	R24,Y+4
    088B 3081      CPI	R24,1
    088C F411      BNE	0x088F
    088D 9AC4      SBI	0x18,4
    088E C001      RJMP	0x0890
(0042) else CS2_0;                 
    088F 98C4      CBI	0x18,4
(0043) _NOP();_NOP();					
    0890 0000      NOP
    0891 0000      NOP
(0044) lcd_busy();						
    0892 DFAC      RCALL	_lcd_busy
(0045) RS_1;_NOP();_NOP();					
    0893 9AC0      SBI	0x18,0
    0894 0000      NOP
    0895 0000      NOP
(0046) RW_0;_NOP();_NOP();			
    0896 98C1      CBI	0x18,1
    0897 0000      NOP
    0898 0000      NOP
(0047) DataPort=c;                   
    0899 BB4B      OUT	0x1B,R20
(0048) EN_1;_NOP();_NOP();		
    089A 9AC2      SBI	0x18,2
    089B 0000      NOP
    089C 0000      NOP
(0049) EN_0;_NOP();_NOP();		
    089D 98C2      CBI	0x18,2
    089E 0000      NOP
    089F 0000      NOP
    08A0 940E1289  CALL	pop_gset2
    08A2 9508      RET
_lw:
  dd                   --> Y+5
  y                    --> R22
  x                    --> R20
    08A3 940E129B  CALL	push_gset2
    08A5 2F62      MOV	R22,R18
    08A6 2F40      MOV	R20,R16
    08A7 9721      SBIW	R28,1
(0050) }						
(0051) /*根据x、y地址定位,将数据写入LCM左半屏或右半屏的子函数*/
(0052) void lw(uchar x, uchar y, uchar dd)	
(0053) {								
(0054) if(x>=64) 						
    08A8 3440      CPI	R20,0x40
    08A9 F050      BCS	0x08B4
(0055) {set_xy(x-64,y);				
    08AA 2F26      MOV	R18,R22
    08AB 2F04      MOV	R16,R20
    08AC 5400      SUBI	R16,0x40
    08AD D020      RCALL	_set_xy
(0056) wdata(dd,0,1);}		
    08AE E081      LDI	R24,1
    08AF 8388      STD	Y+0,R24
    08B0 2722      CLR	R18
    08B1 810D      LDD	R16,Y+5
    08B2 DFCC      RCALL	_wdata
    08B3 C008      RJMP	0x08BC
(0057) else 						
(0058) {set_xy(x,y);				
    08B4 2F26      MOV	R18,R22
    08B5 2F04      MOV	R16,R20
    08B6 D017      RCALL	_set_xy
(0059) wdata(dd,1,0);}			
    08B7 2422      CLR	R2
    08B8 8228      STD	Y+0,R2
    08B9 E021      LDI	R18,1
    08BA 810D      LDD	R16,Y+5
    08BB DFC3      RCALL	_wdata
    08BC 9621      ADIW	R28,1
    08BD 940E1289  CALL	pop_gset2
    08BF 9508      RET
_set_startline:
  i                    --> R20
    08C0 940E129D  CALL	push_gset1
    08C2 2F40      MOV	R20,R16
    08C3 9721      SBIW	R28,1
(0060) }						
(0061) /*---------------设定起始行子函数--------------*/
(0062) void set_startline(uchar i) 	
(0063) {								
(0064) i=0xc0+i;					
    08C4 5440      SUBI	R20,0x40
(0065) wcode(i,1,1);				
    08C5 E081      LDI	R24,1
    08C6 8388      STD	Y+0,R24
    08C7 E021      LDI	R18,1
    08C8 2F04      MOV	R16,R20
    08C9 DF91      RCALL	_wcode
    08CA 9621      ADIW	R28,1
    08CB 940E12A0  CALL	pop_gset1
    08CD 9508      RET
_set_xy:
  y                    --> R20
  x                    --> R22
    08CE 940E129B  CALL	push_gset2
    08D0 2F42      MOV	R20,R18
    08D1 2F60      MOV	R22,R16
    08D2 9721      SBIW	R28,1
(0066) }						
(0067) /*---------------定位x方向、y方向的子函数--------------*/
(0068) void set_xy(uchar x,uchar y) 	
(0069) {								
(0070) x=x+0x40;                      	
    08D3 5C60      SUBI	R22,0xC0
(0071) y=y+0xb8;                    	
    08D4 5448      SUBI	R20,0x48
(0072) wcode(x,1,1);                  
    08D5 E081      LDI	R24,1
    08D6 8388      STD	Y+0,R24
    08D7 E021      LDI	R18,1
    08D8 2F06      MOV	R16,R22
    08D9 DF81      RCALL	_wcode
(0073) wcode(y,1,1);                  
    08DA E081      LDI	R24,1
    08DB 8388      STD	Y+0,R24
    08DC E021      LDI	R18,1
    08DD 2F04      MOV	R16,R20
    08DE DF7C      RCALL	_wcode
    08DF 9621      ADIW	R28,1
    08E0 940E1289  CALL	pop_gset2
    08E2 9508      RET
_dison_off:
  o                    --> R20
    08E3 940E129D  CALL	push_gset1
    08E5 2F40      MOV	R20,R16
    08E6 9721      SBIW	R28,1
(0074) }                             	
(0075) /*---------------屏幕开启、关闭子函数--------------*/
(0076) void dison_off(uchar o) 		
(0077) {                              	
(0078) o=o+0x3e;                    	
    08E7 5C42      SUBI	R20,0xC2
(0079) wcode(o,1,1);                
    08E8 E081      LDI	R24,1
    08E9 8388      STD	Y+0,R24
    08EA E021      LDI	R18,1
    08EB 2F04      MOV	R16,R20
    08EC DF6E      RCALL	_wcode
    08ED 9621      ADIW	R28,1
    08EE 940E12A0  CALL	pop_gset1
    08F0 9508      RET
(0080) }                              
(0081) /*---------------复位子函数---------------*/
(0082) void reset(void)                
(0083) {                       		
(0084) RST_0;                     	
_reset:
    08F1 98C5      CBI	0x18,5
(0085) Delay_nms(10);				
    08F2 E00A      LDI	R16,0xA
    08F3 E010      LDI	R17,0
    08F4 940E11F3  CALL	_Delay_nms
(0086) RST_1;							
    08F6 9AC5      SBI	0x18,5
(0087) Delay_nms(10);				
    08F7 E00A      LDI	R16,0xA
    08F8 E010      LDI	R17,0
    08F9 940E11F3  CALL	_Delay_nms
    08FB 9508      RET
_lcd_init:
  y                    --> R20
  x                    --> R22
    08FC 940E129B  CALL	push_gset2
    08FE 9721      SBIW	R28,1
(0088) }								
(0089) /*--------------LCM初始化子函数-------------*/
(0090) void lcd_init(void) 			
(0091) {uchar x,y;              		
(0092) reset();						
    08FF DFF1      RCALL	_reset
(0093) set_startline(0);				
    0900 2700      CLR	R16
    0901 DFBE      RCALL	_set_startline
(0094) dison_off(0);					
    0902 2700      CLR	R16
    0903 DFDF      RCALL	_dison_off
(0095)   for(y=0;y<8;y++)				
    0904 2744      CLR	R20
    0905 C00B      RJMP	0x0911
(0096)   {							
(0097)     for(x=0;x<128;x++)lw(x,y,0);
    0906 2766      CLR	R22
    0907 C006      RJMP	0x090E
    0908 2422      CLR	R2
    0909 8228      STD	Y+0,R2
    090A 2F24      MOV	R18,R20
    090B 2F06      MOV	R16,R22
    090C DF96      RCALL	_lw
    090D 9563      INC	R22
    090E 3860      CPI	R22,0x80
    090F F3C0      BCS	0x0908
    0910 9543      INC	R20
    0911 3048      CPI	R20,0x8
    0912 F398      BCS	0x0906
(0098)   }							
(0099) dison_off(1);				
    0913 E001      LDI	R16,1
    0914 DFCE      RCALL	_dison_off
    0915 9621      ADIW	R28,1
    0916 940E1289  CALL	pop_gset2
    0918 9508      RET
_display_hz:
  dx                   --> R20
  i                    --> R22
  p                    --> R10
  fb                   --> R12
  n                    --> R14
  yy                   --> Y+13
  xx                   --> Y+11
    0919 940E1222  CALL	push_arg4
    091B 940E1295  CALL	push_gset5
    091D 9721      SBIW	R28,1
    091E 84EF      LDD	R14,Y+15
    091F 88C9      LDD	R12,Y+17
    0920 88AB      LDD	R10,Y+19
    0921 88BC      LDD	R11,Y+20
(0100) }						
(0101) /*---------------显示一个汉字子函数--------------*/
(0102) void display_hz(uchar xx, uchar yy, uchar n, uchar fb,uchar const *p) 
(0103) {					
(0104) uchar i,dx;                     
(0105) for(i=0;i<16;i++)				
    0922 2766      CLR	R22
    0923 C037      RJMP	0x095B
(0106) {dx=p[2*i+n*32];				
    0924 E280      LDI	R24,0x20
    0925 9D8E      MUL	R24,R14
    0926 0110      MOVW	R2,R0
    0927 E082      LDI	R24,2
    0928 9F86      MUL	R24,R22
    0929 01F0      MOVW	R30,R0
    092A 0DE2      ADD	R30,R2
    092B 1DF3      ADC	R31,R3
    092C 0DEA      ADD	R30,R10

⌨️ 快捷键说明

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