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

📄 new_disp.lst

📁 我学习AVR的代码例子
💻 LST
字号:
__text_start:
__start:
    0020 EFCF      LDI	R28,0xFF
    0021 E0D4      LDI	R29,4
    0022 BFCD      OUT	0x3D,R28
    0023 BFDE      OUT	0x3E,R29
    0024 51C0      SUBI	R28,0x10
    0025 40D0      SBCI	R29,0
    0026 EA0A      LDI	R16,0xAA
    0027 8308      STD	Y+0,R16
    0028 2400      CLR	R0
    0029 E0E0      LDI	R30,0
    002A E0F1      LDI	R31,1
    002B E011      LDI	R17,1
    002C 30E0      CPI	R30,0
    002D 07F1      CPC	R31,R17
    002E F011      BEQ	0x0031
    002F 9201      ST	R0,Z+
    0030 CFFB      RJMP	0x002C
    0031 8300      STD	Z+0,R16
    0032 E3EF      LDI	R30,0x3F
    0033 E0F0      LDI	R31,0
    0034 E0A0      LDI	R26,0
    0035 E0B1      LDI	R27,1
    0036 E010      LDI	R17,0
    0037 33EF      CPI	R30,0x3F
    0038 07F1      CPC	R31,R17
    0039 F021      BEQ	0x003E
    003A 95C8      LPM
    003B 9631      ADIW	R30,1
    003C 920D      ST	R0,X+
    003D CFF9      RJMP	0x0037
    003E D0D0      RCALL	_main
_exit:
    003F CFFF      RJMP	_exit
FILE: D:\avr\avr_program\disp_88i\new_disp.c
(0001) #include "iom88v.h"
(0002) 
(0003) #define SS PB2
(0004) #define MOSI PB3
(0005) #define SCK PB5
(0006) 
(0007) #define _asm asm
(0008) #define WDR() 	asm("wdr")
(0009) #define SEI()	asm("sei")
(0010) #define CLI()	asm("cli")
(0011) 
(0012) #define a1 0x04
(0013) #define a2 0x0c
(0014) #define a3 0x14
(0015) #define a4 0x1c
(0016) #define a5 0x24
(0017) #define a6 0x2c
(0018) #define a7 0x34
(0019) #define a8 0x3c
(0020) #define a9 0x44
(0021) 
(0022) const char S[11]={0xaf,0x06,0x6d,0x4f,0xc6,0xcb,0xeb,0x0e,0xef,0xcf,0x00};
(0023) 
(0024) void port_init(void)//口方向设置
(0025)  {  
(0026)    DDRB  = 0xff;
_port_init:
    0040 EF8F      LDI	R24,0xFF
    0041 B984      OUT	0x04,R24
(0027)    DDRC = 0X00;
    0042 2422      CLR	R2
    0043 B827      OUT	0x07,R2
(0028)    PORTC=0xff;
    0044 B988      OUT	0x08,R24
(0029)    DDRD  = 0x00;
    0045 B82A      OUT	0x0A,R2
(0030)    PORTD=0xff;
    0046 B98B      OUT	0x0B,R24
    0047 9508      RET
(0031)  }
(0032) void delay_us(int time)//微秒级延时程序
(0033)  {     
(0034)    do
(0035) 	 {
(0036) 	   time--;
_delay_us:
  time                 --> R16
    0048 5001      SUBI	R16,1
    0049 4010      SBCI	R17,0
(0037) 	 }	
(0038)    while (time>1);
    004A E081      LDI	R24,1
    004B E090      LDI	R25,0
    004C 1780      CP	R24,R16
    004D 0791      CPC	R25,R17
    004E F3CC      BLT	0x0048
    004F 9508      RET
_delay_ms:
  time                 --> R10
    0050 D0DD      RCALL	push_gset3x
    0051 0158      MOVW	R10,R16
(0039)  }	   
(0040) void delay_ms(unsigned int time)//毫秒级延时程序
(0041)  {
    0052 C006      RJMP	0x0059
(0042)    while(time!=0)
(0043) 	 {		
(0044) 	   delay_us(1000);
    0053 EE08      LDI	R16,0xE8
    0054 E013      LDI	R17,3
    0055 DFF2      RCALL	_delay_us
(0045) 	   time--;
    0056 01C5      MOVW	R24,R10
    0057 9701      SBIW	R24,1
    0058 015C      MOVW	R10,R24
    0059 20AA      TST	R10
    005A F7C1      BNE	0x0053
    005B 20BB      TST	R11
    005C F7B1      BNE	0x0053
    005D D0C2      RCALL	pop_gset3x
    005E 9508      RET
_SendBit:
  i                    --> R10
  bitcnt               --> R12
  dat                  --> R14
    005F D0D4      RCALL	push_gset5x
    0060 2EC2      MOV	R12,R18
    0061 2EE0      MOV	R14,R16
(0046) 	 }
(0047)  }/*
(0048) void Delay()
(0049)  {
(0050)    unsigned char i;
(0051)    for(i=0;i<10;i++); /*用于调整CLK 脉冲宽度*/
(0052)  //}
(0053) void SendBit(unsigned char dat,unsigned char bitcnt)
(0054)  {
(0055)    unsigned char i;
(0056)    CLI();
    0062 94F8      BCLR	7
(0057)    for(i=0;i<bitcnt;i++)
    0063 24AA      CLR	R10
    0064 C00F      RJMP	0x0074
(0058)      {
(0059)        if(( dat & 0X80 ) == 0)
    0065 FCE7      SBRC	R14,7
    0066 C002      RJMP	0x0069
(0060)        PORTB &=(~(1<<MOSI));
    0067 982B      CBI	0x05,3
    0068 C001      RJMP	0x006A
(0061)        else
(0062)        PORTB |=(1<<MOSI); /*发送数据由高位到低位传送*/
    0069 9A2B      SBI	0x05,3
(0063)        //Delay();
(0064) 	   delay_us(10);
    006A E00A      LDI	R16,0xA
    006B E010      LDI	R17,0
    006C DFDB      RCALL	_delay_us
(0065)        PORTB |=(1<<SCK); /*置时钟线为高通知被控器开始接收数位*/
    006D 9A2D      SBI	0x05,5
(0066)        //Delay();
(0067) 	   delay_us(10);
    006E E00A      LDI	R16,0xA
    006F E010      LDI	R17,0
    0070 DFD7      RCALL	_delay_us
(0068)        PORTB &=(~(1<<SCK)); /*钳住总线准备下一个数据位*/
    0071 982D      CBI	0x05,5
(0069)        dat=dat<<1; /*发送数据左移一位*/
    0072 0CEE      LSL	R14
    0073 94A3      INC	R10
    0074 14AC      CP	R10,R12
    0075 F378      BCS	0x0065
(0070)      }
(0071)    SEI();
    0076 9478      BSET	7
    0077 D0B4      RCALL	pop_gset5x
    0078 9508      RET
(0072)  }
(0073) 
(0074) void Start_spi()
(0075)  {
(0076)    PORTB |=(1<<SS);
_Start_spi:
    0079 9A2A      SBI	0x05,2
(0077)    PORTB |=(1<<SCK);
    007A 9A2D      SBI	0x05,5
(0078)    PORTB |=(1<<MOSI);
    007B 9A2B      SBI	0x05,3
(0079)    //Delay();
(0080)    delay_us(10);
    007C E00A      LDI	R16,0xA
    007D E010      LDI	R17,0
    007E DFC9      RCALL	_delay_us
(0081)    PORTB &=(~(1<<SS));PORTB &=(~(1<<SS));
    007F 982A      CBI	0x05,2
    0080 982A      CBI	0x05,2
(0082)    PORTB &=(~(1<<SCK));PORTB &=(~(1<<SCK));
    0081 982D      CBI	0x05,5
    0082 982D      CBI	0x05,5
    0083 9508      RET
_SendByte:
  dat                  --> R10
    0084 D0A9      RCALL	push_gset3x
    0085 2EA0      MOV	R10,R16
(0083)  }
(0084) 
(0085) void SendByte(unsigned char dat)
(0086)  {
(0087)    SendBit(dat,8); /*发送字节*/
    0086 E028      LDI	R18,0x8
    0087 2D0A      MOV	R16,R10
    0088 DFD6      RCALL	_SendBit
    0089 D096      RCALL	pop_gset3x
    008A 9508      RET
_SENDCOMA:
  com                  --> R10
    008B D0A2      RCALL	push_gset3x
    008C 2EA0      MOV	R10,R16
(0088)  }
(0089) 
(0090) void SENDCOMA(unsigned char com)
(0091)  {
(0092)    Start_spi();
    008D DFEB      RCALL	_Start_spi
(0093)    SendBit(0X80,4); //*发送设置命令ID=100 0*
    008E E024      LDI	R18,4
    008F E800      LDI	R16,0x80
    0090 DFCE      RCALL	_SendBit
(0094)    SendByte(com); //*发送命令字*
    0091 2D0A      MOV	R16,R10
    0092 DFF1      RCALL	_SendByte
    0093 D08C      RCALL	pop_gset3x
    0094 9508      RET
_SENDCOMB:
  adr                  --> R10
    0095 D098      RCALL	push_gset3x
    0096 2EA0      MOV	R10,R16
(0095)  }
(0096) 
(0097) void SENDCOMB(unsigned char adr)
(0098)  {
(0099)    Start_spi();
    0097 DFE1      RCALL	_Start_spi
(0100)    SendBit(0XA0,3); /*发送写显示RAM 命令ID=101 */
    0098 E023      LDI	R18,3
    0099 EA00      LDI	R16,0xA0
    009A DFC4      RCALL	_SendBit
(0101)    SendBit(adr,6); /*指定写入地址*/
    009B E026      LDI	R18,6
    009C 2D0A      MOV	R16,R10
    009D DFC1      RCALL	_SendBit
    009E D081      RCALL	pop_gset3x
    009F 9508      RET
_disp_init:
  i                    --> R10
    00A0 D08D      RCALL	push_gset3x
(0102)  } 
(0103) void disp_init(void)
(0104)  {
(0105)    unsigned char i;
(0106)    SENDCOMA(0X0a); /*禁止WDT溢出标志输出*/
    00A1 E00A      LDI	R16,0xA
    00A2 DFE8      RCALL	_SENDCOMA
(0107)    SENDCOMA(0X52); //设置偏压,背极数 定义1/3 偏压4背极
    00A3 E502      LDI	R16,0x52
    00A4 DFE6      RCALL	_SENDCOMA
(0108)    SENDCOMA(0X30); //*使用内部256KRC 振荡器*
    00A5 E300      LDI	R16,0x30
    00A6 DFE4      RCALL	_SENDCOMA
(0109)    SENDCOMA(0X02); //*启动振荡器*    
    00A7 E002      LDI	R16,2
    00A8 DFE2      RCALL	_SENDCOMA
(0110)    SENDCOMA(0X06); //LCDON
    00A9 E006      LDI	R16,6
    00AA DFE0      RCALL	_SENDCOMA
(0111)    SENDCOMA(0X08);//timer dis
    00AB E008      LDI	R16,0x8
    00AC DFDE      RCALL	_SENDCOMA
(0112)    SENDCOMB(0x00); //*把数据指针指回0 接着写入数据*   
    00AD 2700      CLR	R16
    00AE DFE6      RCALL	_SENDCOMB
(0113)    for(i=0;i<15;i++) /*写入16 字节数据*/
    00AF 24AA      CLR	R10
    00B0 C003      RJMP	0x00B4
(0114)      {
(0115)        SendByte(0x0); /*写入数据*/
    00B1 2700      CLR	R16
    00B2 DFD1      RCALL	_SendByte
    00B3 94A3      INC	R10
    00B4 2D8A      MOV	R24,R10
    00B5 308F      CPI	R24,0xF
    00B6 F3D0      BCS	0x00B1
    00B7 D068      RCALL	pop_gset3x
    00B8 9508      RET
(0116)      }
(0117)  }
(0118) void disp_off(void)
(0119)   {
(0120)     SENDCOMA(0X04);//lcdoff
_disp_off:
    00B9 E004      LDI	R16,4
    00BA DFD0      RCALL	_SENDCOMA
(0121)     SENDCOMA(0X00);//sys dis
    00BB 2700      CLR	R16
    00BC DFCE      RCALL	_SENDCOMA
    00BD 9508      RET
_disp:
  dat                  --> R10
  add                  --> R12
    00BE D075      RCALL	push_gset5x
    00BF 2EA2      MOV	R10,R18
    00C0 2EC0      MOV	R12,R16
(0122)     //SENDCOMA(0X0c);//timer en
(0123)   }
(0124) void disp(char add,char dat)
(0125)  {
(0126)    switch(add)
    00C1 2CEC      MOV	R14,R12
    00C2 24FF      CLR	R15
    00C3 01C7      MOVW	R24,R14
    00C4 3081      CPI	R24,1
    00C5 E0E0      LDI	R30,0
    00C6 079E      CPC	R25,R30
    00C7 F109      BEQ	0x00E9
    00C8 3082      CPI	R24,2
    00C9 E0E0      LDI	R30,0
    00CA 079E      CPC	R25,R30
    00CB F101      BEQ	0x00EC
    00CC 3083      CPI	R24,3
    00CD E0E0      LDI	R30,0
    00CE 079E      CPC	R25,R30
    00CF F0F9      BEQ	0x00EF
    00D0 3084      CPI	R24,4
    00D1 E0E0      LDI	R30,0
    00D2 079E      CPC	R25,R30
    00D3 F0F1      BEQ	0x00F2
    00D4 3085      CPI	R24,5
    00D5 E0E0      LDI	R30,0
    00D6 079E      CPC	R25,R30
    00D7 F0E9      BEQ	0x00F5
    00D8 3086      CPI	R24,6
    00D9 E0E0      LDI	R30,0
    00DA 079E      CPC	R25,R30
    00DB F0E1      BEQ	0x00F8
    00DC 3087      CPI	R24,7
    00DD E0E0      LDI	R30,0
    00DE 079E      CPC	R25,R30
    00DF F0D9      BEQ	0x00FB
    00E0 3088      CPI	R24,0x8
    00E1 E0E0      LDI	R30,0
    00E2 079E      CPC	R25,R30
    00E3 F0D1      BEQ	0x00FE
    00E4 3089      CPI	R24,0x9
    00E5 E0E0      LDI	R30,0
    00E6 079E      CPC	R25,R30
    00E7 F0C9      BEQ	0x0101
    00E8 C01A      RJMP	0x0103
(0127)      {
(0128) 	   case 1: add=a1;break;
    00E9 E084      LDI	R24,4
    00EA 2EC8      MOV	R12,R24
    00EB C017      RJMP	0x0103
(0129) 	   case 2: add=a2;break;
    00EC E08C      LDI	R24,0xC
    00ED 2EC8      MOV	R12,R24
    00EE C014      RJMP	0x0103
(0130) 	   case 3: add=a3;break;
    00EF E184      LDI	R24,0x14
    00F0 2EC8      MOV	R12,R24
    00F1 C011      RJMP	0x0103
(0131) 	   case 4: add=a4;break;
    00F2 E18C      LDI	R24,0x1C
    00F3 2EC8      MOV	R12,R24
    00F4 C00E      RJMP	0x0103
(0132) 	   case 5: add=a5;break;
    00F5 E284      LDI	R24,0x24
    00F6 2EC8      MOV	R12,R24
    00F7 C00B      RJMP	0x0103
(0133) 	   case 6: add=a6;break;
    00F8 E28C      LDI	R24,0x2C
    00F9 2EC8      MOV	R12,R24
    00FA C008      RJMP	0x0103
(0134) 	   case 7: add=a7;break;
    00FB E384      LDI	R24,0x34
    00FC 2EC8      MOV	R12,R24
    00FD C005      RJMP	0x0103
(0135) 	   case 8: add=a8;break;
    00FE E38C      LDI	R24,0x3C
    00FF 2EC8      MOV	R12,R24
    0100 C002      RJMP	0x0103
(0136) 	   case 9: add=a9;break;
    0101 E484      LDI	R24,0x44
    0102 2EC8      MOV	R12,R24
(0137) 	 }
(0138)    SENDCOMB(add);             //write address
    0103 2D0C      MOV	R16,R12
    0104 DF90      RCALL	_SENDCOMB
(0139)    SendByte(S[dat]);            //write data
    0105 E384      LDI	R24,0x34
    0106 E090      LDI	R25,0
    0107 2DEA      MOV	R30,R10
    0108 27FF      CLR	R31
    0109 0FE8      ADD	R30,R24
    010A 1FF9      ADC	R31,R25
    010B 9104      LPM	R16,0(Z)
    010C DF77      RCALL	_SendByte
    010D D01E      RCALL	pop_gset5x
    010E 9508      RET
(0140)    //SendByte(S[dat]);            //write data
(0141)  }
(0142) void main(void)
(0143)   {
(0144)     char i,j;
(0145)     port_init();
_main:
  j                    --> R10
  i                    --> R12
    010F DF30      RCALL	_port_init
(0146) 	disp_init();
    0110 DF8F      RCALL	_disp_init
(0147) 	for(i=1,j=1;i<10;i++,j++) disp(i,j);
    0111 24CC      CLR	R12
    0112 94C3      INC	R12
    0113 24AA      CLR	R10
    0114 94A3      INC	R10
    0115 C005      RJMP	0x011B
    0116 2D2A      MOV	R18,R10
    0117 2D0C      MOV	R16,R12
    0118 DFA5      RCALL	_disp
    0119 94C3      INC	R12
    011A 94A3      INC	R10
    011B 2D8C      MOV	R24,R12
    011C 308A      CPI	R24,0xA
    011D F3C0      BCS	0x0116
(0148) 	//disp(2,3);
(0149) 	while(1);
FILE: <library>
    011E CFFF      RJMP	0x011E
    011F 9508      RET
pop_gset3x:
    0120 E0E4      LDI	R30,4
popx:
    0121 90A9      LD	R10,Y+
    0122 90B9      LD	R11,Y+
    0123 FDE2      SBRC	R30,2
    0124 9508      RET
    0125 90C9      LD	R12,Y+
    0126 90D9      LD	R13,Y+
    0127 FDE3      SBRC	R30,3
    0128 9508      RET
    0129 90E9      LD	R14,Y+
    012A 90F9      LD	R15,Y+
    012B 9508      RET
pop_gset5x:
    012C 27EE      CLR	R30
    012D CFF3      RJMP	popx
push_gset3x:
    012E 92BA      ST	R11,-Y
    012F 92AA      ST	R10,-Y
    0130 9508      RET
push_gset4x:
    0131 92DA      ST	R13,-Y
    0132 92CA      ST	R12,-Y
    0133 CFFA      RJMP	push_gset3x
push_gset5x:
    0134 92FA      ST	R15,-Y
    0135 92EA      ST	R14,-Y
    0136 CFFA      RJMP	push_gset4x

⌨️ 快捷键说明

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