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

📄 timer1leddisplay.lst

📁 51单片机时钟程序
💻 LST
字号:
__text_start:
__start:
      34 E5CF      LDI	R28,0x5F
      35 E0D4      LDI	R29,4
      36 BFCD      OUT	0x3D,R28
      37 BFDE      OUT	0x3E,R29
      38 51C0      SUBI	R28,0x10
      39 40D0      SBCI	R29,0
      3A EA0A      LDI	R16,0xAA
      3B 8308      STD	Y+0,R16
      3C 2400      CLR	R0
      3D E6E0      LDI	R30,0x60
      3E E0F0      LDI	R31,0
      3F E010      LDI	R17,0
      40 36E9      CPI	R30,0x69
      41 07F1      CPC	R31,R17
      42 F011      BEQ	0x0045
      43 9201      ST	R0,Z+
      44 CFFB      RJMP	0x0040
      45 8300      STD	Z+0,R16
      46 E6E8      LDI	R30,0x68
      47 E0F0      LDI	R31,0
      48 E6A0      LDI	R26,0x60
      49 E0B0      LDI	R27,0
      4A E010      LDI	R17,0
      4B E000      LDI	R16,0
      4C BF0B      OUT	0x3B,R16
      4D 36E8      CPI	R30,0x68
      4E 07F1      CPC	R31,R17
      4F F021      BEQ	0x0054
      50 95C8      LPM
      51 9631      ADIW	R30,1
      52 920D      ST	R0,X+
      53 CFF9      RJMP	0x004D
      54 940E 0150 CALL	_main
_exit:
      56 CFFF      RJMP	_exit
FILE: F:\avr单片机学习\我自编程序\定时器数码管显示\timer1leddisplay.c
(0001) //ICC-AVR application builder : 2007-8-1 21:29:13
(0002) // Target : M16
(0003) // Crystal: 4.0000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) 
(0008) #define key_hour    PD0     
(0009) #define key_min     PD1     
(0010) #define key_sec     PD2   
(0011) #define key_clr     PD3
(0012) /*共阴数码管七段码*/
(0013) const led_tab[10]={    
(0014)         0x3F,/*0*/
(0015)         0x06,/*1*/
(0016)         0x5B,/*2*/
(0017)         0x4F,/*3*/
(0018)         0x66,/*4*/
(0019)         0x6D,/*5*/
(0020)         0x7D,/*6*/
(0021)         0x07,/*7*/
(0022)         0x7F,/*8*/
(0023)         0x6F,/*9*/
(0024) 		};
(0025) unsigned char second,minute,hour;	
(0026) unsigned char time_group[6];
(0027) 
(0028) void delay_ms(unsigned char);
(0029) void display(void);
(0030) void set_detect(void);
(0031) 
(0032) void port_init(void)
(0033) {
(0034)  PORTA = 0x00;
_port_init:
      57 2422      CLR	R2
      58 BA2B      OUT	0x1B,R2
(0035)  DDRA  = 0xFF;
      59 EF8F      LDI	R24,0xFF
      5A BB8A      OUT	0x1A,R24
(0036)  PORTB = 0x00;
      5B BA28      OUT	0x18,R2
(0037)  DDRB  = 0xFF;
      5C BB87      OUT	0x17,R24
(0038)  PORTC = 0x00; //m103 output only
      5D BA25      OUT	0x15,R2
(0039)  DDRC  = 0x00;
      5E BA24      OUT	0x14,R2
(0040)  PORTD = 0xff;
      5F BB82      OUT	0x12,R24
(0041)  DDRD  = 0x00;
      60 BA21      OUT	0x11,R2
      61 9508      RET
(0042) }
(0043) 
(0044) //TIMER1 initialize - prescale:64
(0045) // WGM: 0) Normal, TOP=0xFFFF
(0046) // desired value: 1Hz
(0047) // actual value:  1.000Hz (0.0%)
(0048) void timer1_init(void)
(0049) {
(0050)  TCCR1B = 0x00; //stop
_timer1_init:
      62 2422      CLR	R2
      63 BC2E      OUT	0x2E,R2
(0051)  TCNT1H = 0x0B; //setup
      64 E08B      LDI	R24,0xB
      65 BD8D      OUT	0x2D,R24
(0052)  TCNT1L = 0xDC;
      66 ED8C      LDI	R24,0xDC
      67 BD8C      OUT	0x2C,R24
(0053) 
(0054)  TCCR1A = 0x00;
      68 BC2F      OUT	0x2F,R2
(0055)  TCCR1B = 0x03; //start Timer
      69 E083      LDI	R24,3
      6A BD8E      OUT	0x2E,R24
      6B 9508      RET
_timer1_ovf_isr:
      6C 922A      ST	R2,-Y
      6D 938A      ST	R24,-Y
      6E 939A      ST	R25,-Y
      6F B62F      IN	R2,0x3F
      70 922A      ST	R2,-Y
(0056) }
(0057) 
(0058) #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
(0059) void timer1_ovf_isr(void)
(0060) {
(0061)  //TIMER1 has overflowed
(0062)  TCNT1H = 0x0B; //reload counter high value
      71 E08B      LDI	R24,0xB
      72 BD8D      OUT	0x2D,R24
(0063)  TCNT1L = 0xDC; //reload counter low value
      73 ED8C      LDI	R24,0xDC
      74 BD8C      OUT	0x2C,R24
(0064)  second++;
      75 9180 0068 LDS	R24,second
      77 5F8F      SUBI	R24,0xFF
      78 9380 0068 STS	second,R24
(0065)  if(second==60)
      7A 338C      CPI	R24,0x3C
      7B F4C1      BNE	0x0094
(0066)  {
(0067)   second=0x00;
      7C 2422      CLR	R2
      7D 9220 0068 STS	second,R2
(0068)   minute++;
      7F 9180 0067 LDS	R24,minute
      81 5F8F      SUBI	R24,0xFF
      82 9380 0067 STS	minute,R24
(0069)   if(minute==60)
      84 338C      CPI	R24,0x3C
      85 F471      BNE	0x0094
(0070)   {
(0071)    minute=0x00;
      86 9220 0067 STS	minute,R2
(0072)    hour++;
      88 9180 0066 LDS	R24,hour
      8A 5F8F      SUBI	R24,0xFF
      8B 9380 0066 STS	hour,R24
(0073)    if(hour=24)
      8D E188      LDI	R24,0x18
      8E 9380 0066 STS	hour,R24
      90 2388      TST	R24
      91 F011      BEQ	0x0094
(0074)    {
(0075)    hour=0x00;
      92 9220 0066 STS	hour,R2
(0076)    }
(0077)   }
(0078)  }
      94 9029      LD	R2,Y+
      95 BE2F      OUT	0x3F,R2
      96 9199      LD	R25,Y+
      97 9189      LD	R24,Y+
      98 9029      LD	R2,Y+
      99 9518      RETI
(0079) }
(0080) 
(0081) /*数据拆分程序*/
(0082) void data_split(void)  
(0083) {
(0084)  time_group[0]=second%10;
_data_split:
      9A E01A      LDI	R17,0xA
      9B 9100 0068 LDS	R16,second
      9D 940E 0157 CALL	mod8u
      9F 9300 0060 STS	time_group,R16
(0085)  time_group[1]=second/10;
      A1 E01A      LDI	R17,0xA
      A2 9100 0068 LDS	R16,second
      A4 940E 0159 CALL	div8u
      A6 9300 0061 STS	time_group+1,R16
(0086)  time_group[2]=minute%10;
      A8 E01A      LDI	R17,0xA
      A9 9100 0067 LDS	R16,minute
      AB 940E 0157 CALL	mod8u
      AD 9300 0062 STS	time_group+2,R16
(0087)  time_group[3]=minute/10;
      AF E01A      LDI	R17,0xA
      B0 9100 0067 LDS	R16,minute
      B2 940E 0159 CALL	div8u
      B4 9300 0063 STS	time_group+3,R16
(0088)  time_group[4]=hour%10;
      B6 E01A      LDI	R17,0xA
      B7 9100 0066 LDS	R16,hour
      B9 940E 0157 CALL	mod8u
      BB 9300 0064 STS	0x0064,R16
(0089)  time_group[5]=hour/10;
      BD E01A      LDI	R17,0xA
      BE 9100 0066 LDS	R16,hour
      C0 940E 0159 CALL	div8u
      C2 9300 0065 STS	0x0065,R16
      C4 9508      RET
(0090) }
(0091) 
(0092) /*时间设置检测*/
(0093) void set_detect(void)   
(0094) {
(0095)   if(!(PIND&(1<<key_clr))) //清零键检测
_set_detect:
      C5 9983      SBIC	0x10,3
      C6 C00B      RJMP	0x00D2
(0096)   {
(0097)    delay_ms(10);
      C7 E00A      LDI	R16,0xA
      C8 D078      RCALL	_delay_ms
(0098)    if(!(PIND&(1<<key_clr)))
      C9 9983      SBIC	0x10,3
      CA C007      RJMP	0x00D2
(0099)    {
(0100)     hour=0x00;
      CB 2422      CLR	R2
      CC 9220 0066 STS	hour,R2
(0101) 	minute=0x00;
      CE 9220 0067 STS	minute,R2
(0102) 	second=0x00;
      D0 9220 0068 STS	second,R2
(0103)    }
(0104)   }
(0105)   
(0106) 
(0107)   if(!(PIND&(1<<key_hour)))  //小时调整键检测
      D2 9980      SBIC	0x10,0
      D3 C012      RJMP	0x00E6
(0108)   {
(0109)    delay_ms(10);
      D4 E00A      LDI	R16,0xA
      D5 D06B      RCALL	_delay_ms
(0110)    if(!(PIND&(1<<key_hour)))
      D6 9980      SBIC	0x10,0
      D7 C00E      RJMP	0x00E6
(0111)    {
      D8 C001      RJMP	0x00DA
(0112)     while(!(PIND&(1<<key_hour)))
(0113) 	{
(0114) 	 display();
      D9 D045      RCALL	_display
      DA 9B80      SBIS	0x10,0
      DB CFFD      RJMP	0x00D9
(0115) 	}
(0116) 	hour++;
      DC 9180 0066 LDS	R24,hour
      DE 5F8F      SUBI	R24,0xFF
      DF 9380 0066 STS	hour,R24
(0117) 	if(hour==24)
      E1 3188      CPI	R24,0x18
      E2 F419      BNE	0x00E6
(0118) 	{
(0119) 	 hour=0;
      E3 2422      CLR	R2
      E4 9220 0066 STS	hour,R2
(0120) 	}
(0121)    }
(0122)   }
(0123)   
(0124)   if(!(PIND&(1<<key_min)))//分钟调整键检测
      E6 9981      SBIC	0x10,1
      E7 C012      RJMP	0x00FA
(0125)   {
(0126)    delay_ms(10);
      E8 E00A      LDI	R16,0xA
      E9 D057      RCALL	_delay_ms
(0127)    if(!(PIND&(1<<key_min)))
      EA 9981      SBIC	0x10,1
      EB C00E      RJMP	0x00FA
(0128)    {
      EC C001      RJMP	0x00EE
(0129)     while(!(PIND&(1<<key_min)))
(0130) 	{
(0131) 	 display();
      ED D031      RCALL	_display
      EE 9B81      SBIS	0x10,1
      EF CFFD      RJMP	0x00ED
(0132) 	}
(0133) 	minute++;
      F0 9180 0067 LDS	R24,minute
      F2 5F8F      SUBI	R24,0xFF
      F3 9380 0067 STS	minute,R24
(0134) 	if(minute==60)
      F5 338C      CPI	R24,0x3C
      F6 F419      BNE	0x00FA
(0135) 	{
(0136) 	 minute=0;
      F7 2422      CLR	R2
      F8 9220 0067 STS	minute,R2
(0137) 	}
(0138)    }
(0139)   }
(0140)    if(!(PIND&(1<<key_sec)))//秒调整键检测
      FA 9982      SBIC	0x10,2
      FB C012      RJMP	0x010E
(0141)   {
(0142)    delay_ms(10);
      FC E00A      LDI	R16,0xA
      FD D043      RCALL	_delay_ms
(0143)    if(!(PIND&(1<<key_sec)))
      FE 9982      SBIC	0x10,2
      FF C00E      RJMP	0x010E
(0144)    {
     100 C001      RJMP	0x0102
(0145)     while(!(PIND&(1<<key_sec)))
(0146) 	{
(0147) 	 display();
     101 D01D      RCALL	_display
     102 9B82      SBIS	0x10,2
     103 CFFD      RJMP	0x0101
(0148) 	}
(0149) 	second++;
     104 9180 0068 LDS	R24,second
     106 5F8F      SUBI	R24,0xFF
     107 9380 0068 STS	second,R24
(0150) 	if(second==60)
     109 338C      CPI	R24,0x3C
     10A F419      BNE	0x010E
(0151) 	{
(0152) 	 second=0;
     10B 2422      CLR	R2
     10C 9220 0068 STS	second,R2
(0153) 	}
(0154)    }
(0155)   }
     10E 9508      RET
(0156) }
(0157) 
(0158) //call this routine to initialize all peripherals
(0159) void init_devices(void)
(0160) {
(0161)  //stop errant interrupts until set up
(0162)  CLI(); //disable all interrupts
_init_devices:
     10F 94F8      BCLR	7
(0163)  port_init();
     110 DF46      RCALL	_port_init
(0164)  timer1_init();
     111 DF50      RCALL	_timer1_init
(0165)  hour=0x00;
     112 2422      CLR	R2
     113 9220 0066 STS	hour,R2
(0166)  minute=0x00;
     115 9220 0067 STS	minute,R2
(0167)  second=0x00;
     117 9220 0068 STS	second,R2
(0168)  MCUCR = 0x00;
     119 BE25      OUT	0x35,R2
(0169)  GICR  = 0x00;
     11A BE2B      OUT	0x3B,R2
(0170)  TIMSK = 0x04; //timer interrupt sources
     11B E084      LDI	R24,4
     11C BF89      OUT	0x39,R24
(0171)  SEI(); //re-enable interrupts
     11D 9478      BSET	7
     11E 9508      RET
_display:
  led_sel              --> R20
  i                    --> R22
     11F 940E 016F CALL	push_xgsetF000
(0172)  //all peripherals are now initialized
(0173) }
(0174) 
(0175) /*动态扫描显示程序*/
(0176) void display()  
(0177) {
(0178)   unsigned char i,led_sel;
(0179)   led_sel=0xdf;
     121 ED4F      LDI	R20,0xDF
(0180)   for(i=0;i<6;i++)
     122 2766      CLR	R22
     123 C019      RJMP	0x013D
(0181)   {
(0182)    PORTA=led_tab[time_group[i]];
     124 E680      LDI	R24,0x60
     125 E090      LDI	R25,0
     126 2FE6      MOV	R30,R22
     127 27FF      CLR	R31
     128 0FE8      ADD	R30,R24
     129 1FF9      ADC	R31,R25
     12A 81E0      LDD	R30,Z+0
     12B 27FF      CLR	R31
     12C 0FEE      LSL	R30
     12D 1FFF      ROL	R31
     12E E584      LDI	R24,0x54
     12F E090      LDI	R25,0
     130 0FE8      ADD	R30,R24
     131 1FF9      ADC	R31,R25
     132 9025      LPM	R2,Z+
     133 9034      LPM	R3,0(Z)
     134 BA2B      OUT	0x1B,R2
(0183)    PORTB=led_sel;
     135 BB48      OUT	0x18,R20
(0184)    led_sel=(led_sel>>1)+0x80;
     136 9546      LSR	R20
     137 5840      SUBI	R20,0x80
(0185)    delay_ms(10);
     138 E00A      LDI	R16,0xA
     139 D007      RCALL	_delay_ms
(0186)    PORTB=0xff;
     13A EF8F      LDI	R24,0xFF
     13B BB88      OUT	0x18,R24
     13C 9563      INC	R22
     13D 3066      CPI	R22,6
     13E F328      BCS	0x0124
     13F 940C 0174 JMP	pop_xgsetF000
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
     141 934A      ST	R20,-Y
     142 936A      ST	R22,-Y
(0187)   }
(0188) }
(0189) 
(0190) /*毫秒延时程序*/
(0191) void delay_ms(unsigned char i)
(0192)  { 
(0193)  unsigned char a, b;
(0194)   for (a = 1; a < i; a++) 
     143 E041      LDI	R20,1
     144 C006      RJMP	0x014B
(0195)   {  
(0196)    for (b = 1; b; b++) 
     145 E061      LDI	R22,1
     146 C001      RJMP	0x0148
     147 9563      INC	R22
     148 2366      TST	R22
     149 F7E9      BNE	0x0147
     14A 9543      INC	R20
     14B 1740      CP	R20,R16
     14C F3C0      BCS	0x0145
     14D 9169      LD	R22,Y+
     14E 9149      LD	R20,Y+
     14F 9508      RET
(0197)    {   
(0198)     ;   
(0199)    } 
(0200)   }
(0201) }
(0202) 
(0203) /*主程序*/
(0204) void main(void)
(0205) {
(0206) 
(0207)   init_devices();
_main:
     150 DFBE      RCALL	_init_devices
     151 C003      RJMP	0x0155
(0208)   while(1)
(0209)   {
(0210)    set_detect();
     152 DF72      RCALL	_set_detect
(0211)    data_split();
     153 DF46      RCALL	_data_split
(0212)    display();
FILE: <library>
     154 DFCA      RCALL	_display
     155 CFFC      RJMP	0x0152
     156 9508      RET
mod8u:
     157 9468      BSET	6
     158 C001      RJMP	xdiv8u
div8u:
     159 94E8      BCLR	6
xdiv8u:
     15A 932A      ST	R18,-Y
     15B 92FA      ST	R15,-Y
     15C 92EA      ST	R14,-Y
     15D 24FF      CLR	R15
     15E 24EE      CLR	R14
     15F E120      LDI	R18,0x10
     160 0F00      LSL	R16
     161 1CFF      ROL	R15
     162 1CEE      ROL	R14
     163 16E1      CP	R14,R17
     164 F010      BCS	0x0167
     165 1AE1      SUB	R14,R17
     166 9503      INC	R16
     167 952A      DEC	R18
     168 F7B9      BNE	0x0160
     169 F40E      BRTC	0x016B
     16A 2D0E      MOV	R16,R14
     16B 90E9      LD	R14,Y+
     16C 90F9      LD	R15,Y+
     16D 9129      LD	R18,Y+
     16E 9508      RET
push_xgsetF000:
     16F 937A      ST	R23,-Y
     170 936A      ST	R22,-Y
     171 935A      ST	R21,-Y
     172 934A      ST	R20,-Y
     173 9508      RET
pop_xgsetF000:
     174 9149      LD	R20,Y+
     175 9159      LD	R21,Y+
     176 9169      LD	R22,Y+
     177 9179      LD	R23,Y+
     178 9508      RET

⌨️ 快捷键说明

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