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

📄 hc595.lst

📁 ATMEGA128的SEG7驱动程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
__start:
__text_start:
    0066 EFCF      LDI	R28,0xFF
    0067 E1D0      LDI	R29,0x10
    0068 BFCD      OUT	0x3D,R28
    0069 BFDE      OUT	0x3E,R29
    006A 51C0      SUBI	R28,0x10
    006B 40D0      SBCI	R29,0
    006C EA0A      LDI	R16,0xAA
    006D 8308      STD	Y+0,R16
    006E 2400      CLR	R0
    006F E0E4      LDI	R30,4
    0070 E0F1      LDI	R31,1
    0071 E011      LDI	R17,1
    0072 30E8      CPI	R30,0x8
    0073 07F1      CPC	R31,R17
    0074 F011      BEQ	0x0077
    0075 9201      ST	R0,Z+
    0076 CFFB      RJMP	0x0072
    0077 8300      STD	Z+0,R16
    0078 ECE7      LDI	R30,0xC7
    0079 E0F0      LDI	R31,0
    007A E0A0      LDI	R26,0
    007B E0B1      LDI	R27,1
    007C E010      LDI	R17,0
    007D 3CEB      CPI	R30,0xCB
    007E 07F1      CPC	R31,R17
    007F F021      BEQ	0x0084
    0080 95C8      LPM
    0081 9631      ADIW	R30,1
    0082 920D      ST	R0,X+
    0083 CFF9      RJMP	0x007D
    0084 940E00D2  CALL	_main
_exit:
    0086 CFFF      RJMP	_exit
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\Seg7\source\main.c
(0001) /************************************************
(0002) 文件:main.c
(0003) 用途:
(0004) 注意:内部8M晶振
(0005) 创建:2008.4.1
(0006) 修改:2008.4.1
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) 
(0010) #include "config.h"
(0011) volatile unsigned int countnum=0; 
(0012) 
(0013) void timer1_init(void)
(0014) {
(0015)  TCCR1B = 0x00; //stop
_timer1_init:
    0087 2422      CLR	R2
    0088 BC2E      OUT	0x2E,R2
(0016)  TCNT1H = 0x8F; //setup
    0089 E88F      LDI	R24,0x8F
    008A BD8D      OUT	0x2D,R24
(0017)  TCNT1L = 0x81;
    008B E881      LDI	R24,0x81
    008C BD8C      OUT	0x2C,R24
(0018)  OCR1AH = 0x70;
    008D E780      LDI	R24,0x70
    008E BD8B      OUT	0x2B,R24
(0019)  OCR1AL = 0x7F;
    008F E78F      LDI	R24,0x7F
    0090 BD8A      OUT	0x2A,R24
(0020)  OCR1BH = 0x70;
    0091 E780      LDI	R24,0x70
    0092 BD89      OUT	0x29,R24
(0021)  OCR1BL = 0x7F;
    0093 E78F      LDI	R24,0x7F
    0094 BD88      OUT	0x28,R24
(0022)  OCR1CH = 0x70;
    0095 E780      LDI	R24,0x70
    0096 93800079  STS	0x79,R24
(0023)  OCR1CL = 0x7F;
    0098 E78F      LDI	R24,0x7F
    0099 93800078  STS	0x78,R24
(0024)  ICR1H  = 0x70;
    009B E780      LDI	R24,0x70
    009C BD87      OUT	0x27,R24
(0025)  ICR1L  = 0x7F;
    009D E78F      LDI	R24,0x7F
    009E BD86      OUT	0x26,R24
(0026)  TCCR1A = 0x00;
    009F BC2F      OUT	0x2F,R2
(0027)  TCCR1B = 0x04; //start Timer
    00A0 E084      LDI	R24,4
    00A1 BD8E      OUT	0x2E,R24
    00A2 9508      RET
_timer1_ovf_isr:
    00A3 922A      ST	R2,-Y
    00A4 923A      ST	R3,-Y
    00A5 938A      ST	R24,-Y
    00A6 939A      ST	R25,-Y
    00A7 B62F      IN	R2,0x3F
    00A8 922A      ST	R2,-Y
(0028) }
(0029) 
(0030) #pragma interrupt_handler timer1_ovf_isr:15
(0031) void timer1_ovf_isr(void)
(0032) {
(0033)  TCNT1H = 0x8F; //reload counter high value
    00A9 E88F      LDI	R24,0x8F
    00AA BD8D      OUT	0x2D,R24
(0034)  TCNT1L = 0x81; //reload counter low value
    00AB E881      LDI	R24,0x81
    00AC BD8C      OUT	0x2C,R24
(0035)  countnum++;
    00AD 91800100  LDS	R24,countnum
    00AF 91900101  LDS	R25,countnum+1
    00B1 9601      ADIW	R24,1
    00B2 93900101  STS	countnum+1,R25
    00B4 93800100  STS	countnum,R24
(0036)  if(countnum>9999) countnum=0;
    00B6 E08F      LDI	R24,0xF
    00B7 E297      LDI	R25,0x27
    00B8 90200100  LDS	R2,countnum
    00BA 90300101  LDS	R3,countnum+1
    00BC 1582      CP	R24,R2
    00BD 0593      CPC	R25,R3
    00BE F430      BCC	0x00C5
    00BF 2422      CLR	R2
    00C0 2433      CLR	R3
    00C1 92300101  STS	countnum+1,R3
    00C3 92200100  STS	countnum,R2
    00C5 9029      LD	R2,Y+
    00C6 BE2F      OUT	0x3F,R2
    00C7 9199      LD	R25,Y+
    00C8 9189      LD	R24,Y+
    00C9 9039      LD	R3,Y+
    00CA 9029      LD	R2,Y+
    00CB 9518      RETI
(0037) }
(0038) 
(0039) void init_devices(void)
(0040) {
(0041)  CLI(); //disable all interrupts
_init_devices:
    00CC 94F8      BCLR	7
(0042)  timer1_init();
    00CD DFB9      RCALL	_timer1_init
(0043)  TIMSK = 0x04; //timer interrupt sources
    00CE E084      LDI	R24,4
    00CF BF87      OUT	0x37,R24
(0044)  SEI(); //re-enable interrupts
    00D0 9478      BSET	7
    00D1 9508      RET
(0045) }
(0046) 
(0047) void main(void)
(0048) {
(0049)  init_devices(); 
_main:
    00D2 DFF9      RCALL	_init_devices
(0050)  HC_595_init();
    00D3 940E0112  CALL	_HC_595_init
    00D5 C006      RJMP	0x00DC
(0051)  while(1)
(0052)  	{
(0053) 		 Seg7_Led_display(countnum);
    00D6 91000100  LDS	R16,countnum
    00D8 91100101  LDS	R17,countnum+1
    00DA 940E01AA  CALL	_Seg7_Led_display
    00DC CFF9      RJMP	0x00D6
    00DD 9508      RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\Seg7\source\lib\delay.c
(0001) /************************************************
(0002) 文件:delay.c
(0003) 用途:延时函数
(0004) 注意:系统时钟8M
(0005) 创建:2008.1.25
(0006) 修改:2008.1.25
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) 
(0010) void delay_1us(void)                 //1us延时函数
(0011)   {
(0012)    asm("nop");
_delay_1us:
    00DE 0000      NOP
    00DF 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    00E0 940E0434  CALL	push_gset2
    00E2 01B8      MOVW	R22,R16
(0013)   }
(0014) 
(0015) void delay_nus(unsigned int n)       //N us延时函数
(0016)   {
(0017)    unsigned int i=0;
    00E3 2744      CLR	R20
    00E4 2755      CLR	R21
(0018)    for (i=0;i<n;i++)
    00E5 C003      RJMP	0x00E9
(0019)    delay_1us();
    00E6 DFF7      RCALL	_delay_1us
    00E7 5F4F      SUBI	R20,0xFF
    00E8 4F5F      SBCI	R21,0xFF
    00E9 1746      CP	R20,R22
    00EA 0757      CPC	R21,R23
    00EB F3D0      BCS	0x00E6
    00EC 940E042B  CALL	pop_gset2
    00EE 9508      RET
(0020)   }
(0021)   
(0022) void delay_1ms(void)                 //1ms延时函数
(0023)   {
(0024)    unsigned int i;
(0025)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    00EF 2700      CLR	R16
    00F0 2711      CLR	R17
    00F1 C002      RJMP	0x00F4
    00F2 5F0F      SUBI	R16,0xFF
    00F3 4F1F      SBCI	R17,0xFF
    00F4 3704      CPI	R16,0x74
    00F5 E0E4      LDI	R30,4
    00F6 071E      CPC	R17,R30
    00F7 F3D0      BCS	0x00F2
    00F8 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    00F9 940E0434  CALL	push_gset2
    00FB 01B8      MOVW	R22,R16
(0026)   }
(0027)   
(0028) void delay_nms(unsigned int n)       //N ms延时函数
(0029)   {
(0030)    unsigned int i=0;
    00FC 2744      CLR	R20
    00FD 2755      CLR	R21
(0031)    for (i=0;i<n;i++)
    00FE C003      RJMP	0x0102
(0032)    delay_1ms();
    00FF DFEF      RCALL	_delay_1ms
    0100 5F4F      SUBI	R20,0xFF
    0101 4F5F      SBCI	R21,0xFF
    0102 1746      CP	R20,R22
    0103 0757      CPC	R21,R23
    0104 F3D0      BCS	0x00FF
    0105 940E042B  CALL	pop_gset2
    0107 9508      RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\Seg7\source\lib\spi.c
(0001) /************************************************
(0002) 文件:spi.c
(0003) 用途:SPI驱动
(0004) 注意:
(0005) 创建:2008.1.25
(0006) 修改:2008.1.25
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) /*************************************************************************
(0011) ** 函数名称: spi_init(void)
(0012) ** 功能描述: SPI初始化
(0013) ** 输 入: 
(0014) ** 输出	 : 
(0015) ** 全局变量: 无
(0016) ** 调用模块: 
(0017) ** 说明:
(0018) ** 注意:
(0019) **************************************************************************/
(0020) void spi_init(void)
(0021) {
(0022)  	 DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);//设置MOSI,SCK输出
_spi_init:
    0108 B387      IN	R24,0x17
    0109 6087      ORI	R24,7
    010A BB87      OUT	0x17,R24
(0023)  	 SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式
    010B E583      LDI	R24,0x53
    010C B98D      OUT	0x0D,R24
    010D 9508      RET
(0024) }
(0025) /*************************************************************************
(0026) ** 函数名称: SPI_MasterTransmit(char Data)
(0027) ** 功能描述: SPI主机发送数据
(0028) ** 输 入: Data 需要通过SPI传输的数据
(0029) ** 输出	 : 
(0030) ** 全局变量: 无
(0031) ** 调用模块: 
(0032) ** 说明:
(0033) ** 注意:
(0034) **************************************************************************/
(0035) void SPI_MasterTransmit(char Data)
(0036) {
(0037)  	 /* 启动数据传输 */
(0038)  	 SPDR = Data;
_SPI_MasterTransmit:
  Data                 --> R16
    010E B90F      OUT	0x0F,R16
(0039)  	 /* 等待传输结束 */
(0040)  	 while(!(SPSR & (1<<SPIF)))
    010F 9B77      SBIS	0x0E,7
    0110 CFFE      RJMP	0x010F
    0111 9508      RET
FILE: D:\avrvi\AVRVi_m128_Starter_Kit\Seg7\source\lib\hc595.c
(0001) /************************************************
(0002) 文件:hc595.c
(0003) 用途:
(0004) 注意:内部8M晶振
(0005) 创建:2008.4.1
(0006) 修改:2008.4.1
(0007) Copy Right  (c)  www.avrvi.com  AVR与虚拟仪器
(0008) ************************************************/
(0009) #include "..\config.h"
(0010) const unsigned char Seg7_Data[]={0x3F,0x06,0x5B,0x4F,0x66,             //0,1,2,3,4
(0011)                                  0x6D,0x7D,0x07,0x7F,0x6F,             //5,6,7,8,9
(0012) 						         0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};  //a,b,c,d,e,f
(0013) volatile unsigned char Seg7_Led_Buf[4],point=0,point_pos=0;//point是小数点标志1代表有小数点point_pos表示小数点位置
(0014) /*************************************************************************
(0015) ** 函数名称:HC595初始化
(0016) ** 功能描述:
(0017) ** 输 入:
(0018) ** 输出	 :
(0019) ** 全局变量:
(0020) ** 调用模块:
(0021) ** 说明:
(0022) ** 注意:
(0023) **************************************************************************/
(0024) void HC_595_init(void)
(0025) {
(0026)  OE_DDR |= (1<<OE);
_HC_595_init:
    0112 9AA7      SBI	0x14,7
(0027)  OE_PORT &= (1<<OE);
    0113 B385      IN	R24,0x15
    0114 7880      ANDI	R24,0x80
    0115 BB85      OUT	0x15,R24
(0028)  PORTB = 0x0F;
    0116 E08F      LDI	R24,0xF
    0117 BB88      OUT	0x18,R24
(0029)  spi_init();
    0118 940E0108  CALL	_spi_init
(0030)  Seg7_Led_Buf[0]=16;
    011A E180      LDI	R24,0x10
    011B 93800104  STS	Seg7_Led_Buf,R24
(0031)  Seg7_Led_Buf[1]=16;
    011D 93800105  STS	Seg7_Led_Buf+1,R24
(0032)  Seg7_Led_Buf[2]=16;
    011F 93800106  STS	Seg7_Led_Buf+2,R24
(0033)  Seg7_Led_Buf[3]=16;
    0121 93800107  STS	Seg7_Led_Buf+3,R24
    0123 9508      RET
_HC_595_OUT:
  data                 --> R20
    0124 940E0436  CALL	push_gset1
    0126 2F40      MOV	R20,R16
(0034) }
(0035) /*************************************************************************
(0036) ** 函数名称:HC595送数据
(0037) ** 功能描述:
(0038) ** 输 入:
(0039) ** 输出	 :
(0040) ** 全局变量:
(0041) ** 调用模块: 
(0042) ** 说明:
(0043) ** 注意:
(0044) **************************************************************************/
(0045) void HC_595_OUT(unsigned char data)
(0046) {
(0047)  	 SS_L();
    0127 98C0      CBI	0x18,0
(0048) 	 SPI_MasterTransmit(data);
    0128 2F04      MOV	R16,R20
    0129 940E010E  CALL	_SPI_MasterTransmit
(0049)  	 SS_H();
    012B 9AC0      SBI	0x18,0
    012C 940E0439  CALL	pop_gset1
    012E 9508      RET
(0050) }
(0051) /*************************************************************************
(0052) ** 函数名称:HC595刷新显示
(0053) ** 功能描述:
(0054) ** 输 入:
(0055) ** 输出	 :
(0056) ** 全局变量:
(0057) ** 调用模块: 
(0058) ** 说明:
(0059) ** 注意:
(0060) **************************************************************************/
(0061) void Seg7_Led_Update(void)
(0062) {
(0063)  HC_595_OUT(Seg7_Data[Seg7_Led_Buf[0]]); 
_Seg7_Led_Update:
    012F E88C      LDI	R24,0x8C
    0130 E090      LDI	R25,0
    0131 91E00104  LDS	R30,Seg7_Led_Buf
    0133 27FF      CLR	R31
    0134 0FE8      ADD	R30,R24
    0135 1FF9      ADC	R31,R25
    0136 9104      LPM	R16,0(Z)
    0137 DFEC      RCALL	_HC_595_OUT
(0064)  Seg7_Bit0_En(); 
    0138 9ABC      SBI	0x17,4
    0139 9AC4      SBI	0x18,4
(0065)  delay_nus(60); 
    013A E30C      LDI	R16,0x3C
    013B E010      LDI	R17,0
    013C 940E00E0  CALL	_delay_nus
(0066)  Seg7_Bit0_Dis();
    013E 9ABC      SBI	0x17,4
    013F 98C4      CBI	0x18,4
(0067)  
(0068)  HC_595_OUT(Seg7_Data[Seg7_Led_Buf[1]]);
    0140 E88C      LDI	R24,0x8C
    0141 E090      LDI	R25,0
    0142 91E00105  LDS	R30,Seg7_Led_Buf+1
    0144 27FF      CLR	R31
    0145 0FE8      ADD	R30,R24
    0146 1FF9      ADC	R31,R25
    0147 9104      LPM	R16,0(Z)
    0148 DFDB      RCALL	_HC_595_OUT
(0069)  if((point==1)&&(point_pos==1))

⌨️ 快捷键说明

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