📄 led.lst
字号:
__text_start:
__start:
0056 E5CF LDI R28,0x5F
0057 E0D4 LDI R29,4
0058 BFCD OUT 0x3D,R28
0059 BFDE OUT 0x3E,R29
005A 51C0 SUBI R28,0x10
005B 40D0 SBCI R29,0
005C EA0A LDI R16,0xAA
005D 8308 STD Y+0,R16
005E 2400 CLR R0
005F E6E0 LDI R30,0x60
0060 E0F0 LDI R31,0
0061 E010 LDI R17,0
0062 36E0 CPI R30,0x60
0063 07F1 CPC R31,R17
0064 F011 BEQ 0x0067
0065 9201 ST R0,Z+
0066 CFFB RJMP 0x0062
0067 8300 STD Z+0,R16
0068 EAEC LDI R30,0xAC
0069 E0F0 LDI R31,0
006A E6A0 LDI R26,0x60
006B E0B0 LDI R27,0
006C E010 LDI R17,0
006D 3AEC CPI R30,0xAC
006E 07F1 CPC R31,R17
006F F021 BEQ 0x0074
0070 95C8 LPM
0071 9631 ADIW R30,1
0072 920D ST R0,X+
0073 CFF9 RJMP 0x006D
0074 940E00A0 CALL _main
_exit:
0076 CFFF RJMP _exit
_display:
row --> R20
num --> R22
0077 940E014C CALL push_gset2
0079 2F42 MOV R20,R18
007A 2F60 MOV R22,R16
FILE: C:\DOCUME~1\administrator\桌面\教程\8x8led\main.c
(0001)
(0002) /*********************************************
(0003) 显示向左的箭头
(0004) Chip type : ATmega16
(0005) *********************************************/
(0006) #include <iom16v.h>
(0007) #include "delay.h"
(0008) const unsigned char char_7[][8]={
(0009) {0x00,0x00,0x7c,0x82,0x82,0x7c,0x00,0x00},//0
(0010) {0x00,0x00,0x00,0x84,0xfe,0x80,0x00,0x00},//1
(0011) //{0x00,0x00,0xf2,0x92,0x92,0x9e,0x00,0x00},//正2
(0012) {0x00,0x00,0xc4,0xa2,0x92,0x8c,0x00,0x00},//2
(0013) {0x00,0x00,0x44,0x92,0x92,0x6c,0x00,0x00},//3
(0014) //{0x00,0x00,0x92,0x92,0x92,0xfe,0x00,0x00},//正3
(0015) {0x00,0x00,0x18,0x14,0xfe,0x10,0x00,0x00},//4
(0016) {0x00,0x00,0x9e,0x94,0x94,0x64,0x00,0x00},//5
(0017) {0x00,0x00,0x7c,0x92,0x92,0x64,0x00,0x00},//6
(0018) {0x00,0x00,0x02,0xf2,0x0a,0x06,0x00,0x00},//7
(0019) {0x00,0x00,0x6c,0x92,0x92,0x6c,0x00,0x00},//8
(0020) {0x00,0x00,0x4c,0x92,0x92,0x7c,0x00,0x00},//9
(0021) {0x10,0x38,0x7C,0xFE,0x38,0x38,0x38,0x38},//向左箭头
(0022) };
(0023)
(0024) void display(unsigned char num,char row)
(0025) {
(0026) if(row>7)//容错处理
007B E087 LDI R24,7
007C 1784 CP R24,R20
007D F428 BCC 0x0083
(0027) {
(0028) PORTA = 0XFF;
007E EF8F LDI R24,0xFF
007F BB8B OUT 0x1B,R24
(0029) PORTB = 0X81; //显示中间6排
0080 E881 LDI R24,0x81
0081 BB88 OUT 0x18,R24
(0030) }
0082 C01A RJMP 0x009D
(0031) else
(0032) {
(0033) PORTA = char_7[num][row];
0083 E088 LDI R24,0x8
0084 9F86 MUL R24,R22
0085 0110 MOVW R2,R0
0086 E584 LDI R24,0x54
0087 E090 LDI R25,0
0088 0E28 ADD R2,R24
0089 1E39 ADC R3,R25
008A 2FE4 MOV R30,R20
008B 27FF CLR R31
008C 0DE2 ADD R30,R2
008D 1DF3 ADC R31,R3
008E 91E4 LPM R30,0(Z)
008F BBEB OUT 0x1B,R30
(0034) PORTB = ~(1<<row);
0090 E001 LDI R16,1
0091 2F14 MOV R17,R20
0092 940E0165 CALL lsl8
0094 2E20 MOV R2,R16
0095 9420 COM R2
0096 BA28 OUT 0x18,R2
(0035) delay_ms(2);
0097 E002 LDI R16,2
0098 E010 LDI R17,0
0099 940E0104 CALL _delay_ms
(0036) PORTB = 0xFF;
009B EF8F LDI R24,0xFF
009C BB88 OUT 0x18,R24
(0037) }
009D 940E0143 CALL pop_gset2
009F 9508 RET
(0038) }
(0039)
(0040)
(0041) void main(void)
(0042) {
(0043) char number=0,i = 0;
_main:
time_counter --> R20
number --> R22
i --> R10
00A0 2766 CLR R22
00A1 24AA CLR R10
(0044) int time_counter=0;
00A2 2744 CLR R20
00A3 2755 CLR R21
(0045) PORTA=0xFF;
00A4 EF8F LDI R24,0xFF
00A5 BB8B OUT 0x1B,R24
(0046) DDRA=0xFF;
00A6 BB8A OUT 0x1A,R24
(0047) PORTB=0x00;
00A7 2422 CLR R2
00A8 BA28 OUT 0x18,R2
(0048) DDRB=0xFF;
00A9 BB87 OUT 0x17,R24
00AA C015 RJMP 0x00C0
(0049)
(0050) //delay_1s(); //全亮一秒
(0051)
(0052) while (1)
(0053) {
(0054)
(0055) for(i=0;i<8;i++)
00AB 24AA CLR R10
00AC C004 RJMP 0x00B1
(0056) {
(0057) display(number,i);
00AD 2D2A MOV R18,R10
00AE 2F06 MOV R16,R22
00AF DFC7 RCALL _display
00B0 94A3 INC R10
00B1 2D8A MOV R24,R10
00B2 3088 CPI R24,0x8
00B3 F3C8 BCS 0x00AD
(0058) }
(0059)
(0060) time_counter++;
00B4 5F4F SUBI R20,0xFF
00B5 4F5F SBCI R21,0xFF
(0061) if(time_counter==100)
00B6 3644 CPI R20,0x64
00B7 E0E0 LDI R30,0
00B8 075E CPC R21,R30
00B9 F431 BNE 0x00C0
(0062) {
(0063) time_counter=0;
00BA 2744 CLR R20
00BB 2755 CLR R21
(0064) number++;
00BC 9563 INC R22
(0065) if(number==11) number=0; //加到九返回零
00BD 306B CPI R22,0xB
00BE F409 BNE 0x00C0
00BF 2766 CLR R22
00C0 CFEA RJMP 0x00AB
00C1 9508 RET
FILE: C:\DOCUME~1\administrator\桌面\教程\8x8led\delay.c
(0001) /****************************
(0002) ** file_name delay.c **
(0003) ** describe 软件延时函数 **
(0004) ** auther 古欣 **
(0005) ** Time 2007-1-31 **
(0006) *****************************/
(0007) #include "delay.h"
(0008) /***********************
(0009) ** 8M晶振下 1us
(0010) ** 也可以宏定义 8个asm("nop");
(0011) ** #define delay_1us asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
(0012) ***********************/
(0013) void delay_1us(void)
(0014) {
(0015) asm("nop");
_delay_1us:
00C2 0000 NOP
00C3 9508 RET
(0016) }
(0017)
(0018) /***********************
(0019) **8M时为 1000.25us
(0020) **4M时为 999.5us
(0021) **xtal 为晶振频率,单位为Mhz
(0022) ************************/
(0023) void delay_1ms(void)
(0024) {
(0025) unsigned int i;
(0026) for(i=(xtal*143-2);i>0;i--)
_delay_1ms:
i --> R16
00C4 E706 LDI R16,0x76
00C5 E014 LDI R17,4
00C6 C002 RJMP 0x00C9
00C7 5001 SUBI R16,1
00C8 4010 SBCI R17,0
00C9 3000 CPI R16,0
00CA 0701 CPC R16,R17
00CB F7D9 BNE 0x00C7
00CC 9508 RET
_delay_1s:
i --> R20
00CD 940E014E CALL push_gset1
(0027) ;
(0028) }
(0029)
(0030) /***********************
(0031) ** 1S延时,误差可能稍大
(0032) ** 250ms*4=1000ms
(0033) ************************/
(0034) void delay_1s(void)
(0035) {
(0036) unsigned int i;
(0037) for(i=250;i>0;i--) //250ms*4=1000ms
00CF EF4A LDI R20,0xFA
00D0 E050 LDI R21,0
00D1 C003 RJMP 0x00D5
(0038) delay_1ms();
00D2 DFF1 RCALL _delay_1ms
00D3 5041 SUBI R20,1
00D4 4050 SBCI R21,0
00D5 3040 CPI R20,0
00D6 0745 CPC R20,R21
00D7 F7D1 BNE 0x00D2
(0039) for(i=250;i>0;i--)
00D8 EF4A LDI R20,0xFA
00D9 E050 LDI R21,0
00DA C003 RJMP 0x00DE
(0040) delay_1ms();
00DB DFE8 RCALL _delay_1ms
00DC 5041 SUBI R20,1
00DD 4050 SBCI R21,0
00DE 3040 CPI R20,0
00DF 0745 CPC R20,R21
00E0 F7D1 BNE 0x00DB
(0041) for(i=250;i>0;i--)
00E1 EF4A LDI R20,0xFA
00E2 E050 LDI R21,0
00E3 C003 RJMP 0x00E7
(0042) delay_1ms();
00E4 DFDF RCALL _delay_1ms
00E5 5041 SUBI R20,1
00E6 4050 SBCI R21,0
00E7 3040 CPI R20,0
00E8 0745 CPC R20,R21
00E9 F7D1 BNE 0x00E4
(0043) for(i=250;i>0;i--)
00EA EF4A LDI R20,0xFA
00EB E050 LDI R21,0
00EC C003 RJMP 0x00F0
(0044) delay_1ms();
00ED DFD6 RCALL _delay_1ms
00EE 5041 SUBI R20,1
00EF 4050 SBCI R21,0
00F0 3040 CPI R20,0
00F1 0745 CPC R20,R21
00F2 F7D1 BNE 0x00ED
00F3 940E0151 CALL pop_gset1
00F5 9508 RET
_delay_us:
i --> R20
n --> R22
00F6 940E014C CALL push_gset2
00F8 01B8 MOVW R22,R16
(0045) }
(0046)
(0047) /***********************
(0048) **微秒级延时
(0049) ************************/
(0050) void delay_us(unsigned int n)
(0051) {
(0052) unsigned int i;
(0053) for(i=n;i>0;i--)
00F9 01AB MOVW R20,R22
00FA C003 RJMP 0x00FE
(0054) delay_1us();
00FB DFC6 RCALL _delay_1us
00FC 5041 SUBI R20,1
00FD 4050 SBCI R21,0
00FE 3040 CPI R20,0
00FF 0745 CPC R20,R21
0100 F7D1 BNE 0x00FB
0101 940E0143 CALL pop_gset2
0103 9508 RET
_delay_ms:
i --> R20
n --> R22
0104 940E014C CALL push_gset2
0106 01B8 MOVW R22,R16
(0055) }
(0056)
(0057) /***********************
(0058) **毫秒级延时
(0059) ************************/
(0060) void delay_ms(unsigned int n)
(0061) {
(0062) unsigned int i;
(0063) for(i=n;i>0;i--)
0107 01AB MOVW R20,R22
0108 C003 RJMP 0x010C
(0064) delay_1ms();
0109 DFBA RCALL _delay_1ms
010A 5041 SUBI R20,1
010B 4050 SBCI R21,0
010C 3040 CPI R20,0
010D 0745 CPC R20,R21
010E F7D1 BNE 0x0109
010F 940E0143 CALL pop_gset2
0111 9508 RET
_delay_s:
j --> R20
i --> R22
n --> R22
0112 940E014C CALL push_gset2
0114 01B8 MOVW R22,R16
(0065) }
(0066)
(0067) /***********************
(0068) **秒级延时,太浪费资源,不建议使用
(0069) ************************/
(0070) void delay_s(unsigned int n)
(0071) {
(0072) unsigned int i,j;
(0073) for(j=n;j>0;j--)
0115 01AB MOVW R20,R22
0116 C026 RJMP 0x013D
(0074) {
(0075) for(i=250;i>0;i--) //250ms*4=1000ms
0117 EF6A LDI R22,0xFA
0118 E070 LDI R23,0
0119 C003 RJMP 0x011D
(0076) delay_1ms();
011A DFA9 RCALL _delay_1ms
011B 5061 SUBI R22,1
011C 4070 SBCI R23,0
011D 3060 CPI R22,0
011E 0767 CPC R22,R23
011F F7D1 BNE 0x011A
(0077) for(i=250;i>0;i--)
0120 EF6A LDI R22,0xFA
0121 E070 LDI R23,0
0122 C003 RJMP 0x0126
(0078) delay_1ms();
0123 DFA0 RCALL _delay_1ms
0124 5061 SUBI R22,1
0125 4070 SBCI R23,0
0126 3060 CPI R22,0
0127 0767 CPC R22,R23
0128 F7D1 BNE 0x0123
(0079) for(i=250;i>0;i--)
0129 EF6A LDI R22,0xFA
012A E070 LDI R23,0
012B C003 RJMP 0x012F
(0080) delay_1ms();
012C DF97 RCALL _delay_1ms
012D 5061 SUBI R22,1
012E 4070 SBCI R23,0
012F 3060 CPI R22,0
0130 0767 CPC R22,R23
0131 F7D1 BNE 0x012C
(0081) for(i=250;i>0;i--)
0132 EF6A LDI R22,0xFA
0133 E070 LDI R23,0
0134 C003 RJMP 0x0138
(0082) delay_1ms();
FILE: <library>
0135 DF8E RCALL _delay_1ms
0136 5061 SUBI R22,1
0137 4070 SBCI R23,0
0138 3060 CPI R22,0
0139 0767 CPC R22,R23
013A F7D1 BNE 0x0135
013B 5041 SUBI R20,1
013C 4050 SBCI R21,0
013D 3040 CPI R20,0
013E 0745 CPC R20,R21
013F F6B9 BNE 0x0117
0140 940E0143 CALL pop_gset2
0142 9508 RET
pop_gset2:
0143 E0E2 LDI R30,2
0144 940C0152 JMP pop
push_gset5:
0146 92FA ST R15,-Y
0147 92EA ST R14,-Y
push_gset4:
0148 92DA ST R13,-Y
0149 92CA ST R12,-Y
push_gset3:
014A 92BA ST R11,-Y
014B 92AA ST R10,-Y
push_gset2:
014C 937A ST R23,-Y
014D 936A ST R22,-Y
push_gset1:
014E 935A ST R21,-Y
014F 934A ST R20,-Y
0150 9508 RET
pop_gset1:
0151 E0E1 LDI R30,1
pop:
0152 9149 LD R20,Y+
0153 9159 LD R21,Y+
0154 FDE0 SBRC R30,0
0155 9508 RET
0156 9169 LD R22,Y+
0157 9179 LD R23,Y+
0158 FDE1 SBRC R30,1
0159 9508 RET
015A 90A9 LD R10,Y+
015B 90B9 LD R11,Y+
015C FDE2 SBRC R30,2
015D 9508 RET
015E 90C9 LD R12,Y+
015F 90D9 LD R13,Y+
0160 FDE3 SBRC R30,3
0161 9508 RET
0162 90E9 LD R14,Y+
0163 90F9 LD R15,Y+
0164 9508 RET
lsl8:
0165 2311 TST R17
0166 F019 BEQ 0x016A
0167 0F00 LSL R16
0168 951A DEC R17
0169 CFFB RJMP lsl8
016A 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -