四位数码管显示.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 + -
显示快捷键?