📄 count.lst
字号:
__start:
__text_start:
003B E5CF LDI R28,0x5F
003C E0D4 LDI R29,4
003D BFCD OUT 0x3D,R28
003E BFDE OUT 0x3E,R29
003F 51C0 SUBI R28,0x10
0040 40D0 SBCI R29,0
0041 EA0A LDI R16,0xAA
0042 8308 STD Y+0,R16
0043 2400 CLR R0
0044 E6E0 LDI R30,0x60
0045 E0F0 LDI R31,0
0046 E010 LDI R17,0
0047 36E3 CPI R30,0x63
0048 07F1 CPC R31,R17
0049 F011 BEQ 0x004C
004A 9201 ST R0,Z+
004B CFFB RJMP 0x0047
004C 8300 STD Z+0,R16
004D E7E6 LDI R30,0x76
004E E0F0 LDI R31,0
004F E6A0 LDI R26,0x60
0050 E0B0 LDI R27,0
0051 E010 LDI R17,0
0052 37E6 CPI R30,0x76
0053 07F1 CPC R31,R17
0054 F021 BEQ 0x0059
0055 95C8 LPM
0056 9631 ADIW R30,1
0057 920D ST R0,X+
0058 CFF9 RJMP 0x0052
0059 940E00FF CALL _main
_exit:
005B CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\count\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:
005C EF8F LDI R24,0xFF
005D BB8A OUT 0x1A,R24
(0008) led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
005E B384 IN R24,0x14
005F 608F ORI R24,0xF
0060 BB84 OUT 0x14,R24
0061 9508 RET
_display_one:
data --> R22
count --> R20
0062 940E01C5 CALL push_gset2
0064 2F62 MOV R22,R18
0065 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]; //显示的数
0066 E082 LDI R24,2
0067 9F86 MUL R24,R22
0068 01F0 MOVW R30,R0
0069 E584 LDI R24,0x54
006A E090 LDI R25,0
006B 0FE8 ADD R30,R24
006C 1FF9 ADC R31,R25
006D 9005 LPM R0,Z+
006E 9014 LPM R1,0(Z)
006F 01F0 MOVW R30,R0
0070 BBEB OUT 0x1B,R30
(0018) led_contrl_port &= ~(1<<count); //选中对应要显示的位,从右至左,0123
0071 E001 LDI R16,1
0072 2F14 MOV R17,R20
0073 940E01DE CALL lsl8
0075 2E20 MOV R2,R16
0076 9420 COM R2
0077 B235 IN R3,0x15
0078 2032 AND R3,R2
0079 BA35 OUT 0x15,R3
007A 940E01BC CALL pop_gset2
007C 9508 RET
_display:
temp --> R20
data --> R22
007D 940E01C5 CALL push_gset2
007F 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) //千位
0080 EE88 LDI R24,0xE8
0081 E093 LDI R25,3
0082 1786 CP R24,R22
0083 0797 CPC R25,R23
0084 F478 BCC 0x0094
(0031) {
(0032) temp=data/1000;
0085 EE28 LDI R18,0xE8
0086 E033 LDI R19,3
0087 018B MOVW R16,R22
0088 940E01A2 CALL div16u
008A 2F40 MOV R20,R16
(0033) display_one(0,temp);
008B 2F24 MOV R18,R20
008C 2700 CLR R16
008D DFD4 RCALL _display_one
(0034) delay_ms(1); //是个经验值,刚好无闪烁,并且亮度较高
008E E001 LDI R16,1
008F E010 LDI R17,0
0090 940E0161 CALL _delay_ms
(0035) led_contrl_port |= (1<<0);
0092 9AA8 SBI 0x15,0
(0036) }
0093 C008 RJMP 0x009C
(0037) else
(0038) {
(0039) display_one(0,16);
0094 E120 LDI R18,0x10
0095 2700 CLR R16
0096 DFCB RCALL _display_one
(0040) delay_ms(1);
0097 E001 LDI R16,1
0098 E010 LDI R17,0
0099 940E0161 CALL _delay_ms
(0041) led_contrl_port |= (1<<0);
009B 9AA8 SBI 0x15,0
(0042) }
(0043)
(0044) if(data>100) //百位
009C E684 LDI R24,0x64
009D E090 LDI R25,0
009E 1786 CP R24,R22
009F 0797 CPC R25,R23
00A0 F498 BCC 0x00B4
(0045) {
(0046) temp=(data%1000)/100;
00A1 EE28 LDI R18,0xE8
00A2 E033 LDI R19,3
00A3 018B MOVW R16,R22
00A4 940E01A0 CALL mod16u
00A6 E624 LDI R18,0x64
00A7 E030 LDI R19,0
00A8 940E01A2 CALL div16u
00AA 2F40 MOV R20,R16
(0047) display_one(1,temp);
00AB 2F24 MOV R18,R20
00AC E001 LDI R16,1
00AD DFB4 RCALL _display_one
(0048) delay_ms(1);
00AE E001 LDI R16,1
00AF E010 LDI R17,0
00B0 940E0161 CALL _delay_ms
(0049) led_contrl_port |= (1<<1);
00B2 9AA9 SBI 0x15,1
(0050) }
00B3 C008 RJMP 0x00BC
(0051) else
(0052) {
(0053) display_one(1,16);
00B4 E120 LDI R18,0x10
00B5 E001 LDI R16,1
00B6 DFAB RCALL _display_one
(0054) delay_ms(1);
00B7 E001 LDI R16,1
00B8 E010 LDI R17,0
00B9 940E0161 CALL _delay_ms
(0055) led_contrl_port |= (1<<1);
00BB 9AA9 SBI 0x15,1
(0056) }
(0057)
(0058) if(data>10) //十位
00BC E08A LDI R24,0xA
00BD E090 LDI R25,0
00BE 1786 CP R24,R22
00BF 0797 CPC R25,R23
00C0 F498 BCC 0x00D4
(0059) {
(0060) temp=(data%100)/10;
00C1 E624 LDI R18,0x64
00C2 E030 LDI R19,0
00C3 018B MOVW R16,R22
00C4 940E01A0 CALL mod16u
00C6 E02A LDI R18,0xA
00C7 E030 LDI R19,0
00C8 940E01A2 CALL div16u
00CA 2F40 MOV R20,R16
(0061) display_one(2,temp);
00CB 2F24 MOV R18,R20
00CC E002 LDI R16,2
00CD DF94 RCALL _display_one
(0062) delay_ms(1);
00CE E001 LDI R16,1
00CF E010 LDI R17,0
00D0 940E0161 CALL _delay_ms
(0063) led_contrl_port |= (1<<2);
00D2 9AAA SBI 0x15,2
(0064) }
00D3 C008 RJMP 0x00DC
(0065) else
(0066) {
(0067) display_one(2,16);
00D4 E120 LDI R18,0x10
00D5 E002 LDI R16,2
00D6 DF8B RCALL _display_one
(0068) delay_ms(1);
00D7 E001 LDI R16,1
00D8 E010 LDI R17,0
00D9 940E0161 CALL _delay_ms
(0069) led_contrl_port |= (1<<2);
00DB 9AAA SBI 0x15,2
(0070) }
(0071) //个位
(0072) temp=data%10;
00DC E02A LDI R18,0xA
00DD E030 LDI R19,0
00DE 018B MOVW R16,R22
00DF 940E01A0 CALL mod16u
00E1 2F40 MOV R20,R16
(0073) display_one(3,temp);
00E2 2F24 MOV R18,R20
00E3 E003 LDI R16,3
00E4 DF7D RCALL _display_one
(0074) delay_ms(1);
00E5 E001 LDI R16,1
00E6 E010 LDI R17,0
00E7 940E0161 CALL _delay_ms
(0075) led_contrl_port |= (1<<3);
00E9 9AAB SBI 0x15,3
00EA 940E01BC CALL pop_gset2
00EC 9508 RET
_int0_isr:
00ED 938A ST R24,-Y
00EE B78F IN R24,0x3F
00EF 938A ST R24,-Y
FILE: C:\DOCUME~1\Administrator\桌面\count\main.c
(0001)
(0002) #include "config.h"
(0003)
(0004) unsigned int i;
(0005) unsigned char flag;
(0006)
(0007) #pragma interrupt_handler int0_isr:2
(0008) void int0_isr(void)
(0009) {
(0010) flag = 1;
00F0 E081 LDI R24,1
00F1 93800060 STS flag,R24
00F3 9189 LD R24,Y+
00F4 BF8F OUT 0x3F,R24
00F5 9189 LD R24,Y+
00F6 9518 RETI
(0011) }
(0012)
(0013) void init_devices(void)
(0014) {
(0015) CLI(); //disable all interrupts
_init_devices:
00F7 94F8 BCLR 7
(0016) MCUCR = 0x00;
00F8 2422 CLR R2
00F9 BE25 OUT 0x35,R2
(0017) GICR = 0x40;
00FA E480 LDI R24,0x40
00FB BF8B OUT 0x3B,R24
(0018) TIMSK = 0x00; //timer interrupt sources
00FC BE29 OUT 0x39,R2
(0019) SEI(); //re-enable interrupts
00FD 9478 BSET 7
00FE 9508 RET
(0020) }
(0021)
(0022) void main(void)
(0023) {
(0024) led_init();
_main:
00FF 940E005C CALL _led_init
(0025) init_devices();
0101 DFF5 RCALL _init_devices
0102 C01A RJMP 0x011D
(0026)
(0027) while(1)
(0028) {
(0029) if(flag==1)
0103 91800060 LDS R24,flag
0105 3081 CPI R24,1
0106 F449 BNE 0x0110
(0030) i++;
0107 91800061 LDS R24,i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -