segdisp-16sn.lis
来自「大量ATMEGA16实例, 都可以运行,包括驱动LCD1602, 上位机显示等多」· LIS 代码 · 共 800 行 · 第 1/3 页
LIS
800 行
0004 ; int i, j;
0004 ; for(i=count; i>0; i--)
0004 A801 movw R20,R16
0006 0BC0 xjmp L5
0008 L2:
0008 .dbline 28
0008 ; for(j=3; j>0; j--)
0008 63E0 ldi R22,3
000A 70E0 ldi R23,0
000C L6:
000C .dbline 29
000C ; ;
000C L7:
000C .dbline 28
000C 6150 subi R22,1
000E 7040 sbci R23,0
0010 .dbline 28
0010 2224 clr R2
0012 3324 clr R3
0014 2616 cp R2,R22
0016 3706 cpc R3,R23
0018 CCF3 brlt L6
001A X0:
001A L3:
001A .dbline 27
001A 4150 subi R20,1
001C 5040 sbci R21,0
001E L5:
001E .dbline 27
001E 2224 clr R2
0020 3324 clr R3
0022 2416 cp R2,R20
0024 3506 cpc R3,R21
0026 84F3 brlt L2
0028 X1:
0028 .dbline -2
0028 L1:
0028 .dbline 0 ; func end
0028 0C940000 xjmp pop_xgsetF000
002C .dbsym r i 20 I
002C .dbsym r j 22 I
002C .dbsym r count 16 I
002C .dbend
002C .dbfunc e led_disp _led_disp fV
.even
002C _led_disp::
002C .dbline -1
002C .dbline 35
002C ; }
002C ;
002C ; //*****************************************************************
002C ;
002C ; void led_disp(void)
002C ; {
002C .dbline 36
002C ; if(time_over>=10)
002C 80910C00 lds R24,_time_over
0030 90910D00 lds R25,_time_over+1
0034 8A30 cpi R24,10
0036 E0E0 ldi R30,0
0038 9E07 cpc R25,R30
003A 0CF4 brge X7
003C 5AC0 xjmp L11
003E X7:
003E X2:
003E .dbline 37
003E ; {
003E .dbline 38
003E ; swin3=PINC&0xc0;
003E 83B3 in R24,0x13
0040 807C andi R24,192
0042 80930000 sts _swin3,R24
0046 .dbline 39
0046 ; swin3=swin3>>6;
0046 282E mov R2,R24
0048 2694 lsr R2
004A 2694 lsr R2
004C 2694 lsr R2
004E 2694 lsr R2
0050 2694 lsr R2
0052 2694 lsr R2
0054 20920000 sts _swin3,R2
0058 .dbline 41
0058 ;
0058 ; if(swin3==0)
0058 2220 tst R2
005A 59F4 brne L13
005C X3:
005C .dbline 42
005C ; {
005C .dbline 43
005C ; PORTD=pattern1[led_index];
005C 80E0 ldi R24,<_pattern1
005E 90E0 ldi R25,>_pattern1
0060 E0910A00 lds R30,_led_index
0064 F0910B00 lds R31,_led_index+1
0068 E80F add R30,R24
006A F91F adc R31,R25
006C 2080 ldd R2,z+0
006E 22BA out 0x12,R2
0070 .dbline 44
0070 ; }
0070 28C0 xjmp L14
0072 L13:
0072 .dbline 45
0072 ; else if(swin3==0x01)
0072 80910000 lds R24,_swin3
0076 8130 cpi R24,1
0078 59F4 brne L15
007A X4:
007A .dbline 46
007A ; {
007A .dbline 47
007A ; PORTD=pattern2[led_index];
007A 80E0 ldi R24,<_pattern2
007C 90E0 ldi R25,>_pattern2
007E E0910A00 lds R30,_led_index
0082 F0910B00 lds R31,_led_index+1
0086 E80F add R30,R24
0088 F91F adc R31,R25
008A 2080 ldd R2,z+0
008C 22BA out 0x12,R2
008E .dbline 48
008E ; }
008E 19C0 xjmp L16
0090 L15:
0090 .dbline 49
0090 ; else if(swin3==0x02)
0090 80910000 lds R24,_swin3
0094 8230 cpi R24,2
0096 59F4 brne L17
0098 X5:
0098 .dbline 50
0098 ; {
0098 .dbline 51
0098 ; PORTD=pattern3[led_index];
0098 80E0 ldi R24,<_pattern3
009A 90E0 ldi R25,>_pattern3
009C E0910A00 lds R30,_led_index
00A0 F0910B00 lds R31,_led_index+1
00A4 E80F add R30,R24
00A6 F91F adc R31,R25
00A8 2080 ldd R2,z+0
00AA 22BA out 0x12,R2
00AC .dbline 52
00AC ; }
00AC 0AC0 xjmp L18
00AE L17:
00AE .dbline 54
00AE ; else
00AE ; {
00AE .dbline 55
00AE ; PORTD=pattern4[led_index];
00AE 80E0 ldi R24,<_pattern4
00B0 90E0 ldi R25,>_pattern4
00B2 E0910A00 lds R30,_led_index
00B6 F0910B00 lds R31,_led_index+1
00BA E80F add R30,R24
00BC F91F adc R31,R25
00BE 2080 ldd R2,z+0
00C0 22BA out 0x12,R2
00C2 .dbline 56
00C2 ; }
00C2 L18:
00C2 L16:
00C2 L14:
00C2 .dbline 57
00C2 ; led_index++;
00C2 80910A00 lds R24,_led_index
00C6 90910B00 lds R25,_led_index+1
00CA 0196 adiw R24,1
00CC 90930B00 sts _led_index+1,R25
00D0 80930A00 sts _led_index,R24
00D4 .dbline 58
00D4 ; if(led_index>14)
00D4 8EE0 ldi R24,14
00D6 90E0 ldi R25,0
00D8 20900A00 lds R2,_led_index
00DC 30900B00 lds R3,_led_index+1
00E0 8215 cp R24,R2
00E2 9305 cpc R25,R3
00E4 34F4 brge L19
00E6 X6:
00E6 .dbline 59
00E6 ; led_index=0;
00E6 2224 clr R2
00E8 3324 clr R3
00EA 30920B00 sts _led_index+1,R3
00EE 20920A00 sts _led_index,R2
00F2 L19:
00F2 .dbline 60
00F2 ; }
00F2 L11:
00F2 .dbline 61
00F2 ; swin3=~PINC&0x0f;
00F2 83B3 in R24,0x13
00F4 8095 com R24
00F6 8F70 andi R24,15
00F8 80930000 sts _swin3,R24
00FC .dbline 62
00FC ; delay(100+50*swin3);
00FC 282E mov R2,R24
00FE 82E3 ldi R24,50
0100 829D mul R24,R2
0102 8001 movw R16,R0
0104 0C59 subi R16,156 ; offset = 100
0106 1F4F sbci R17,255
0108 7BDF xcall _delay
010A .dbline -2
010A L10:
010A .dbline 0 ; func end
010A 0895 ret
010C .dbend
010C .dbfunc e BinToBCD _BinToBCD fV
010C ; data -> R20,R21
.even
010C _BinToBCD::
010C 4A93 st -y,R20
010E 5A93 st -y,R21
0110 A801 movw R20,R16
0112 .dbline -1
0112 .dbline 66
0112 ; }
0112 ;
0112 ; void BinToBCD(int data)
0112 ; {
0112 .dbline 67
0112 ; BCD0=0;
0112 2224 clr R2
0114 20920600 sts _BCD0,R2
0118 .dbline 68
0118 ; BCD1=0;
0118 20920500 sts _BCD1,R2
011C .dbline 69
011C ; BCD2=0;
011C 20920400 sts _BCD2,R2
0120 .dbline 70
0120 ; BCD3=0;
0120 20920300 sts _BCD3,R2
0124 .dbline 71
0124 ; if(data>=10000)
0124 4031 cpi R20,16
0126 E7E2 ldi R30,39
0128 5E07 cpc R21,R30
012A 14F0 brlt L22
012C X8:
012C .dbline 72
012C ; data=0;
012C 4427 clr R20
012E 5527 clr R21
0130 L22:
0130 .dbline 73
0130 ; if(data>=1000)
0130 483E cpi R20,232
0132 E3E0 ldi R30,3
0134 5E07 cpc R21,R30
0136 6CF0 brlt L24
0138 X9:
0138 .dbline 74
0138 ; {
0138 .dbline 75
0138 ; BCD3=data/1000;
0138 28EE ldi R18,1000
013A 33E0 ldi R19,3
013C 8A01 movw R16,R20
013E 0E940000 xcall div16s
0142 00930300 sts _BCD3,R16
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?