📄 led7s.lst
字号:
00F2 9508 RET
FILE: F:\单片机源程序\AVR单片机程序\MAGE16\LED\led.c
(0001) #include "config.h"
(0002)
(0003) const led_data[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
(0004)
(0005) void led_init(void)
(0006) {
(0007) led_ddr = 0xFF; //abcdefg dpi 各位设为输出
_led_init:
00F3 EF8F LDI R24,0xFF
00F4 BB8A OUT 0x1A,R24
(0008) led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
00F5 B384 IN R24,0x14
00F6 608F ORI R24,0xF
00F7 BB84 OUT 0x14,R24
00F8 9508 RET
_display_one:
data --> R22
count --> R20
00F9 940E01A9 CALL push_gset2
00FB 2F62 MOV R22,R18
00FC 2F40 MOV R20,R16
(0009) }
(0010)
(0011) /***********************
(0012) ** 显示一位
(0013) ** 输入:count显示在第几位(3210),data 要显示的数(0~f)
(0014) ************************/
(0015) void display_one(uint8 count, uint8 data)
(0016) {
(0017) led_port = led_data[data]; //显示的数
00FD E082 LDI R24,2
00FE 9F86 MUL R24,R22
00FF 01F0 MOVW R30,R0
0100 E584 LDI R24,0x54
0101 E090 LDI R25,0
0102 0FE8 ADD R30,R24
0103 1FF9 ADC R31,R25
0104 9005 LPM R0,Z+
0105 9014 LPM R1,0(Z)
0106 01F0 MOVW R30,R0
0107 BBEB OUT 0x1B,R30
(0018) led_contrl_port &= ~(1<<count); //选中对应要显示的位,从右至左,0123
0108 E001 LDI R16,1
0109 2F14 MOV R17,R20
010A 940E01C2 CALL lsl8
010C 2E20 MOV R2,R16
010D 9420 COM R2
010E B235 IN R3,0x15
010F 2032 AND R3,R2
0110 BA35 OUT 0x15,R3
0111 940E01A0 CALL pop_gset2
0113 9508 RET
_display:
temp --> R20
data --> R22
0114 940E01A9 CALL push_gset2
0116 01B8 MOVW R22,R16
(0019) //如果对位进行了调整,就不在是0123,而是对应的值
(0020) }
(0021)
(0022) /***********************
(0023) ** 显示四位整数
(0024) ** 输入:要显示的四位数data,显示模式mode,1为补零显示模式,默认不显示零
(0025) ** 说明:可以小于四位数,mode=1时 自动补零
(0026) ************************/
(0027) void display(uint16 data)
(0028) {
(0029) uint8 temp;
(0030) if(data>1000) //千位
0117 EE88 LDI R24,0xE8
0118 E093 LDI R25,3
0119 1786 CP R24,R22
011A 0797 CPC R25,R23
011B F478 BCC 0x012B
(0031) {
(0032) temp=data/1000;
011C EE28 LDI R18,0xE8
011D E033 LDI R19,3
011E 018B MOVW R16,R22
011F 940E0186 CALL div16u
0121 2F40 MOV R20,R16
(0033) display_one(0,temp);
0122 2F24 MOV R18,R20
0123 2700 CLR R16
0124 DFD4 RCALL _display_one
(0034) delay_ms(1); //是个经验值,刚好无闪烁,并且亮度较高
0125 E001 LDI R16,1
0126 E010 LDI R17,0
0127 940E00B4 CALL _delay_ms
(0035) led_contrl_port |= (1<<0);
0129 9AA8 SBI 0x15,0
(0036) }
012A C008 RJMP 0x0133
(0037) else
(0038) {
(0039) display_one(0,16);
012B E120 LDI R18,0x10
012C 2700 CLR R16
012D DFCB RCALL _display_one
(0040) delay_ms(1);
012E E001 LDI R16,1
012F E010 LDI R17,0
0130 940E00B4 CALL _delay_ms
(0041) led_contrl_port |= (1<<0);
0132 9AA8 SBI 0x15,0
(0042) }
(0043)
(0044) if(data>100) //百位
0133 E684 LDI R24,0x64
0134 E090 LDI R25,0
0135 1786 CP R24,R22
0136 0797 CPC R25,R23
0137 F498 BCC 0x014B
(0045) {
(0046) temp=(data%1000)/100;
0138 EE28 LDI R18,0xE8
0139 E033 LDI R19,3
013A 018B MOVW R16,R22
013B 940E0184 CALL mod16u
013D E624 LDI R18,0x64
013E E030 LDI R19,0
013F 940E0186 CALL div16u
0141 2F40 MOV R20,R16
(0047) display_one(1,temp);
0142 2F24 MOV R18,R20
0143 E001 LDI R16,1
0144 DFB4 RCALL _display_one
(0048) delay_ms(1);
0145 E001 LDI R16,1
0146 E010 LDI R17,0
0147 940E00B4 CALL _delay_ms
(0049) led_contrl_port |= (1<<1);
0149 9AA9 SBI 0x15,1
(0050) }
014A C008 RJMP 0x0153
(0051) else
(0052) {
(0053) display_one(1,16);
014B E120 LDI R18,0x10
014C E001 LDI R16,1
014D DFAB RCALL _display_one
(0054) delay_ms(1);
014E E001 LDI R16,1
014F E010 LDI R17,0
0150 940E00B4 CALL _delay_ms
(0055) led_contrl_port |= (1<<1);
0152 9AA9 SBI 0x15,1
(0056) }
(0057)
(0058) if(data>10) //十位
0153 E08A LDI R24,0xA
0154 E090 LDI R25,0
0155 1786 CP R24,R22
0156 0797 CPC R25,R23
0157 F498 BCC 0x016B
(0059) {
(0060) temp=(data%100)/10;
0158 E624 LDI R18,0x64
0159 E030 LDI R19,0
015A 018B MOVW R16,R22
015B 940E0184 CALL mod16u
015D E02A LDI R18,0xA
015E E030 LDI R19,0
015F 940E0186 CALL div16u
0161 2F40 MOV R20,R16
(0061) display_one(2,temp);
0162 2F24 MOV R18,R20
0163 E002 LDI R16,2
0164 DF94 RCALL _display_one
(0062) delay_ms(1);
0165 E001 LDI R16,1
0166 E010 LDI R17,0
0167 940E00B4 CALL _delay_ms
(0063) led_contrl_port |= (1<<2);
0169 9AAA SBI 0x15,2
(0064) }
016A C008 RJMP 0x0173
(0065) else
(0066) {
(0067) display_one(2,16);
016B E120 LDI R18,0x10
016C E002 LDI R16,2
016D DF8B RCALL _display_one
(0068) delay_ms(1);
016E E001 LDI R16,1
016F E010 LDI R17,0
0170 940E00B4 CALL _delay_ms
(0069) led_contrl_port |= (1<<2);
0172 9AAA SBI 0x15,2
(0070) }
(0071) //个位
(0072) temp=data%10;
0173 E02A LDI R18,0xA
0174 E030 LDI R19,0
0175 018B MOVW R16,R22
0176 940E0184 CALL mod16u
0178 2F40 MOV R20,R16
(0073) display_one(3,temp);
0179 2F24 MOV R18,R20
017A E003 LDI R16,3
017B DF7D RCALL _display_one
(0074) delay_ms(1);
017C E001 LDI R16,1
017D E010 LDI R17,0
017E 940E00B4 CALL _delay_ms
(0075) led_contrl_port |= (1<<3);
FILE: <library>
0180 9AAB SBI 0x15,3
0181 940E01A0 CALL pop_gset2
0183 9508 RET
mod16u:
0184 9468 BSET 6
0185 C001 RJMP xdiv16u
div16u:
0186 94E8 BCLR 6
xdiv16u:
0187 92EA ST R14,-Y
0188 92FA ST R15,-Y
0189 938A ST R24,-Y
018A 24EE CLR R14
018B 24FF CLR R15
018C E180 LDI R24,0x10
018D 0F00 LSL R16
018E 1F11 ROL R17
018F 1CEE ROL R14
0190 1CFF ROL R15
0191 16E2 CP R14,R18
0192 06F3 CPC R15,R19
0193 F018 BCS 0x0197
0194 1AE2 SUB R14,R18
0195 0AF3 SBC R15,R19
0196 9503 INC R16
0197 958A DEC R24
0198 F7A1 BNE 0x018D
0199 F416 BRTC 0x019C
019A 2D0E MOV R16,R14
019B 2D1F MOV R17,R15
019C 9189 LD R24,Y+
019D 90F9 LD R15,Y+
019E 90E9 LD R14,Y+
019F 9508 RET
pop_gset2:
01A0 E0E2 LDI R30,2
01A1 940C01AF JMP pop
push_gset5:
01A3 92FA ST R15,-Y
01A4 92EA ST R14,-Y
push_gset4:
01A5 92DA ST R13,-Y
01A6 92CA ST R12,-Y
push_gset3:
01A7 92BA ST R11,-Y
01A8 92AA ST R10,-Y
push_gset2:
01A9 937A ST R23,-Y
01AA 936A ST R22,-Y
push_gset1:
01AB 935A ST R21,-Y
01AC 934A ST R20,-Y
01AD 9508 RET
pop_gset1:
01AE E0E1 LDI R30,1
pop:
01AF 9149 LD R20,Y+
01B0 9159 LD R21,Y+
01B1 FDE0 SBRC R30,0
01B2 9508 RET
01B3 9169 LD R22,Y+
01B4 9179 LD R23,Y+
01B5 FDE1 SBRC R30,1
01B6 9508 RET
01B7 90A9 LD R10,Y+
01B8 90B9 LD R11,Y+
01B9 FDE2 SBRC R30,2
01BA 9508 RET
01BB 90C9 LD R12,Y+
01BC 90D9 LD R13,Y+
01BD FDE3 SBRC R30,3
01BE 9508 RET
01BF 90E9 LD R14,Y+
01C0 90F9 LD R15,Y+
01C1 9508 RET
lsl8:
01C2 2311 TST R17
01C3 F019 BEQ 0x01C7
01C4 0F00 LSL R16
01C5 951A DEC R17
01C6 CFFB RJMP lsl8
01C7 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -