四位数码管显示.lst

来自「ICC mega8例子」· LST 代码 · 共 279 行

LST
279
字号
__text_start:
__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 E6E0      LDI	R30,0x60
      27 E0F0      LDI	R31,0
      28 E010      LDI	R17,0
      29 36E0      CPI	R30,0x60
      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 E3EA      LDI	R30,0x3A
      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 33EA      CPI	R30,0x3A
      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 D042      RCALL	_main
_exit:
      3E CFFF      RJMP	_exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_四位数码管显示\四位数码管显示.c
(0001) //ICC-AVR application builder : 2009-3-10 14:16:46
(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_4_digit:
  j                    --> R20
  i                    --> R10
  p                    --> R22
      57 D03B      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-PC3
(0060) 		 2-PC2
(0061) 		 3-PC1
(0062) 		 4-PC0
(0063) 	     使用show_4_digit(p)
(0064) 	     unsigned char数组
(0065) 	  	 B用作数据口
(0066)          C用作片选
(0067) 入口参数:显示数组
(0068) *************************************/
(0069) const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0070) 	   			0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0071) void show_4_digit(unsigned char *p)
(0072) {
(0073)  unsigned char i,j;
(0074)  DDRB=0xff;
      59 EF8F      LDI	R24,0xFF
      5A BB87      OUT	0x17,R24
(0075)  DDRC=0xff;
      5B BB84      OUT	0x14,R24
(0076)  for (j=0;j<200;j++)
      5C 2744      CLR	R20
      5D C01F      RJMP	0x007D
(0077)  {
(0078)   for (i=0;i<4;i++)
      5E 24AA      CLR	R10
      5F C019      RJMP	0x0079
(0079)   {
(0080)     PORTC=0;//先关显示
      60 2422      CLR	R2
      61 BA25      OUT	0x15,R2
(0081)     PORTB=~num[*(p+3-i)];//送数据
      62 2C2A      MOV	R2,R10
      63 2433      CLR	R3
      64 01FB      MOVW	R30,R22
      65 9633      ADIW	R30,3
      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
(0082) 	PORTC=(0x1<<i);//开显示
      71 E001      LDI	R16,1
      72 2D1A      MOV	R17,R10
      73 D02D      RCALL	lsl8
      74 BB05      OUT	0x15,R16
(0083) 	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 3084      CPI	R24,4
      7B F320      BCS	0x0060
      7C 9543      INC	R20
      7D 3C48      CPI	R20,0xC8
      7E F2F8      BCS	0x005E
      7F C01A      RJMP	pop_xgsetF00C
_main:
  p                    --> Y,+0
      80 9724      SBIW	R28,4
(0084)   }
(0085)  }
(0086) }
(0087) 
(0088) void main()
(0089) {
(0090)  unsigned char p[4]={1,2,3,4};
      81 E386      LDI	R24,0x36
      82 E090      LDI	R25,0
      83 01FE      MOVW	R30,R28
      84 E004      LDI	R16,4
      85 E010      LDI	R17,0
      86 93FA      ST	R31,-Y
      87 93EA      ST	R30,-Y
      88 939A      ST	R25,-Y
      89 938A      ST	R24,-Y
      8A D01C      RCALL	asgncblk
(0091)  port_init();
      8B DFB3      RCALL	_port_init
(0092)  init_devices();
      8C DFBA      RCALL	_init_devices
      8D C002      RJMP	0x0090
(0093)  
(0094)  while(1)
(0095)  {
(0096)   show_4_digit(p);
FILE: <library>
      8E 018E      MOVW	R16,R28
      8F DFC7      RCALL	_show_4_digit
      90 CFFD      RJMP	0x008E
      91 9624      ADIW	R28,4
      92 9508      RET
push_xgsetF00C:
      93 937A      ST	R23,-Y
      94 936A      ST	R22,-Y
      95 935A      ST	R21,-Y
      96 934A      ST	R20,-Y
      97 92BA      ST	R11,-Y
      98 92AA      ST	R10,-Y
      99 9508      RET
pop_xgsetF00C:
      9A 90A9      LD	R10,Y+
      9B 90B9      LD	R11,Y+
      9C 9149      LD	R20,Y+
      9D 9159      LD	R21,Y+
      9E 9169      LD	R22,Y+
      9F 9179      LD	R23,Y+
      A0 9508      RET
lsl8:
      A1 2311      TST	R17
      A2 F019      BEQ	0x00A6
      A3 0F00      LSL	R16
      A4 951A      DEC	R17
      A5 CFFB      RJMP	lsl8
      A6 9508      RET
asgncblk:
      A7 93AA      ST	R26,-Y
      A8 93BA      ST	R27,-Y
      A9 93EA      ST	R30,-Y
      AA 93FA      ST	R31,-Y
      AB 920A      ST	R0,-Y
      AC 81AF      LDD	R26,Y+7
      AD 85B8      LDD	R27,Y+8
      AE 81ED      LDD	R30,Y+5
      AF 81FE      LDD	R31,Y+6
      B0 3000      CPI	R16,0
      B1 0701      CPC	R16,R17
      B2 F031      BEQ	0x00B9
      B3 95C8      LPM
      B4 920D      ST	R0,X+
      B5 9631      ADIW	R30,1
      B6 5001      SUBI	R16,1
      B7 4010      SBCI	R17,0
      B8 CFF7      RJMP	0x00B0
      B9 9009      LD	R0,Y+
      BA 91F9      LD	R31,Y+
      BB 91E9      LD	R30,Y+
      BC 91B9      LD	R27,Y+
      BD 91A9      LD	R26,Y+
      BE 9624      ADIW	R28,4
      BF 9508      RET

⌨️ 快捷键说明

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