📄 m16int.lst
字号:
(0048) 返 回 值: 无
(0049) -----------------------------------------------------------------*/
(0050) void SPIMasterInit(void)
(0051) {
(0052) // MOSI,MISO,SCK等都需要设计的数据方向定义
(0053) DDRB |= (1<<PB5) | (1<<PB7); // 设置MOSI 和SCK 为输出,其他为输入 M16
_SPIMasterInit:
009D B387 IN R24,0x17
009E 6A80 ORI R24,0xA0
009F BB87 OUT 0x17,R24
(0054) // DDRB |= (1<<PB2) | (1<<PB3); // 设置MOSI 和SCK 为输出,其他为输入 M64
(0055) // SPI控制寄存器
(0056) // SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
(0057) // SPIE 中断使能 SPE SPI使能 DORD 数据次序 1为LSB首先发送,0为MSB首先发送
(0058) // MSTR 主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
(0059) // SS配置为输入,但被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新设置
(0060) // MSTR 进入主机模式。
(0061) // CPOL: 时钟极性见ATMEGA16L(中文)P130
(0062) // CPHA: 时钟相位
(0063) // SPR1, SPR0: SPI 时钟速率选择1 与0 SPR1 和SPR0 对从机没有影响。
(0064) // 使能SPI 主机模式,设置时钟速率为fck/128 */
(0065) SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);
00A0 E583 LDI R24,0x53
00A1 B98D OUT 0x0D,R24
00A2 9508 RET
(0066) }
(0067) /*-----------------------------------------------------------------
(0068) 函数名称: void SPIMasterTransmit(unsigned char i)
(0069) 函数功能: SPI数据发送
(0070) 参 数:
(0071) 返 回 值: 无
(0072) -----------------------------------------------------------------*/
(0073) void SPIMasterTransmit(uchar TranData)
(0074) {
(0075) SPDR = TranData; // 启动数据传输
_SPIMasterTransmit:
TranData --> R16
00A3 B90F OUT 0x0F,R16
(0076) while (!(SPSR & (1<<SPIF))); // 等待传输结束
00A4 9B77 SBIS 0x0E,7
00A5 CFFE RJMP 0x00A4
00A6 9508 RET
_SPI595Out:
i --> R20
00A7 940E0168 CALL push_gset1
00A9 2F40 MOV R20,R16
(0077) }
(0078) /*-----------------------------------------------------------------
(0079) 函数名称: void SPI595Out(unsigned char i)
(0080) 函数功能: 通过74HC595输出数据
(0081) 参 数:
(0082) 返 回 值: 无
(0083) -----------------------------------------------------------------*/
(0084) void SPI595Out(unsigned char i)
(0085) {
(0086) PORTB &= ~(1 << 4); //准备锁存
00AA 98C4 CBI 0x18,4
(0087) SPIMasterTransmit(i);
00AB 2F04 MOV R16,R20
00AC DFF6 RCALL _SPIMasterTransmit
(0088) PORTB |= (1 << 4); //锁存数据
00AD 9AC4 SBI 0x18,4
00AE 940E016B CALL pop_gset1
00B0 9508 RET
(0089) }
(0090) /*-----------------------------------------------------------------
(0091) 函数名称: void InitDevices(void)
(0092) 函数功能: 初始化各种信息
(0093) 参 数:
(0094) 返 回 值: 无
(0095) -----------------------------------------------------------------*/
(0096) void InitDevices(void)
(0097) {
(0098) CLI(); //关全部中断
_InitDevices:
00B1 94F8 BCLR 7
(0099) SPIMasterInit(); //SPI初始化为主机
00B2 DFEA RCALL _SPIMasterInit
(0100)
(0101) MCUCR = 0x02; //中断0,下降沿触发
00B3 E082 LDI R24,2
00B4 BF85 OUT 0x35,R24
(0102) GICR = 0x40; //开中断0,
00B5 E480 LDI R24,0x40
00B6 BF8B OUT 0x3B,R24
(0103) SEI(); //开中断
00B7 9478 BSET 7
00B8 9508 RET
(0104) }
(0105)
(0106) void main(void)
(0107) {
(0108) uchar temp;
(0109) DDRA = 0x00; //方向输入
_main:
temp --> R20
00B9 2422 CLR R2
00BA BA2A OUT 0x1A,R2
(0110) PORTA = 0xFF; //打开上拉
00BB EF8F LDI R24,0xFF
00BC BB8B OUT 0x1B,R24
(0111) DDRB = 0xFF; //方向输出
00BD BB87 OUT 0x17,R24
(0112) PORTB = 0xF0; //电平设置
00BE EF80 LDI R24,0xF0
00BF BB88 OUT 0x18,R24
(0113) DDRC = 0x00;
00C0 BA24 OUT 0x14,R2
(0114) PORTC = 0xFF;
00C1 EF8F LDI R24,0xFF
00C2 BB85 OUT 0x15,R24
(0115) DDRD = 0xFF;
00C3 BB81 OUT 0x11,R24
(0116) PORTD = 0xFF;
00C4 BB82 OUT 0x12,R24
(0117) InitDevices();
00C5 DFEB RCALL _InitDevices
00C6 C07F RJMP 0x0146
(0118) while (1)
(0119) {
(0120) if( IntCnt > 9)
00C7 E089 LDI R24,0x9
00C8 90200060 LDS R2,IntCnt
00CA 1582 CP R24,R2
00CB F008 BCS 0x00CD
00CC C06A RJMP 0x0137
(0121) {
(0122) if( IntCnt > 99)
00CD E683 LDI R24,0x63
00CE 1582 CP R24,R2
00CF F008 BCS 0x00D1
00D0 C03E RJMP 0x010F
(0123) {
(0124) DDRB = 0xff;
00D1 EF8F LDI R24,0xFF
00D2 BB87 OUT 0x17,R24
(0125) PORTB = 0xff;
00D3 BB88 OUT 0x18,R24
(0126) temp = IntCnt / 100;
00D4 E614 LDI R17,0x64
00D5 2D02 MOV R16,R2
00D6 940E014A CALL div8u
00D8 2F40 MOV R20,R16
(0127) SPI595Out(disp[temp]);
00D9 E681 LDI R24,0x61
00DA E090 LDI R25,0
00DB 2FE4 MOV R30,R20
00DC 27FF CLR R31
00DD 0FE8 ADD R30,R24
00DE 1FF9 ADC R31,R25
00DF 8100 LDD R16,Z+0
00E0 DFC6 RCALL _SPI595Out
(0128) PORTB = 0xfb;
00E1 EF8B LDI R24,0xFB
00E2 BB88 OUT 0x18,R24
(0129) DelayMs(1);
00E3 E001 LDI R16,1
00E4 DFA7 RCALL _DelayMs
(0130) PORTB = 0xff;
00E5 EF8F LDI R24,0xFF
00E6 BB88 OUT 0x18,R24
(0131) temp = IntCnt%100/10;
00E7 E614 LDI R17,0x64
00E8 91000060 LDS R16,IntCnt
00EA 940E0148 CALL mod8u
00EC E01A LDI R17,0xA
00ED 940E014A CALL div8u
00EF 2F40 MOV R20,R16
(0132) SPI595Out(disp[temp]);
00F0 E681 LDI R24,0x61
00F1 E090 LDI R25,0
00F2 2FE4 MOV R30,R20
00F3 27FF CLR R31
00F4 0FE8 ADD R30,R24
00F5 1FF9 ADC R31,R25
00F6 8100 LDD R16,Z+0
00F7 DFAF RCALL _SPI595Out
(0133) PORTB = 0xfd;
00F8 EF8D LDI R24,0xFD
00F9 BB88 OUT 0x18,R24
(0134) DelayMs(1);
00FA E001 LDI R16,1
00FB DF90 RCALL _DelayMs
(0135) PORTB = 0xff;
00FC EF8F LDI R24,0xFF
00FD BB88 OUT 0x18,R24
(0136) temp = IntCnt%10;
00FE E01A LDI R17,0xA
00FF 91000060 LDS R16,IntCnt
0101 940E0148 CALL mod8u
0103 2F40 MOV R20,R16
(0137) SPI595Out(disp[temp]);
0104 E681 LDI R24,0x61
0105 E090 LDI R25,0
0106 2FE4 MOV R30,R20
0107 27FF CLR R31
0108 0FE8 ADD R30,R24
0109 1FF9 ADC R31,R25
010A 8100 LDD R16,Z+0
010B DF9B RCALL _SPI595Out
(0138) PORTB = 0xfe;
010C EF8E LDI R24,0xFE
010D BB88 OUT 0x18,R24
(0139) }
010E C035 RJMP 0x0144
(0140) else
(0141) {
(0142) DDRB = 0xff;
010F EF8F LDI R24,0xFF
0110 BB87 OUT 0x17,R24
(0143) PORTB = 0xff;
0111 BB88 OUT 0x18,R24
(0144) temp = IntCnt/10;
0112 E01A LDI R17,0xA
0113 91000060 LDS R16,IntCnt
0115 940E014A CALL div8u
0117 2F40 MOV R20,R16
(0145) SPI595Out(disp[temp]);
0118 E681 LDI R24,0x61
0119 E090 LDI R25,0
011A 2FE4 MOV R30,R20
011B 27FF CLR R31
011C 0FE8 ADD R30,R24
011D 1FF9 ADC R31,R25
011E 8100 LDD R16,Z+0
011F DF87 RCALL _SPI595Out
(0146) PORTB = 0xfd;
0120 EF8D LDI R24,0xFD
0121 BB88 OUT 0x18,R24
(0147) DelayMs(1);
0122 E001 LDI R16,1
0123 DF68 RCALL _DelayMs
(0148) PORTB = 0xff;
0124 EF8F LDI R24,0xFF
0125 BB88 OUT 0x18,R24
(0149) temp = IntCnt%10;
0126 E01A LDI R17,0xA
0127 91000060 LDS R16,IntCnt
0129 940E0148 CALL mod8u
012B 2F40 MOV R20,R16
(0150) SPI595Out(disp[temp]);
012C E681 LDI R24,0x61
012D E090 LDI R25,0
012E 2FE4 MOV R30,R20
012F 27FF CLR R31
0130 0FE8 ADD R30,R24
0131 1FF9 ADC R31,R25
0132 8100 LDD R16,Z+0
0133 DF73 RCALL _SPI595Out
(0151) PORTB = 0xfe;
0134 EF8E LDI R24,0xFE
0135 BB88 OUT 0x18,R24
(0152) }
(0153) }
0136 C00D RJMP 0x0144
(0154) else
(0155) {
(0156) DDRB = 0xff;
0137 EF8F LDI R24,0xFF
0138 BB87 OUT 0x17,R24
(0157) PORTB = 0xfe;
0139 EF8E LDI R24,0xFE
013A BB88 OUT 0x18,R24
(0158) SPI595Out(disp[IntCnt]);
013B E681 LDI R24,0x61
013C E090 LDI R25,0
013D 91E00060 LDS R30,IntCnt
013F 27FF CLR R31
0140 0FE8 ADD R30,R24
0141 1FF9 ADC R31,R25
0142 8100 LDD R16,Z+0
0143 DF63 RCALL _SPI595Out
(0159) }
(0160) DelayMs(1);
FILE: <library>
0144 E001 LDI R16,1
0145 DF46 RCALL _DelayMs
0146 CF80 RJMP 0x00C7
0147 9508 RET
mod8u:
0148 9468 BSET 6
0149 C001 RJMP xdiv8u
div8u:
014A 94E8 BCLR 6
xdiv8u:
014B 932A ST R18,-Y
014C 92FA ST R15,-Y
014D 92EA ST R14,-Y
014E 24FF CLR R15
014F 24EE CLR R14
0150 E120 LDI R18,0x10
0151 0F00 LSL R16
0152 1CFF ROL R15
0153 1CEE ROL R14
0154 16E1 CP R14,R17
0155 F010 BCS 0x0158
0156 1AE1 SUB R14,R17
0157 9503 INC R16
0158 952A DEC R18
0159 F7B9 BNE 0x0151
015A F40E BRTC 0x015C
015B 2D0E MOV R16,R14
015C 90E9 LD R14,Y+
015D 90F9 LD R15,Y+
015E 9129 LD R18,Y+
015F 9508 RET
push_gset5:
0160 92FA ST R15,-Y
0161 92EA ST R14,-Y
push_gset4:
0162 92DA ST R13,-Y
0163 92CA ST R12,-Y
push_gset3:
0164 92BA ST R11,-Y
0165 92AA ST R10,-Y
push_gset2:
0166 937A ST R23,-Y
0167 936A ST R22,-Y
push_gset1:
0168 935A ST R21,-Y
0169 934A ST R20,-Y
016A 9508 RET
pop_gset1:
016B E0E1 LDI R30,1
pop:
016C 9149 LD R20,Y+
016D 9159 LD R21,Y+
016E FDE0 SBRC R30,0
016F 9508 RET
0170 9169 LD R22,Y+
0171 9179 LD R23,Y+
0172 FDE1 SBRC R30,1
0173 9508 RET
0174 90A9 LD R10,Y+
0175 90B9 LD R11,Y+
0176 FDE2 SBRC R30,2
0177 9508 RET
0178 90C9 LD R12,Y+
0179 90D9 LD R13,Y+
017A FDE3 SBRC R30,3
017B 9508 RET
017C 90E9 LD R14,Y+
017D 90F9 LD R15,Y+
017E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -