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

📄 数字钟.lst

📁 ICC mega8例子
💻 LST
字号:
__start:
__text_start:
      1D E5CF      LDI	R28,0x5F
      1E E0D4      LDI	R29,4
      1F BFCD      OUT	0x3D,R28
      20 BFDE      OUT	0x3E,R29
      21 51CE      SUBI	R28,0x1E
      22 40D0      SBCI	R29,0
      23 EA0A      LDI	R16,0xAA
      24 8308      STD	Y+0,R16
      25 2400      CLR	R0
      26 E6E3      LDI	R30,0x63
      27 E0F0      LDI	R31,0
      28 E010      LDI	R17,0
      29 36EB      CPI	R30,0x6B
      2A 07F1      CPC	R31,R17
      2B F011      BEQ	0x002E
      2C 9201      ST	R0,Z+
      2D CFFB      RJMP	0x0029
      2E 8300      STD	Z+0,R16
      2F E3E6      LDI	R30,0x36
      30 E0F0      LDI	R31,0
      31 E6A0      LDI	R26,0x60
      32 E0B0      LDI	R27,0
      33 E010      LDI	R17,0
      34 E000      LDI	R16,0
      35 BF0B      OUT	0x3B,R16
      36 33E9      CPI	R30,0x39
      37 07F1      CPC	R31,R17
      38 F021      BEQ	0x003D
      39 95C8      LPM
      3A 9631      ADIW	R30,1
      3B 920D      ST	R0,X+
      3C CFF9      RJMP	0x0036
      3D D0B9      RCALL	_main
_exit:
      3E CFFF      RJMP	_exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_数字钟\数字钟.c
(0001) //ICC-AVR application builder : 2009-3-11 12:47:48
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) 
(0008) void port_init(void)
(0009) {
(0010)  PORTB = 0x00;
_port_init:
      3F 2422      CLR	R2
      40 BA28      OUT	0x18,R2
(0011)  DDRB  = 0x00;
      41 BA27      OUT	0x17,R2
(0012)  PORTC = 0x00; //m103 output only
      42 BA25      OUT	0x15,R2
(0013)  DDRC  = 0x00;
      43 BA24      OUT	0x14,R2
(0014)  PORTD = 0x00;
      44 BA22      OUT	0x12,R2
(0015)  DDRD  = 0x00;
      45 BA21      OUT	0x11,R2
      46 9508      RET
(0016) }
(0017) 
(0018) //call this routine to initialize all peripherals
(0019) void init_devices(void)
(0020) {
(0021)  //stop errant interrupts until set up
(0022)  CLI(); //disable all interrupts
_init_devices:
      47 94F8      BCLR	7
(0023)  port_init();
      48 DFF6      RCALL	_port_init
(0024) 
(0025)  MCUCR = 0x00;
      49 2422      CLR	R2
      4A BE25      OUT	0x35,R2
(0026)  GICR  = 0x00;
      4B BE2B      OUT	0x3B,R2
(0027)  TIMSK = 0x00; //timer interrupt sources
      4C BE29      OUT	0x39,R2
(0028)  SEI(); //re-enable interrupts
      4D 9478      BSET	7
      4E 9508      RET
(0029)  //all peripherals are now initialized
(0030) }
(0031) 
(0032) /************************************
(0033) 用    途:微秒级延时程序
(0034) Taget   :mega8
(0035) crystal :8M
(0036) 介    绍:在8M的晶振上进行us级的延时
(0037) 入口参数:
(0038) *************************************/
(0039) void delay_us(int time)
(0040) {
(0041)     do
(0042)     {
(0043)         time--;
_delay_us:
  time                 --> R16
      4F 5001      SUBI	R16,1
      50 4010      SBCI	R17,0
(0044)     } 
(0045)     while (time > 1);
      51 E081      LDI	R24,1
      52 E090      LDI	R25,0
      53 1780      CP	R24,R16
      54 0791      CPC	R25,R17
      55 F3CC      BLT	0x004F
      56 9508      RET
_show_6_digit:
  j                    --> R20
  i                    --> R10
  p                    --> R22
      57 D0C1      RCALL	push_xgsetF00C
      58 01B8      MOVW	R22,R16
(0046) }
(0047) 
(0048) /************************************
(0049) 用    途:六位数码管的显示程序
(0050) Taget   :mega8
(0051) crystal :8M
(0052) 介    绍:数码管共阳
(0053) 	     a-PB0
(0054) 		 b-PB1
(0055) 		 ...
(0056) 		 h-PB6
(0057) 		 DP-PB7
(0058) 		 -------
(0059) 		 1-PC5
(0060) 		 2-PC4
(0061) 		 3-PC3
(0062) 		 4-PC2
(0063) 		 5-PC1
(0064) 		 6-PC0
(0065) 	     使用show_6_digit(p)
(0066) 	     unsigned char数组
(0067) 	  	 B用作数据口
(0068)          C用作片选
(0069) 入口参数:显示数组
(0070) *************************************/
(0071) const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0072) 	   			0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0073) void show_6_digit(unsigned char *p)
(0074) {
(0075)  unsigned char i,j;
(0076)  DDRB=0xff;
      59 EF8F      LDI	R24,0xFF
      5A BB87      OUT	0x17,R24
(0077)  DDRC=0xff;
      5B BB84      OUT	0x14,R24
(0078)  for (j=0;j<200;j++)
      5C 2744      CLR	R20
      5D C01F      RJMP	0x007D
(0079)  {
(0080)   for (i=0;i<6;i++)
      5E 24AA      CLR	R10
      5F C019      RJMP	0x0079
(0081)   {
(0082)     PORTC=0;//先关显示
      60 2422      CLR	R2
      61 BA25      OUT	0x15,R2
(0083)     PORTB=~num[*(p+5-i)];//送数据
      62 2C2A      MOV	R2,R10
      63 2433      CLR	R3
      64 01FB      MOVW	R30,R22
      65 9635      ADIW	R30,5
      66 19E2      SUB	R30,R2
      67 09F3      SBC	R31,R3
      68 81E0      LDD	R30,Z+0
      69 27FF      CLR	R31
      6A E286      LDI	R24,0x26
      6B E090      LDI	R25,0
      6C 0FE8      ADD	R30,R24
      6D 1FF9      ADC	R31,R25
      6E 9024      LPM	R2,0(Z)
      6F 9420      COM	R2
      70 BA28      OUT	0x18,R2
(0084) 	PORTC=(0x1<<i);//开显示
      71 E001      LDI	R16,1
      72 2D1A      MOV	R17,R10
      73 D0B3      RCALL	lsl8
      74 BB05      OUT	0x15,R16
(0085) 	delay_us(200);//小延时
      75 EC08      LDI	R16,0xC8
      76 E010      LDI	R17,0
      77 DFD7      RCALL	_delay_us
      78 94A3      INC	R10
      79 2D8A      MOV	R24,R10
      7A 3086      CPI	R24,6
      7B F320      BCS	0x0060
      7C 9543      INC	R20
      7D 3C48      CPI	R20,0xC8
      7E F2F8      BCS	0x005E
      7F C0A0      RJMP	pop_xgsetF00C
(0086)   }
(0087)  }
(0088) }
(0089) 
(0090) /************************************
(0091) 用    途:用TC0做一个时钟
(0092) Taget   :mega8
(0093) crystal :8M
(0094) 介    绍:8M晶振
(0095) 入口参数:
(0096) 出口参数:
(0097) *************************************/
(0098) unsigned char CountNum;//用来记录中断,第一次中断是1/500S
(0099) unsigned char Count;//用来做1/100S
(0100) unsigned char Time[3]={12,0,0};//表示时间,时分秒
(0101) //初始化TC0
(0102) void init_timer0()
(0103) {
(0104)  TCCR0=0x00;//TCCR0工作于定时方式,先停止TC0
_init_timer0:
      80 2422      CLR	R2
      81 BE23      OUT	0x33,R2
(0105)  TCNT0=0x06;//计数器初始值
      82 E086      LDI	R24,6
      83 BF82      OUT	0x32,R24
(0106)  TIMSK|=(1<<TOIE0);//开放TOIE0中断
      84 B789      IN	R24,0x39
      85 6081      ORI	R24,1
      86 BF89      OUT	0x39,R24
(0107)  TCCR0=(1<<CS01)|(1<<CS00);//打开TC0用64分频
      87 E083      LDI	R24,3
      88 BF83      OUT	0x33,R24
      89 9508      RET
_timer0_fun:
      8A 922A      ST	R2,-Y
      8B 938A      ST	R24,-Y
      8C 939A      ST	R25,-Y
      8D B62F      IN	R2,0x3F
      8E 922A      ST	R2,-Y
(0108) }
(0109) //TC0中断函数
(0110) #pragma interrupt_handler timer0_fun:iv_TIMER0_OVF
(0111) void timer0_fun()
(0112) {
(0113)  TCNT0=0x06;//重装初值
      8F E086      LDI	R24,6
      90 BF82      OUT	0x32,R24
(0114)  if (++CountNum==5)
      91 9180 006A LDS	R24,CountNum
      93 5F8F      SUBI	R24,0xFF
      94 2E28      MOV	R2,R24
      95 9220 006A STS	CountNum,R2
      97 3085      CPI	R24,5
      98 F441      BNE	0x00A1
(0115)  {
(0116)   CountNum=0;
      99 2422      CLR	R2
      9A 9220 006A STS	CountNum,R2
(0117)   Count++;
      9C 9180 0069 LDS	R24,Count
      9E 5F8F      SUBI	R24,0xFF
      9F 9380 0069 STS	Count,R24
(0118)  }
(0119)  if (Count==100)//Count=100就是一秒到时了
      A1 9180 0069 LDS	R24,Count
      A3 3684      CPI	R24,0x64
      A4 F441      BNE	0x00AD
(0120)  {
(0121)   Count=0;
      A5 2422      CLR	R2
      A6 9220 0069 STS	Count,R2
(0122)   Time[2]++;
      A8 9180 0062 LDS	R24,Time+2
      AA 5F8F      SUBI	R24,0xFF
      AB 9380 0062 STS	Time+2,R24
(0123)  }
(0124)  if (Time[2]==60)
      AD 9180 0062 LDS	R24,Time+2
      AF 338C      CPI	R24,0x3C
      B0 F441      BNE	0x00B9
(0125)  {
(0126)   Time[2]=0;
      B1 2422      CLR	R2
      B2 9220 0062 STS	Time+2,R2
(0127)   Time[1]++;
      B4 9180 0061 LDS	R24,Time+1
      B6 5F8F      SUBI	R24,0xFF
      B7 9380 0061 STS	Time+1,R24
(0128)  }
(0129)  if (Time[1]==60)
      B9 9180 0061 LDS	R24,Time+1
      BB 338C      CPI	R24,0x3C
      BC F441      BNE	0x00C5
(0130)  {
(0131)   Time[1]=0;
      BD 2422      CLR	R2
      BE 9220 0061 STS	Time+1,R2
(0132)   Time[0]++;
      C0 9180 0060 LDS	R24,Time
      C2 5F8F      SUBI	R24,0xFF
      C3 9380 0060 STS	Time,R24
(0133)  }
(0134)  if (Time[0]==24)
      C5 9180 0060 LDS	R24,Time
      C7 3188      CPI	R24,0x18
      C8 F419      BNE	0x00CC
(0135)  {
(0136)   Time[0]=0;
      C9 2422      CLR	R2
      CA 9220 0060 STS	Time,R2
(0137)  }
      CC 9029      LD	R2,Y+
      CD BE2F      OUT	0x3F,R2
      CE 9199      LD	R25,Y+
      CF 9189      LD	R24,Y+
      D0 9029      LD	R2,Y+
      D1 9518      RETI
(0138) }
(0139) //************************************************
(0140) 
(0141)  unsigned char Time6[6];
(0142) /************************************
(0143) 用    途:时间的转换
(0144) Taget   :mega8
(0145) crystal :8M
(0146) 介    绍:
(0147) 入口参数:
(0148) 出口参数:
(0149) *************************************/
(0150) void time_convert()
(0151) {
(0152)  Time6[0]=Time[0]/10;
_time_convert:
      D2 E01A      LDI	R17,0xA
      D3 9100 0060 LDS	R16,Time
      D5 D02D      RCALL	div8u
      D6 9300 0063 STS	Time6,R16
(0153)  Time6[1]=Time[0]%10;
      D8 E01A      LDI	R17,0xA
      D9 9100 0060 LDS	R16,Time
      DB D025      RCALL	mod8u
      DC 9300 0064 STS	Time6+1,R16
(0154)  Time6[2]=Time[1]/10;
      DE E01A      LDI	R17,0xA
      DF 9100 0061 LDS	R16,Time+1
      E1 D021      RCALL	div8u
      E2 9300 0065 STS	Time6+2,R16
(0155)  Time6[3]=Time[1]%10;
      E4 E01A      LDI	R17,0xA
      E5 9100 0061 LDS	R16,Time+1
      E7 D019      RCALL	mod8u
      E8 9300 0066 STS	Time6+3,R16
(0156)  Time6[4]=Time[2]/10;
      EA E01A      LDI	R17,0xA
      EB 9100 0062 LDS	R16,Time+2
      ED D015      RCALL	div8u
      EE 9300 0067 STS	0x0067,R16
(0157)  Time6[5]=Time[2]%10;
      F0 E01A      LDI	R17,0xA
      F1 9100 0062 LDS	R16,Time+2
      F3 D00D      RCALL	mod8u
      F4 9300 0068 STS	0x0068,R16
      F6 9508      RET
(0158) }
(0159) 
(0160) void main()
(0161) {
(0162) 
(0163)  port_init();
_main:
      F7 DF47      RCALL	_port_init
(0164)  init_devices();
      F8 DF4E      RCALL	_init_devices
(0165)  
(0166)  init_timer0();
      F9 DF86      RCALL	_init_timer0
      FA C004      RJMP	0x00FF
(0167)  while(1)
(0168)  {
(0169)   time_convert();
      FB DFD6      RCALL	_time_convert
(0170)   show_6_digit(Time6);
FILE: <library>
      FC E603      LDI	R16,0x63
      FD E010      LDI	R17,0
      FE DF58      RCALL	_show_6_digit
      FF CFFB      RJMP	0x00FB
     100 9508      RET
mod8u:
     101 9468      BSET	6
     102 C001      RJMP	xdiv8u
div8u:
     103 94E8      BCLR	6
xdiv8u:
     104 932A      ST	R18,-Y
     105 92FA      ST	R15,-Y
     106 92EA      ST	R14,-Y
     107 24FF      CLR	R15
     108 24EE      CLR	R14
     109 E120      LDI	R18,0x10
     10A 0F00      LSL	R16
     10B 1CFF      ROL	R15
     10C 1CEE      ROL	R14
     10D 16E1      CP	R14,R17
     10E F010      BCS	0x0111
     10F 1AE1      SUB	R14,R17
     110 9503      INC	R16
     111 952A      DEC	R18
     112 F7B9      BNE	0x010A
     113 F40E      BRTC	0x0115
     114 2D0E      MOV	R16,R14
     115 90E9      LD	R14,Y+
     116 90F9      LD	R15,Y+
     117 9129      LD	R18,Y+
     118 9508      RET
push_xgsetF00C:
     119 937A      ST	R23,-Y
     11A 936A      ST	R22,-Y
     11B 935A      ST	R21,-Y
     11C 934A      ST	R20,-Y
     11D 92BA      ST	R11,-Y
     11E 92AA      ST	R10,-Y
     11F 9508      RET
pop_xgsetF00C:
     120 90A9      LD	R10,Y+
     121 90B9      LD	R11,Y+
     122 9149      LD	R20,Y+
     123 9159      LD	R21,Y+
     124 9169      LD	R22,Y+
     125 9179      LD	R23,Y+
     126 9508      RET
lsl8:
     127 2311      TST	R17
     128 F019      BEQ	0x012C
     129 0F00      LSL	R16
     12A 951A      DEC	R17
     12B CFFB      RJMP	lsl8
     12C 9508      RET

⌨️ 快捷键说明

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