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

📄 ad.lst

📁 M16内部采样并用Max7221-7219显示
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
      2A E5CF      LDI	R28,0x5F
      2B E0D4      LDI	R29,4
      2C BFCD      OUT	0x3D,R28
      2D BFDE      OUT	0x3E,R29
      2E 51CE      SUBI	R28,0x1E
      2F 40D0      SBCI	R29,0
      30 EA0A      LDI	R16,0xAA
      31 8308      STD	Y+0,R16
      32 2400      CLR	R0
      33 E6E0      LDI	R30,0x60
      34 E0F0      LDI	R31,0
      35 E010      LDI	R17,0
      36 36E0      CPI	R30,0x60
      37 07F1      CPC	R31,R17
      38 F011      BEQ	0x003B
      39 9201      ST	R0,Z+
      3A CFFB      RJMP	0x0036
      3B 8300      STD	Z+0,R16
      3C E5E4      LDI	R30,0x54
      3D E0F0      LDI	R31,0
      3E E6A0      LDI	R26,0x60
      3F E0B0      LDI	R27,0
      40 E010      LDI	R17,0
      41 E000      LDI	R16,0
      42 BF0B      OUT	0x3B,R16
      43 35E4      CPI	R30,0x54
      44 07F1      CPC	R31,R17
      45 F021      BEQ	0x004A
      46 95C8      LPM
      47 9631      ADIW	R30,1
      48 920D      ST	R0,X+
      49 CFF9      RJMP	0x0043
      4A 940E 01A5 CALL	_main
_exit:
      4C CFFF      RJMP	_exit
_SEND:
  i                    --> R10
  x                    --> Y,+0
  j                    --> R14
  ads                  --> R12
  dat                  --> R18
  add                  --> Y,+7
      4D 940E 01C4 CALL	push_arg4
      4F 940E 0223 CALL	push_xgset00FC
      51 9721      SBIW	R28,1
FILE: D:\MYDOCU~1\MYMCUW~1\AVR\AD\display.c
(0001) #include "display.h"
(0002) //===================MAX7219的核心函数,接收单片机的数据===================== 
(0003) void SEND(unsigned char add,unsigned char dat)//发送2个字节的子函数,第一个字节为地址,第二个字节为操作数  
(0004) {  
(0005) unsigned char ads,j,x;  
(0006) unsigned int i;  
(0007) i=0;  
      52 24AA      CLR	R10
      53 24BB      CLR	R11
(0008) MAX7219_LOAD_0;//load=0  
      54 98C4      CBI	0x18,4
      55 C01E      RJMP	0x0074
(0009)    while(i<16)  
(0010)    {  
(0011)    if (i<8){ads=add;}  
      56 01C5      MOVW	R24,R10
      57 3088      CPI	R24,0x8
      58 E0E0      LDI	R30,0
      59 079E      CPC	R25,R30
      5A F410      BCC	0x005D
      5B 80CF      LDD	R12,Y+7
      5C C001      RJMP	0x005E
(0012)    else {ads=dat;}  
      5D 2EC2      MOV	R12,R18
(0013)       for(j=8;j>=1;j--)  
      5E E088      LDI	R24,0x8
      5F 2EE8      MOV	R14,R24
      60 C00D      RJMP	0x006E
(0014)       {  
(0015)       x=ads&0x80;  
      61 2D8C      MOV	R24,R12
      62 7880      ANDI	R24,0x80
      63 8388      STD	Y+0,R24
(0016)          if (x==0){MAX7219_DIN_0;}  
      64 2E08      MOV	R0,R24
      65 2388      TST	R24
      66 F411      BNE	0x0069
      67 98C5      CBI	0x18,5
      68 C001      RJMP	0x006A
(0017)          else {MAX7219_DIN_1;}  
      69 9AC5      SBI	0x18,5
(0018)             ads=ads<<1;  
      6A 0CCC      LSL	R12
(0019)       MAX7219_CLK_1;//clk=1  
      6B 9AC7      SBI	0x18,7
(0020)          MAX7219_CLK_0;//clk=0  
      6C 98C7      CBI	0x18,7
      6D 94EA      DEC	R14
      6E 2D8E      MOV	R24,R14
      6F 3081      CPI	R24,1
      70 F780      BCC	0x0061
(0021)       }  
(0022)    i=i+8;  
      71 01C5      MOVW	R24,R10
      72 9608      ADIW	R24,0x8
      73 015C      MOVW	R10,R24
      74 01C5      MOVW	R24,R10
      75 3180      CPI	R24,0x10
      76 E0E0      LDI	R30,0
      77 079E      CPC	R25,R30
      78 F2E8      BCS	0x0056
(0023)    }  
(0024) MAX7219_LOAD_1;//load=1  
      79 9AC4      SBI	0x18,4
      7A 9621      ADIW	R28,1
      7B 940E 0218 CALL	pop_xgset00FC
      7D 9624      ADIW	R28,4
      7E 9508      RET
_SEG_LIGHT:
  light                --> R10
      7F 92AA      ST	R10,-Y
      80 0158      MOVW	R10,R16
(0025) }  
(0026) //===================================== 
(0027) 
(0028) //==============SEG亮度================ 
(0029) void SEG_LIGHT(unsigned light) 
(0030) { 
(0031) SEND(0x0a,light&0x0f); 
      81 2D2A      MOV	R18,R10
      82 702F      ANDI	R18,0xF
      83 7030      ANDI	R19,0
      84 E00A      LDI	R16,0xA
      85 DFC7      RCALL	_SEND
      86 90A9      LD	R10,Y+
      87 9508      RET
(0032) } 
(0033) //=================================== 
(0034) 
(0035) //==============SEG开================ 
(0036) void SEG_OPEN(void) 
(0037) { 
(0038) SEND(0x0c,0x01); 
_SEG_OPEN:
      88 E021      LDI	R18,1
      89 E00C      LDI	R16,0xC
      8A DFC2      RCALL	_SEND
      8B 9508      RET
(0039) } 
(0040) //=================================== 
(0041) 
(0042) //==============SEG关================ 
(0043) void SEG_CLOSE(void) 
(0044) { 
(0045) SEND(0x0c,0x00); 
_SEG_CLOSE:
      8C 2722      CLR	R18
      8D E00C      LDI	R16,0xC
      8E DFBE      RCALL	_SEND
      8F 9508      RET
_SEG_CLEAR:
  part                 --> R10
      90 92AA      ST	R10,-Y
      91 92BA      ST	R11,-Y
      92 2EA0      MOV	R10,R16
(0046) } 
(0047) //=================================== 
(0048) 
(0049) //==============SEG清屏==============
(0050) void SEG_CLEAR(unsigned char part) 
(0051) { 
(0052) switch(part) 
      93 24BB      CLR	R11
      94 20AA      TST	R10
      95 F411      BNE	0x0098
      96 20BB      TST	R11
      97 F031      BEQ	0x009E
      98 01C5      MOVW	R24,R10
      99 3081      CPI	R24,1
      9A E0E0      LDI	R30,0
      9B 079E      CPC	R25,R30
      9C F071      BEQ	0x00AB
      9D C01A      RJMP	0x00B8
(0053)         { 
(0054)         case 0://左 
(0055)                 { 
(0056)                 SEND(0x01,0x0f);  
      9E E02F      LDI	R18,0xF
      9F E001      LDI	R16,1
      A0 DFAC      RCALL	_SEND
(0057)                 SEND(0x02,0x0f);  
      A1 E02F      LDI	R18,0xF
      A2 E002      LDI	R16,2
      A3 DFA9      RCALL	_SEND
(0058)                 SEND(0x03,0x0f);  
      A4 E02F      LDI	R18,0xF
      A5 E003      LDI	R16,3
      A6 DFA6      RCALL	_SEND
(0059)                 SEND(0x04,0x0f); 
      A7 E02F      LDI	R18,0xF
      A8 E004      LDI	R16,4
      A9 DFA3      RCALL	_SEND
(0060)                 }break; 
      AA C025      RJMP	0x00D0
(0061)         case 1://右 
(0062)                 { 
(0063)                 SEND(0x05,0x0f);  
      AB E02F      LDI	R18,0xF
      AC E005      LDI	R16,5
      AD DF9F      RCALL	_SEND
(0064)                 SEND(0x06,0x0f);  
      AE E02F      LDI	R18,0xF
      AF E006      LDI	R16,6
      B0 DF9C      RCALL	_SEND
(0065)                 SEND(0x07,0x0f);  
      B1 E02F      LDI	R18,0xF
      B2 E007      LDI	R16,7
      B3 DF99      RCALL	_SEND
(0066)                 SEND(0x08,0x0f); 
      B4 E02F      LDI	R18,0xF
      B5 E008      LDI	R16,0x8
      B6 DF96      RCALL	_SEND
(0067)                 }break; 
      B7 C018      RJMP	0x00D0
(0068)         default://全部 
(0069)                 { 
(0070)                 SEND(0x01,0x0f);  
      B8 E02F      LDI	R18,0xF
      B9 E001      LDI	R16,1
      BA DF92      RCALL	_SEND
(0071)                 SEND(0x02,0x0f);  
      BB E02F      LDI	R18,0xF
      BC E002      LDI	R16,2
      BD DF8F      RCALL	_SEND
(0072)                 SEND(0x03,0x0f);  
      BE E02F      LDI	R18,0xF
      BF E003      LDI	R16,3
      C0 DF8C      RCALL	_SEND
(0073)                 SEND(0x04,0x0f); 
      C1 E02F      LDI	R18,0xF
      C2 E004      LDI	R16,4
      C3 DF89      RCALL	_SEND
(0074)                 SEND(0x05,0x0f);  
      C4 E02F      LDI	R18,0xF
      C5 E005      LDI	R16,5
      C6 DF86      RCALL	_SEND
(0075)                 SEND(0x06,0x0f);  
      C7 E02F      LDI	R18,0xF
      C8 E006      LDI	R16,6
      C9 DF83      RCALL	_SEND
(0076)                 SEND(0x07,0x0f);  
      CA E02F      LDI	R18,0xF
      CB E007      LDI	R16,7
      CC DF80      RCALL	_SEND
(0077)                 SEND(0x08,0x0f); 
      CD E02F      LDI	R18,0xF
      CE E008      LDI	R16,0x8
      CF DF7D      RCALL	_SEND
(0078)                 }break; 
      D0 90B9      LD	R11,Y+
      D1 90A9      LD	R10,Y+
      D2 9508      RET
(0079)         } 
(0080) } 
(0081) 
(0082) //==============SEG初始化============= 
(0083) void SEG_INIT(void) 
(0084) { 
(0085) MAX7219_OUT_DDR|=(1<<MAX7219_CLK_PORT)|(1<<MAX7219_DIN_PORT)|(1<<MAX7219_LOAD_PORT); 
_SEG_INIT:
      D3 B387      IN	R24,0x17
      D4 6B80      ORI	R24,0xB0
      D5 BB87      OUT	0x17,R24
(0086) MAX7219_OUT_PORT|=(1<<MAX7219_CLK_PORT)|(1<<MAX7219_DIN_PORT)|(1<<MAX7219_LOAD_PORT); 
      D6 B388      IN	R24,0x18
      D7 6B80      ORI	R24,0xB0
      D8 BB88      OUT	0x18,R24
(0087) SEND(0x0c,0x01); 
      D9 E021      LDI	R18,1
      DA E00C      LDI	R16,0xC
      DB DF71      RCALL	_SEND
(0088) SEND(0x0b,0x07);  
      DC E027      LDI	R18,7
      DD E00B      LDI	R16,0xB
      DE DF6E      RCALL	_SEND
(0089) SEND(0x0a,0x05);  
      DF E025      LDI	R18,5
      E0 E00A      LDI	R16,0xA
      E1 DF6B      RCALL	_SEND
(0090) SEND(0x09,0xff);  
      E2 EF2F      LDI	R18,0xFF
      E3 E009      LDI	R16,0x9
      E4 DF68      RCALL	_SEND
(0091) SEG_CLEAR(3); 
      E5 E003      LDI	R16,3
      E6 DFA9      RCALL	_SEG_CLEAR
      E7 9508      RET
_SEG_L:
  i                    --> R12
  number               --> R10
      E8 940E 0225 CALL	push_xgset003C
      EA 0158      MOVW	R10,R16
(0092) } 
(0093) 
(0094) 
(0095) //=============SEG左四显示数字============== 
(0096) void SEG_L(int number) 
(0097) { 
(0098) int i=4; 
      EB E084      LDI	R24,4
      EC E090      LDI	R25,0
      ED 016C      MOVW	R12,R24
(0099) SEND(0x01,0x0f); //先清除左四位,左四位黑屏 
      EE E02F      LDI	R18,0xF
      EF E001      LDI	R16,1
      F0 DF5C      RCALL	_SEND
(0100) SEND(0x02,0x0f);  
      F1 E02F      LDI	R18,0xF
      F2 E002      LDI	R16,2
      F3 DF59      RCALL	_SEND
(0101) SEND(0x03,0x0f);  
      F4 E02F      LDI	R18,0xF
      F5 E003      LDI	R16,3
      F6 DF56      RCALL	_SEND
(0102) SEND(0x04,0x0f); 
      F7 E02F      LDI	R18,0xF
      F8 E004      LDI	R16,4
      F9 DF53      RCALL	_SEND
(0103) 
(0104) if(number>9999)//要显示的数值超过4位,则显示4个H 
      FA E08F      LDI	R24,0xF
      FB E297      LDI	R25,0x27
      FC 158A      CP	R24,R10
      FD 059B      CPC	R25,R11
      FE F46C      BGE	0x010C
(0105)         { 
(0106)         SEND(0x01,0x0c);  
      FF E02C      LDI	R18,0xC
     100 E001      LDI	R16,1
     101 DF4B      RCALL	_SEND
(0107)         SEND(0x02,0x0c);  
     102 E02C      LDI	R18,0xC
     103 E002      LDI	R16,2
     104 DF48      RCALL	_SEND
(0108)         SEND(0x03,0x0c);  
     105 E02C      LDI	R18,0xC
     106 E003      LDI	R16,3
     107 DF45      RCALL	_SEND
(0109)         SEND(0x04,0x0c); 
     108 E02C      LDI	R18,0xC
     109 E004      LDI	R16,4
     10A DF42      RCALL	_SEND
(0110)         } 
     10B C01E      RJMP	0x012A
(0111) else//小于四位可以显示 
(0112)         { 
(0113)         do 
(0114)                 { 
(0115)                 SEND(i,number%10); 
     10C E02A      LDI	R18,0xA
     10D E030      LDI	R19,0
     10E 0185      MOVW	R16,R10
     10F 940E 01C9 CALL	mod16s
     111 2F20      MOV	R18,R16
     112 2D0C      MOV	R16,R12
     113 DF39      RCALL	_SEND
(0116)                 number=(number-number%10)/10; 
     114 E02A      LDI	R18,0xA
     115 E030      LDI	R19,0
     116 0185      MOVW	R16,R10
     117 940E 01C9 CALL	mod16s
     119 0118      MOVW	R2,R16
     11A 0185      MOVW	R16,R10
     11B 1902      SUB	R16,R2
     11C 0913      SBC	R17,R3
     11D E02A      LDI	R18,0xA
     11E E030      LDI	R19,0
     11F 940E 01CD CALL	div16s
     121 0158      MOVW	R10,R16
(0117)                 i--; 
     122 01C6      MOVW	R24,R12

⌨️ 快捷键说明

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