六位数码管显示.lst
来自「ICC mega8例子」· LST 代码 · 共 281 行
LST
281 行
__text_start:
__start:
1E E5CF LDI R28,0x5F
1F E0D4 LDI R29,4
20 BFCD OUT 0x3D,R28
21 BFDE OUT 0x3E,R29
22 51CE SUBI R28,0x1E
23 40D0 SBCI R29,0
24 EA0A LDI R16,0xAA
25 8308 STD Y+0,R16
26 2400 CLR R0
27 E6E0 LDI R30,0x60
28 E0F0 LDI R31,0
29 E010 LDI R17,0
2A 36E0 CPI R30,0x60
2B 07F1 CPC R31,R17
2C F011 BEQ 0x002F
2D 9201 ST R0,Z+
2E CFFB RJMP 0x002A
2F 8300 STD Z+0,R16
30 E3EC LDI R30,0x3C
31 E0F0 LDI R31,0
32 E6A0 LDI R26,0x60
33 E0B0 LDI R27,0
34 E010 LDI R17,0
35 E000 LDI R16,0
36 BF0B OUT 0x3B,R16
37 33EC CPI R30,0x3C
38 07F1 CPC R31,R17
39 F021 BEQ 0x003E
3A 95C8 LPM
3B 9631 ADIW R30,1
3C 920D ST R0,X+
3D CFF9 RJMP 0x0037
3E D042 RCALL _main
_exit:
3F CFFF RJMP _exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_六位数码管显示\六位数码管显示.c
(0001) //ICC-AVR application builder : 2009-3-11 12:19:32
(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:
40 2422 CLR R2
41 BA28 OUT 0x18,R2
(0011) DDRB = 0x00;
42 BA27 OUT 0x17,R2
(0012) PORTC = 0x00; //m103 output only
43 BA25 OUT 0x15,R2
(0013) DDRC = 0x00;
44 BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
45 BA22 OUT 0x12,R2
(0015) DDRD = 0x00;
46 BA21 OUT 0x11,R2
47 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:
48 94F8 BCLR 7
(0023) port_init();
49 DFF6 RCALL _port_init
(0024)
(0025) MCUCR = 0x00;
4A 2422 CLR R2
4B BE25 OUT 0x35,R2
(0026) GICR = 0x00;
4C BE2B OUT 0x3B,R2
(0027) TIMSK = 0x00; //timer interrupt sources
4D BE29 OUT 0x39,R2
(0028) SEI(); //re-enable interrupts
4E 9478 BSET 7
4F 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
50 5001 SUBI R16,1
51 4010 SBCI R17,0
(0044) }
(0045) while (time > 1);
52 E081 LDI R24,1
53 E090 LDI R25,0
54 1780 CP R24,R16
55 0791 CPC R25,R17
56 F3CC BLT 0x0050
57 9508 RET
_show_6_digit:
j --> R20
i --> R10
p --> R22
58 D03B RCALL push_xgsetF00C
59 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;
5A EF8F LDI R24,0xFF
5B BB87 OUT 0x17,R24
(0077) DDRC=0xff;
5C BB84 OUT 0x14,R24
(0078) for (j=0;j<200;j++)
5D 2744 CLR R20
5E C01F RJMP 0x007E
(0079) {
(0080) for (i=0;i<6;i++)
5F 24AA CLR R10
60 C019 RJMP 0x007A
(0081) {
(0082) PORTC=0;//先关显示
61 2422 CLR R2
62 BA25 OUT 0x15,R2
(0083) PORTB=~num[*(p+5-i)];//送数据
63 2C2A MOV R2,R10
64 2433 CLR R3
65 01FB MOVW R30,R22
66 9635 ADIW R30,5
67 19E2 SUB R30,R2
68 09F3 SBC R31,R3
69 81E0 LDD R30,Z+0
6A 27FF CLR R31
6B E286 LDI R24,0x26
6C E090 LDI R25,0
6D 0FE8 ADD R30,R24
6E 1FF9 ADC R31,R25
6F 9024 LPM R2,0(Z)
70 9420 COM R2
71 BA28 OUT 0x18,R2
(0084) PORTC=(0x1<<i);//开显示
72 E001 LDI R16,1
73 2D1A MOV R17,R10
74 D02D RCALL lsl8
75 BB05 OUT 0x15,R16
(0085) delay_us(200);//小延时
76 EC08 LDI R16,0xC8
77 E010 LDI R17,0
78 DFD7 RCALL _delay_us
79 94A3 INC R10
7A 2D8A MOV R24,R10
7B 3086 CPI R24,6
7C F320 BCS 0x0061
7D 9543 INC R20
7E 3C48 CPI R20,0xC8
7F F2F8 BCS 0x005F
80 C01A RJMP pop_xgsetF00C
_main:
p --> Y,+0
81 9726 SBIW R28,6
(0086) }
(0087) }
(0088) }
(0089)
(0090) void main()
(0091) {
(0092) unsigned char p[6]={1,2,3,4,5,6};
82 E386 LDI R24,0x36
83 E090 LDI R25,0
84 01FE MOVW R30,R28
85 E006 LDI R16,6
86 E010 LDI R17,0
87 93FA ST R31,-Y
88 93EA ST R30,-Y
89 939A ST R25,-Y
8A 938A ST R24,-Y
8B D01C RCALL asgncblk
(0093) port_init();
8C DFB3 RCALL _port_init
(0094) init_devices();
8D DFBA RCALL _init_devices
8E C002 RJMP 0x0091
(0095)
(0096) while(1)
(0097) {
(0098) show_6_digit(p);
FILE: <library>
8F 018E MOVW R16,R28
90 DFC7 RCALL _show_6_digit
91 CFFD RJMP 0x008F
92 9626 ADIW R28,6
93 9508 RET
push_xgsetF00C:
94 937A ST R23,-Y
95 936A ST R22,-Y
96 935A ST R21,-Y
97 934A ST R20,-Y
98 92BA ST R11,-Y
99 92AA ST R10,-Y
9A 9508 RET
pop_xgsetF00C:
9B 90A9 LD R10,Y+
9C 90B9 LD R11,Y+
9D 9149 LD R20,Y+
9E 9159 LD R21,Y+
9F 9169 LD R22,Y+
A0 9179 LD R23,Y+
A1 9508 RET
lsl8:
A2 2311 TST R17
A3 F019 BEQ 0x00A7
A4 0F00 LSL R16
A5 951A DEC R17
A6 CFFB RJMP lsl8
A7 9508 RET
asgncblk:
A8 93AA ST R26,-Y
A9 93BA ST R27,-Y
AA 93EA ST R30,-Y
AB 93FA ST R31,-Y
AC 920A ST R0,-Y
AD 81AF LDD R26,Y+7
AE 85B8 LDD R27,Y+8
AF 81ED LDD R30,Y+5
B0 81FE LDD R31,Y+6
B1 3000 CPI R16,0
B2 0701 CPC R16,R17
B3 F031 BEQ 0x00BA
B4 95C8 LPM
B5 920D ST R0,X+
B6 9631 ADIW R30,1
B7 5001 SUBI R16,1
B8 4010 SBCI R17,0
B9 CFF7 RJMP 0x00B1
BA 9009 LD R0,Y+
BB 91F9 LD R31,Y+
BC 91E9 LD R30,Y+
BD 91B9 LD R27,Y+
BE 91A9 LD R26,Y+
BF 9624 ADIW R28,4
C0 9508 RET
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?