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

📄 timer0.lst

📁 AVR 单片机 时钟显示 通过7279 用数码管
💻 LST
字号:
__start:
__text_start:
      2C E5CF      LDI	R28,0x5F
      2D E0D4      LDI	R29,4
      2E BFCD      OUT	0x3D,R28
      2F BFDE      OUT	0x3E,R29
      30 51C0      SUBI	R28,0x10
      31 40D0      SBCI	R29,0
      32 EA0A      LDI	R16,0xAA
      33 8308      STD	Y+0,R16
      34 2400      CLR	R0
      35 E6E4      LDI	R30,0x64
      36 E0F0      LDI	R31,0
      37 E010      LDI	R17,0
      38 36E4      CPI	R30,0x64
      39 07F1      CPC	R31,R17
      3A F011      BEQ	0x003D
      3B 9201      ST	R0,Z+
      3C CFFB      RJMP	0x0038
      3D 8300      STD	Z+0,R16
      3E E5E4      LDI	R30,0x54
      3F E0F0      LDI	R31,0
      40 E6A0      LDI	R26,0x60
      41 E0B0      LDI	R27,0
      42 E010      LDI	R17,0
      43 E000      LDI	R16,0
      44 BF0B      OUT	0x3B,R16
      45 35E8      CPI	R30,0x58
      46 07F1      CPC	R31,R17
      47 F021      BEQ	0x004C
      48 95C8      LPM
      49 9631      ADIW	R30,1
      4A 920D      ST	R0,X+
      4B CFF9      RJMP	0x0045
      4C 940E 0109 CALL	_main
_exit:
      4E CFFF      RJMP	_exit
_send_byte:
  i                    --> R20
  out_byte             --> R10
      4F 92AA      ST	R10,-Y
      50 934A      ST	R20,-Y
      51 2EA0      MOV	R10,R16
FILE: F:\WORKS\AVRSIM~1\TIMER0~1\timer0.c
(0001) //ICC-AVR application builder : 2007-12-14 下午 03:35:52
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include<slavr.h>
(0008) unsigned char hour=0;
(0009) unsigned char minute=0;
(0010) unsigned char second=0;
(0011) unsigned char counter=0;
(0012) //*******************发送字节*******************
(0013) void send_byte( unsigned char out_byte)
(0014) {
(0015) 	unsigned char i;
(0016) 	for (i=0;i<8;i++)
      52 2744      CLR	R20
      53 C011      RJMP	0x0065
(0017) 	{
(0018) 		if (out_byte&0x80)
      54 FEA7      SBRS	R10,7
      55 C002      RJMP	0x0058
(0019) 		{
(0020) 			PORTB|=BIT(PB1); //置1data
      56 9AC1      SBI	0x18,1
(0021) 		}
      57 C001      RJMP	0x0059
(0022) 		else
(0023) 		{					 		   			 
(0024) 			PORTB&=~BIT(PB1);//清零
      58 98C1      CBI	0x18,1
(0025) 		}
(0026) 		PORTB|=BIT(PB2);//置1
      59 9AC2      SBI	0x18,2
(0027) 		out_byte<<=1;
      5A 0CAA      LSL	R10
(0028) 		delay_us(30);//20//32//30
      5B E10E      LDI	R16,0x1E
      5C E010      LDI	R17,0
      5D 940E 010D CALL	_delay_us
(0029) 		PORTB&=~BIT(PB2); //清零
      5F 98C2      CBI	0x18,2
(0030) 		delay_us(30);//32//30
      60 E10E      LDI	R16,0x1E
      61 E010      LDI	R17,0
      62 940E 010D CALL	_delay_us
      64 9543      INC	R20
      65 3048      CPI	R20,0x8
      66 F368      BCS	0x0054
(0031) 	}
(0032) 	PORTB&=~BIT(PB1);//清零
      67 98C1      CBI	0x18,1
      68 9149      LD	R20,Y+
      69 90A9      LD	R10,Y+
      6A 9508      RET
_write7279:
  dta                  --> R10
  cmd                  --> R12
      6B 92AA      ST	R10,-Y
      6C 92CA      ST	R12,-Y
      6D 2EA2      MOV	R10,R18
      6E 2EC0      MOV	R12,R16
(0033) 	//delay_us(50); 
(0034) 	//PORTB|=BIT(PB3);//清零cs1	
(0035) 
(0036) }
(0037) //*******************写入7279*******************
(0038) 
(0039) 
(0040) //**********************************************
(0041) void write7279(unsigned char cmd, char dta ) //写入7279
(0042) {
(0043) 	CLI();
      6F 94F8      BCLR	7
(0044) 	delay_us(62);//50//55//62
      70 E30E      LDI	R16,0x3E
      71 E010      LDI	R17,0
      72 940E 010D CALL	_delay_us
(0045) 	send_byte (cmd);
      74 2D0C      MOV	R16,R12
      75 DFD9      RCALL	_send_byte
(0046) 	delay_us(33);//20//28//33
      76 E201      LDI	R16,0x21
      77 E010      LDI	R17,0
      78 940E 010D CALL	_delay_us
(0047) 	send_byte (dta);
      7A 2D0A      MOV	R16,R10
      7B DFD3      RCALL	_send_byte
(0048) 	SEI();
      7C 9478      BSET	7
      7D 90C9      LD	R12,Y+
      7E 90A9      LD	R10,Y+
      7F 9508      RET
(0049) } 
(0050) void display(void)
(0051) {
(0052) write7279(0x83,second%10);//
_display:
      80 E01A      LDI	R17,0xA
      81 9100 0062 LDS	R16,second
      83 940E 0115 CALL	mod8u
      85 2F20      MOV	R18,R16
      86 E803      LDI	R16,0x83
      87 DFE3      RCALL	_write7279
(0053) write7279(0x82,second/10);
      88 E01A      LDI	R17,0xA
      89 9100 0062 LDS	R16,second
      8B 940E 0117 CALL	div8u
      8D 2F20      MOV	R18,R16
      8E E802      LDI	R16,0x82
      8F DFDB      RCALL	_write7279
(0054) write7279(0x81,minute%10);
      90 E01A      LDI	R17,0xA
      91 9100 0061 LDS	R16,minute
      93 940E 0115 CALL	mod8u
      95 2F20      MOV	R18,R16
      96 E801      LDI	R16,0x81
      97 DFD3      RCALL	_write7279
(0055) write7279(0x80,minute/10);
      98 E01A      LDI	R17,0xA
      99 9100 0061 LDS	R16,minute
      9B 940E 0117 CALL	div8u
      9D 2F20      MOV	R18,R16
      9E E800      LDI	R16,0x80
      9F DFCB      RCALL	_write7279
(0056) write7279(0x85,hour%10);
      A0 E01A      LDI	R17,0xA
      A1 9100 0060 LDS	R16,hour
      A3 940E 0115 CALL	mod8u
      A5 2F20      MOV	R18,R16
      A6 E805      LDI	R16,0x85
      A7 DFC3      RCALL	_write7279
(0057) write7279(0x84,hour/10);
      A8 E01A      LDI	R17,0xA
      A9 9100 0060 LDS	R16,hour
      AB 940E 0117 CALL	div8u
      AD 2F20      MOV	R18,R16
      AE E804      LDI	R16,0x84
      AF DFBB      RCALL	_write7279
      B0 9508      RET
(0058) }
(0059) void port_init(void)
(0060) {
(0061)  PORTA = 0x00;
_port_init:
      B1 2422      CLR	R2
      B2 BA2B      OUT	0x1B,R2
(0062)  DDRA  = 0x00;
      B3 BA2A      OUT	0x1A,R2
(0063)  PORTB = 0x06;
      B4 E086      LDI	R24,6
      B5 BB88      OUT	0x18,R24
(0064)  DDRB  = 0x0E;
      B6 E08E      LDI	R24,0xE
      B7 BB87      OUT	0x17,R24
(0065)  PORTC = 0x00; //m103 output only
      B8 BA25      OUT	0x15,R2
(0066)  DDRC  = 0x00;
      B9 BA24      OUT	0x14,R2
(0067)  PORTD = 0x00;
      BA BA22      OUT	0x12,R2
(0068)  DDRD  = 0x00;
      BB BA21      OUT	0x11,R2
      BC 9508      RET
(0069) }
(0070) 
(0071) //TIMER0 initialize - prescale:1024
(0072) // WGM: Normal
(0073) // desired value: 10mSec
(0074) // actual value:  9.984mSec (0.2%)
(0075) void timer0_init(void)
(0076) {
(0077)  TCCR0 = 0x00; //stop
_timer0_init:
      BD 2422      CLR	R2
      BE BE23      OUT	0x33,R2
(0078)  TCNT0 = 0xB2; //set count
      BF EB82      LDI	R24,0xB2
      C0 BF82      OUT	0x32,R24
(0079)  OCR0  = 0x4E;  //set compare
      C1 E48E      LDI	R24,0x4E
      C2 BF8C      OUT	0x3C,R24
(0080)  TCCR0 = 0x05; //start timer
      C3 E085      LDI	R24,5
      C4 BF83      OUT	0x33,R24
      C5 9508      RET
_timer0_ovf_isr:
      C6 922A      ST	R2,-Y
      C7 938A      ST	R24,-Y
      C8 939A      ST	R25,-Y
      C9 B62F      IN	R2,0x3F
      CA 922A      ST	R2,-Y
(0081) }
(0082) 
(0083) #pragma interrupt_handler timer0_ovf_isr:10
(0084) void timer0_ovf_isr(void)
(0085) {
(0086)  TCNT0 = 0xB2; //reload counter value
      CB EB82      LDI	R24,0xB2
      CC BF82      OUT	0x32,R24
(0087)  if (counter<10) counter++;
      CD 9180 0063 LDS	R24,counter
      CF 308A      CPI	R24,0xA
      D0 F420      BCC	0x00D5
      D1 5F8F      SUBI	R24,0xFF
      D2 9380 0063 STS	counter,R24
      D4 C024      RJMP	0x00F9
(0088)  else {counter=0 ;    
      D5 2422      CLR	R2
      D6 9220 0063 STS	counter,R2
(0089)        if (second<60) second++;
      D8 9180 0062 LDS	R24,second
      DA 338C      CPI	R24,0x3C
      DB F420      BCC	0x00E0
      DC 5F8F      SUBI	R24,0xFF
      DD 9380 0062 STS	second,R24
      DF C019      RJMP	0x00F9
(0090)        else {second=0 ;
      E0 2422      CLR	R2
      E1 9220 0062 STS	second,R2
(0091) 	         if (minute<60) minute++;
      E3 9180 0061 LDS	R24,minute
      E5 338C      CPI	R24,0x3C
      E6 F420      BCC	0x00EB
      E7 5F8F      SUBI	R24,0xFF
      E8 9380 0061 STS	minute,R24
      EA C00E      RJMP	0x00F9
(0092) 			 else {minute=0;
      EB 2422      CLR	R2
      EC 9220 0061 STS	minute,R2
(0093) 			       if (hour<24) hour++;
      EE 9180 0060 LDS	R24,hour
      F0 3188      CPI	R24,0x18
      F1 F420      BCC	0x00F6
      F2 5F8F      SUBI	R24,0xFF
      F3 9380 0060 STS	hour,R24
      F5 C003      RJMP	0x00F9
(0094) 				   else hour=0;
      F6 2422      CLR	R2
      F7 9220 0060 STS	hour,R2
(0095) 				   }
(0096) 		    }
(0097) 		}
      F9 9029      LD	R2,Y+
      FA BE2F      OUT	0x3F,R2
      FB 9199      LD	R25,Y+
      FC 9189      LD	R24,Y+
      FD 9029      LD	R2,Y+
      FE 9518      RETI
(0098) }
(0099) 
(0100) //call this routine to initialize all peripherals
(0101) void init_devices(void)
(0102) {
(0103)  //stop errant interrupts until set up
(0104)  CLI(); //disable all interrupts
_init_devices:
      FF 94F8      BCLR	7
(0105)  port_init();
     100 DFB0      RCALL	_port_init
(0106)  timer0_init();
     101 DFBB      RCALL	_timer0_init
(0107) 
(0108)  MCUCR = 0x00;
     102 2422      CLR	R2
     103 BE25      OUT	0x35,R2
(0109)  GICR  = 0x00;
     104 BE2B      OUT	0x3B,R2
(0110)  TIMSK = 0x01; //timer interrupt sources
     105 E081      LDI	R24,1
     106 BF89      OUT	0x39,R24
(0111)  SEI(); //re-enable interrupts
     107 9478      BSET	7
     108 9508      RET
(0112)  //all peripherals are now initialized
(0113) }
(0114) void main(void)
(0115) {
(0116) init_devices();
_main:
     109 DFF5      RCALL	_init_devices
(0117) for(;;)
(0118) display();
FILE: <library>
     10A DF75      RCALL	_display
     10B CFFE      RJMP	0x010A
     10C 9508      RET
_delay_us:
     10D 5001      SUBI	R16,1
     10E 4010      SBCI	R17,0
     10F E081      LDI	R24,1
     110 E090      LDI	R25,0
     111 1780      CP	R24,R16
     112 0791      CPC	R25,R17
     113 F3CC      BLT	0x010D
     114 9508      RET
mod8u:
     115 9468      BSET	6
     116 C001      RJMP	xdiv8u
div8u:
     117 94E8      BCLR	6
xdiv8u:
     118 932A      ST	R18,-Y
     119 92FA      ST	R15,-Y
     11A 92EA      ST	R14,-Y
     11B 24FF      CLR	R15
     11C 24EE      CLR	R14
     11D E120      LDI	R18,0x10
     11E 0F00      LSL	R16
     11F 1CFF      ROL	R15
     120 1CEE      ROL	R14
     121 16E1      CP	R14,R17
     122 F010      BCS	0x0125
     123 1AE1      SUB	R14,R17
     124 9503      INC	R16
     125 952A      DEC	R18
     126 F7B9      BNE	0x011E
     127 F40E      BRTC	0x0129
     128 2D0E      MOV	R16,R14
     129 90E9      LD	R14,Y+
     12A 90F9      LD	R15,Y+
     12B 9129      LD	R18,Y+
     12C 9508      RET

⌨️ 快捷键说明

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