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

📄 m16_vs1003_test.lst

📁 AVR单片机系统开发经典实例部分源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0674 9624      ADIW	R28,4
    0675 9508      RET
_LCD_move_chinese_string:
  i                    --> R20
  j                    --> R22
  buffer_l             --> Y+84
  buffer_h             --> Y+0
  n                    --> R10
  T                    --> R12
  Y                    --> R14
  X                    --> Y+178
    0676 940E132C  CALL	push_arg4
    0678 940E1422  CALL	push_gset5
    067A 2EE2      MOV	R14,R18
    067B 97EF      SBIW	R28,0x3F
    067C 97EF      SBIW	R28,0x3F
    067D 97AA      SBIW	R28,0x2A
    067E 01FE      MOVW	R30,R28
    067F 54EA      SUBI	R30,0x4A
    0680 4FFF      SBCI	R31,0xFF
    0681 80C0      LDD	R12,Z+0
(0138)       }
(0139)   }
(0140)   
(0141) /*-----------------------------------------------------------------------
(0142) LCD_move_chinese_string: 汉字移动
(0143) 
(0144) 输入参数:X、Y    :显示汉字的起始X、Y坐标;
(0145)           T       :移动速度;
(0146) 
(0147) 编写日期          :2004-8-13 
(0148) 最后修改日期      :2004-8-13 
(0149) -----------------------------------------------------------------------*/                        
(0150) void LCD_move_chinese_string (unsigned char X, unsigned char Y, unsigned char T)
(0151)   {
(0152)     unsigned char i,n,j=0;
    0682 2766      CLR	R22
(0153)     unsigned char buffer_h[84]={0};
    0683 E18C      LDI	R24,0x1C
    0684 E094      LDI	R25,4
    0685 01FE      MOVW	R30,R28
    0686 E504      LDI	R16,0x54
    0687 E010      LDI	R17,0
    0688 93FA      ST	R31,-Y
    0689 93EA      ST	R30,-Y
    068A 939A      ST	R25,-Y
    068B 938A      ST	R24,-Y
    068C 940E1485  CALL	asgncblk
(0154)     unsigned char buffer_l[84]={0};
    068E E780      LDI	R24,0x70
    068F E094      LDI	R25,4
    0690 01FE      MOVW	R30,R28
    0691 5AEC      SUBI	R30,0xAC
    0692 4FFF      SBCI	R31,0xFF
    0693 E504      LDI	R16,0x54
    0694 E010      LDI	R17,0
    0695 93FA      ST	R31,-Y
    0696 93EA      ST	R30,-Y
    0697 939A      ST	R25,-Y
    0698 938A      ST	R24,-Y
    0699 940E1485  CALL	asgncblk
(0155)       
(0156)     for (i=0; i<156; i++)
    069B 2744      CLR	R20
    069C C080      RJMP	0x071D
(0157)       {
(0158)         buffer_h[83] = move_chinese_string[i/12][j];
    069D E01C      LDI	R17,0xC
    069E 2F04      MOV	R16,R20
    069F 940E13C0  CALL	div8u
    06A1 E188      LDI	R24,0x18
    06A2 9F80      MUL	R24,R16
    06A3 0110      MOVW	R2,R0
    06A4 E58C      LDI	R24,0x5C
    06A5 E093      LDI	R25,3
    06A6 0E28      ADD	R2,R24
    06A7 1E39      ADC	R3,R25
    06A8 2FE6      MOV	R30,R22
    06A9 27FF      CLR	R31
    06AA 0DE2      ADD	R30,R2
    06AB 1DF3      ADC	R31,R3
    06AC 91E4      LPM	R30,0(Z)
    06AD 01DE      MOVW	R26,R28
    06AE 5AAD      SUBI	R26,0xAD
    06AF 4FBF      SBCI	R27,0xFF
    06B0 93EC      ST	R30,0(X)
(0159)         buffer_l[83] = move_chinese_string[i/12][j+12];
    06B1 E01C      LDI	R17,0xC
    06B2 2F04      MOV	R16,R20
    06B3 940E13C0  CALL	div8u
    06B5 E188      LDI	R24,0x18
    06B6 9F80      MUL	R24,R16
    06B7 0110      MOVW	R2,R0
    06B8 E58C      LDI	R24,0x5C
    06B9 E093      LDI	R25,3
    06BA 0E28      ADD	R2,R24
    06BB 1E39      ADC	R3,R25
    06BC 2FE6      MOV	R30,R22
    06BD 27FF      CLR	R31
    06BE 963C      ADIW	R30,0xC
    06BF 0DE2      ADD	R30,R2
    06C0 1DF3      ADC	R31,R3
    06C1 91E4      LPM	R30,0(Z)
    06C2 01DE      MOVW	R26,R28
    06C3 55A9      SUBI	R26,0x59
    06C4 4FBF      SBCI	R27,0xFF
    06C5 93EC      ST	R30,0(X)
(0160)         j++;
    06C6 9563      INC	R22
(0161)         if (j==12) j=0;
    06C7 306C      CPI	R22,0xC
    06C8 F409      BNE	0x06CA
    06C9 2766      CLR	R22
(0162)         
(0163)         for (n=0; n<83; n++)
    06CA 24AA      CLR	R10
    06CB C01E      RJMP	0x06EA
(0164)           { 
(0165)             buffer_h[n]=buffer_h[n+1];
    06CC 01CE      MOVW	R24,R28
    06CD 9601      ADIW	R24,1
    06CE 2DEA      MOV	R30,R10
    06CF 27FF      CLR	R31
    06D0 0FE8      ADD	R30,R24
    06D1 1FF9      ADC	R31,R25
    06D2 8020      LDD	R2,Z+0
    06D3 01CE      MOVW	R24,R28
    06D4 2DEA      MOV	R30,R10
    06D5 27FF      CLR	R31
    06D6 0FE8      ADD	R30,R24
    06D7 1FF9      ADC	R31,R25
    06D8 8220      STD	Z+0,R2
(0166)             buffer_l[n]=buffer_l[n+1];
    06D9 01CE      MOVW	R24,R28
    06DA 5A8B      SUBI	R24,0xAB
    06DB 4F9F      SBCI	R25,0xFF
    06DC 2DEA      MOV	R30,R10
    06DD 27FF      CLR	R31
    06DE 0FE8      ADD	R30,R24
    06DF 1FF9      ADC	R31,R25
    06E0 8020      LDD	R2,Z+0
    06E1 01CE      MOVW	R24,R28
    06E2 5A8C      SUBI	R24,0xAC
    06E3 4F9F      SBCI	R25,0xFF
    06E4 2DEA      MOV	R30,R10
    06E5 27FF      CLR	R31
    06E6 0FE8      ADD	R30,R24
    06E7 1FF9      ADC	R31,R25
    06E8 8220      STD	Z+0,R2
    06E9 94A3      INC	R10
    06EA 2D8A      MOV	R24,R10
    06EB 3583      CPI	R24,0x53
    06EC F2F8      BCS	0x06CC
(0167)           } 
(0168)         
(0169)         LCD_set_XY(X,Y);
    06ED 2D2E      MOV	R18,R14
    06EE 01FE      MOVW	R30,R28
    06EF 54EE      SUBI	R30,0x4E
    06F0 4FFF      SBCI	R31,0xFF
    06F1 8100      LDD	R16,Z+0
    06F2 DEFF      RCALL	_LCD_set_XY
(0170)         for (n=0; n<83; n++)
    06F3 24AA      CLR	R10
    06F4 C009      RJMP	0x06FE
(0171)           { 
(0172)             LCD_write_byte(buffer_h[n],1);
    06F5 E021      LDI	R18,1
    06F6 01CE      MOVW	R24,R28
    06F7 2DEA      MOV	R30,R10
    06F8 27FF      CLR	R31
    06F9 0FE8      ADD	R30,R24
    06FA 1FF9      ADC	R31,R25
    06FB 8100      LDD	R16,Z+0
    06FC D072      RCALL	_LCD_write_byte
    06FD 94A3      INC	R10
    06FE 2D8A      MOV	R24,R10
    06FF 3583      CPI	R24,0x53
    0700 F3A0      BCS	0x06F5
(0173)           } 
(0174)         
(0175)         LCD_set_XY(X,Y+1); 
    0701 2D2E      MOV	R18,R14
    0702 5F2F      SUBI	R18,0xFF
    0703 01FE      MOVW	R30,R28
    0704 54EE      SUBI	R30,0x4E
    0705 4FFF      SBCI	R31,0xFF
    0706 8100      LDD	R16,Z+0
    0707 DEEA      RCALL	_LCD_set_XY
(0176)         for (n=0; n<83; n++)
    0708 24AA      CLR	R10
    0709 C00B      RJMP	0x0715
(0177)           { 
(0178)             LCD_write_byte(buffer_l[n],1);
    070A E021      LDI	R18,1
    070B 01CE      MOVW	R24,R28
    070C 5A8C      SUBI	R24,0xAC
    070D 4F9F      SBCI	R25,0xFF
    070E 2DEA      MOV	R30,R10
    070F 27FF      CLR	R31
    0710 0FE8      ADD	R30,R24
    0711 1FF9      ADC	R31,R25
    0712 8100      LDD	R16,Z+0
    0713 D05B      RCALL	_LCD_write_byte
    0714 94A3      INC	R10
    0715 2D8A      MOV	R24,R10
    0716 3583      CPI	R24,0x53
    0717 F390      BCS	0x070A
(0179)           } 
(0180)           
(0181)        delay_nms(T);
    0718 2D0C      MOV	R16,R12
    0719 2711      CLR	R17
    071A 940E131D  CALL	_delay_nms
    071C 9543      INC	R20
    071D 394C      CPI	R20,0x9C
    071E F408      BCC	0x0720
    071F CF7D      RJMP	0x069D
    0720 96EF      ADIW	R28,0x3F
    0721 96EF      ADIW	R28,0x3F
    0722 96AA      ADIW	R28,0x2A
    0723 940E141F  CALL	pop_gset5
    0725 9624      ADIW	R28,4
    0726 9508      RET
_LCD_draw_bmp_pixel:
  row                  --> R20
  n                    --> R22
  i                    --> R14
  Pix_y                --> Y+18
  Pix_x                --> R10
  map                  --> R12
  Y                    --> Y+12
  X                    --> Y+10
    0727 940E132C  CALL	push_arg4
    0729 940E1422  CALL	push_gset5
    072B 84CE      LDD	R12,Y+14
    072C 84DF      LDD	R13,Y+15
    072D 88A8      LDD	R10,Y+16
(0182)       }
(0183)   }
(0184) /*void LCD_move_english_string (unsigned char X, unsigned char Y, unsigned char T,unsigned int n)
(0185)   {
(0186)     unsigned char i,n,j=0;
(0187)     unsigned char buffer[84]={0};
(0188)     T -= 31;  
(0189)     for (i=0; i<n; i++)
(0190)       {
(0191)         buffer[83] = LCD_write_byte(font6x8[T][j], 1);
(0192)         j++;
(0193)         if (j==6) j=0;
(0194)         
(0195)         for (n=0; n<83; n++)
(0196)           { 
(0197)             buffer_h[n]=buffer_h[n+1];
(0198)             buffer_l[n]=buffer_l[n+1];
(0199)           } 
(0200)         
(0201)         LCD_set_XY(X,Y);
(0202)         for (n=0; n<83; n++)
(0203)           { 
(0204)             LCD_write_byte(buffer_h[n],1);
(0205)           } 
(0206)         
(0207)         LCD_set_XY(X,Y+1); 
(0208)         for (n=0; n<83; n++)
(0209)           { 
(0210)             LCD_write_byte(buffer_l[n],1);
(0211)           } 
(0212)           
(0213)        delay_nms(T);
(0214)       }
(0215)   }*/
(0216)   /*
(0217) void LCD_write_char(unsigned char c)
(0218)   {
(0219)     unsigned char line;
(0220) 
(0221)     c -= 32;
(0222) 
(0223)     for (line=0; line<6; line++)
(0224)       LCD_write_byte(font6x8[c][line], 1);
(0225)   }
(0226) */
(0227) /*-----------------------------------------------------------------------
(0228) LCD_draw_map      : 位图绘制函数
(0229) 
(0230) 输入参数:X、Y    :位图绘制的起始X、Y坐标;
(0231)           *map    :位图点阵数据;
(0232)           Pix_x   :位图像素(长)
(0233)           Pix_y   :位图像素(宽)
(0234) 
(0235) 编写日期          :2004-8-13
(0236) 最后修改日期      :2004-8-13 
(0237) -----------------------------------------------------------------------*/
(0238) void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,
(0239)                   unsigned char Pix_x,unsigned char Pix_y)
(0240)   {
(0241)     unsigned int i,n;
(0242)     unsigned char row;
(0243)     
(0244)     if (Pix_y%8==0) row=Pix_y/8;      //计算位图所占行数
    072E E018      LDI	R17,0x8
    072F 890A      LDD	R16,Y+18
    0730 940E13BE  CALL	mod8u
    0732 2300      TST	R16
    0733 F429      BNE	0x0739
    0734 894A      LDD	R20,Y+18
    0735 9546      LSR	R20
    0736 9546      LSR	R20
    0737 9546      LSR	R20
    0738 C005      RJMP	0x073E
(0245)       else
(0246)         row=Pix_y/8+1;
    0739 894A      LDD	R20,Y+18
    073A 9546      LSR	R20
    073B 9546      LSR	R20
    073C 9546      LSR	R20
    073D 5F4F      SUBI	R20,0xFF
(0247)     
(0248)     for (n=0;n<row;n++)
    073E 2766      CLR	R22
    073F 2777      CLR	R23
    0740 C025      RJMP	0x0766
(0249)       {
(0250)       	LCD_set_XY(X,Y);
    0741 852C      LDD	R18,Y+12
    0742 850A      LDD	R16,Y+10
    0743 DEAE      RCALL	_LCD_set_XY
(0251)         for(i=0; i<Pix_x; i++)
    0744 24EE      CLR	R14
    0745 24FF      CLR	R15
    0746 C015      RJMP	0x075C
(0252)           {
(0253)             LCD_write_byte(map[i+n*Pix_x], 1);
    0747 E021      LDI	R18,1
    0748 2C2A      MOV	R2,R10
    0749 2433      CLR	R3
    074A 932F      PUSH	R18
    074B 933F      PUSH	R19
    074C 0191      MOVW	R18,R2
    074D 018B      MOVW	R16,R22
    074E 940E13D6  CALL	empy16s
    0750 913F      POP	R19
    0751 912F      POP	R18
    0752 01F7      MOVW	R30,R14
    0753 0FE0      ADD	R30,R16
    0754 1FF1      ADC	R31,R17
    0755 0DEC      ADD	R30,R12
    0756 1DFD      ADC	R31,R13
    0757 8100      LDD	R16,Z+0
    0758 D016      RCALL	_LCD_write_byte
    0759 01C7      MOVW	R24,R14
    075A 9601      ADIW	R24,1
    075B 017C      MOVW	R14,R24
    075C 2C2A      MOV	R2,R10
    075D 2433      CLR	R3
    075E 14E2      CP	R14,R2
    075F 04F3      CPC	R15,R3
    0760 F330      BCS	0x0747
(0254)           }
(0255)         Y++;                         //换行
    0761 840C      LDD	R0,Y+12
    0762 9403      INC	R0
    0763 860C      STD	Y+12,R0
    0764 5F6F      SUBI	R22,0xFF
    0765 4F7F      SBCI	R23,0xFF
    0766 2E24      MOV	R2,R20
    0767 2433      CLR	R3
    0768 1562      CP	R22,R2
    0769 0573      CPC	R23,R3
    076A F2B0      BCS	0x0741
    076B 940E141F  CALL	pop_gset5
    076D 9624      ADIW	R28,4
    076E 9508      RET
(0256)       }      
(0257)   }
(0258) 
(0259) /*-----------------------------------------------------------------------
(0260) LCD_write_byte    : 使用SPI接口写数据到LCD
(0261) 
(0262) 输入参数:data    :写入的数据;
(0263)           command :写数据/命令选择;
(0264) 
(0265) 编写日期          :2004-8-10 
(0266) 最后修改日期      :2004-8-13 
(0267) -----------------------------------------------------------------------*/
(0268) void LCD_write_byte(unsigned char data, unsigned char command)
(0269)   {
(0270)     PORTA &= ~LCD_CE ;		        // 使能LCD
_LCD_write_byte:
  command              --> R18
  data                 --> R16
    076F 98DC      CBI	0x1B,4
(0271)     
(0272)     if (command == 0)
    0770 2322      TST	R18
    0771 F411      BNE	0x0774
(0273)       PORTA &= ~LCD_DC ;	        // 传送命令
    0772 98DE      CBI	0x1B,6
    0773 C001      RJMP	0x0775
(0274)     else
(0275)       PORTA |= LCD_DC ;		        // 传送数据
    0774 9ADE      SBI	0x1B,6
(0276) 
(0277)     SPDR = data;			// 传送数据到SPI寄存器
    0775 B90F      OUT	0x0F,R16
(0278) 
(0279)     while ((SPSR & 0x80) == 0);         // 等待数据传送完毕
    0776 9B77      SBIS	0x0E,7
    0777 CFFE      RJMP	0x0776
(0280) 	
(0281)     PORTA |= LCD_CE ;			// 关闭LCD

⌨️ 快捷键说明

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