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

📄 salve.lst

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

⌨️ 快捷键说明

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