📄 zhw.lst
字号:
0399 2422 CLR R2
039A BA27 OUT 0x17,R2
(0010)
(0011) PORTC = 0x00; //m103 output only
039B BA25 OUT 0x15,R2
(0012) DDRC = 0xFF;
039C BB84 OUT 0x14,R24
(0013)
(0014) PORTD = 0x7F;
039D E78F LDI R24,0x7F
039E BB82 OUT 0x12,R24
(0015) DDRD = 0x00;
039F BA21 OUT 0x11,R2
(0016)
(0017) DDRE = 0xFC;
03A0 EF8C LDI R24,0xFC
03A1 B982 OUT 0x02,R24
(0018) PORTE = 0x0B;
03A2 E08B LDI R24,0xB
03A3 B983 OUT 0x03,R24
(0019) DDRE = 0x00;
03A4 B822 OUT 0x02,R2
(0020)
(0021) PORTF = 0xFF;
03A5 EF8F LDI R24,0xFF
03A6 93800062 STS 0x62,R24
(0022) DDRF = 0x00;
03A8 92200061 STS 0x61,R2
(0023)
(0024) PORTG = 0x00;
03AA 92200065 STS 0x65,R2
(0025)
(0026) DDRB |= 0XFF; //PB.4/PB.5/PB.6按键输出
03AC B387 IN R24,0x17
03AD 6F8F ORI R24,0xFF
03AE BB87 OUT 0x17,R24
(0027)
(0028) DDRF |= 0xF0; //CS1~CS4 输出
03AF 91800061 LDS R24,0x61
03B1 6F80 ORI R24,0xF0
03B2 93800061 STS 0x61,R24
(0029) // DDRF &= 0xFE; //MIC输入
(0030)
(0031) DDRG |= 0x07; //ALE/RD/WE输出
03B4 91800064 LDS R24,0x64
03B6 6087 ORI R24,7
03B7 93800064 STS 0x64,R24
(0032) DDRG &= 0xE7; //DDRG.3,DDRG.4输入
03B9 91800064 LDS R24,0x64
03BB 7E87 ANDI R24,0xE7
03BC 93800064 STS 0x64,R24
(0033)
(0034) DDRD |= 0x70; //LCD_RS/LCD_RST/LCD_CS输出
03BE B381 IN R24,0x11
03BF 6780 ORI R24,0x70
03C0 BB81 OUT 0x11,R24
(0035) DDRD |= 0X01; //SCK I2C时钟线输出
03C1 9A88 SBI 0x11,0
(0036) DDRD |= 0X08; //OE 输出0
03C2 9A8B SBI 0x11,3
(0037)
(0038) DDRD |= 0x80; //A16输出0
03C3 9A8F SBI 0x11,7
(0039) PORTD&= 0x7F;
03C4 B382 IN R24,0x12
03C5 778F ANDI R24,0x7F
03C6 BB82 OUT 0x12,R24
03C7 9508 RET
(0040)
(0041)
(0042) }
(0043)
(0044)
(0045) void spi_init(void)
(0046) {
(0047) DDRB |=0x07;
_spi_init:
03C8 B387 IN R24,0x17
03C9 6087 ORI R24,7
03CA BB87 OUT 0x17,R24
(0048) PORTB &=0xf8; //选择3548
03CB B388 IN R24,0x18
03CC 7F88 ANDI R24,0xF8
03CD BB88 OUT 0x18,R24
(0049) SPCR = 0x54; //setup SPI,SPI使能,主机模式,为1/4分频
03CE E584 LDI R24,0x54
03CF B98D OUT 0x0D,R24
(0050) SPSR= 0x01; //setup SPI SPI选择加速,为1/2分频
03D0 E081 LDI R24,1
03D1 B98E OUT 0x0E,R24
03D2 9508 RET
(0051) }
(0052)
(0053) void uart0_init(void)
(0054) {
(0055) UCSR0B = 0x00; //disable while setting baud rate
_uart0_init:
03D3 2422 CLR R2
03D4 B82A OUT 0x0A,R2
(0056) UCSR0A = 0x00; //发送等待缓冲器
03D5 B82B OUT 0x0B,R2
(0057) UCSR0C = 0x06; //异步通信,8位数据
03D6 E086 LDI R24,6
03D7 93800095 STS 0x95,R24
(0058) UBRR0L = 0x5F; //0x08; //set baud rate lo 9600
03D9 E58F LDI R24,0x5F
03DA B989 OUT 0x09,R24
(0059) UBRR0H = 0x00; //set baud rate hi
03DB 92200090 STS 0x90,R2
(0060) // UCSR0B =0X00;
(0061) UCSR0B = 0x98; //接收结束中断使能,接收使能,发送使能
03DD E988 LDI R24,0x98
03DE B98A OUT 0x0A,R24
03DF 9508 RET
(0062) }
(0063)
(0064) //-------------------------------------------------------------------------------
(0065) /*
(0066) MCU初始化
(0067) */
(0068) //-------------------------------------------------------------------------------
(0069) //call this routine to initialize all peripherals
(0070) void init_devices(void)
(0071) {
(0072)
(0073) CLI();
_init_devices:
03E0 94F8 BCLR 7
(0074)
(0075) XDIV=0x00 ;
03E1 2422 CLR R2
03E2 BE2C OUT 0x3C,R2
(0076)
(0077) //timer1_init();
(0078) port_init();
03E3 DFB1 RCALL _port_init
(0079) //
(0080) spi_init();
03E4 DFE3 RCALL _spi_init
(0081) //
(0082) uart0_init();
03E5 DFED RCALL _uart0_init
(0083) //
(0084) // adc_init();
(0085)
(0086) // int_isr_init();
(0087) //中断设置
(0088)
(0089) // Initial_3544();
(0090) //
(0091) // i2c_init();
(0092) LCD_init();
03E6 940E0389 CALL _LCD_init
(0093) //MCUCR = 0x00;//电源管理控制寄存器
(0094)
(0095) TIMSK=0x04 ;
03E8 E084 LDI R24,4
03E9 BF87 OUT 0x37,R24
(0096)
(0097) ETIMSK=0x00 ;
03EA 2422 CLR R2
03EB 9220007D STS 0x7D,R2
(0098)
(0099) MCUCR=0xc0 ;
03ED EC80 LDI R24,0xC0
03EE BF85 OUT 0x35,R24
(0100)
(0101)
(0102) //1100 0000
(0103) XMCRA=0x0e ;
03EF E08E LDI R24,0xE
03F0 9380006D STS 0x6D,R24
(0104) // 读/写操作插入2个等待周期。输出新地址之前还要插入1个等待周期
(0105) //- SRL2 SRL1 SRL0 SRW01 SRW00 SRW11 -
(0106) //7------------------------0
(0107)
(0108) XMCRB=0 ;
03F2 9220006C STS 0x6C,R2
(0109) //(1<<XMBK); // 使能外部扩展随机存储器总线保持功能
(0110) //XMBK - - - - XMM2 XMM1 XMM0
(0111) //XMBK 外部存储器总线保持功能使能
(0112) //XMM2~0 外部存储器高地址屏蔽
(0113)
(0114) UCSR0B|=0x80 ;
03F4 9A57 SBI 0x0A,7
(0115) //开串口接收中断
(0116) SEI();
03F5 9478 BSET 7
03F6 9508 RET
_uart0_rx_isr:
status --> R16
data --> R16
03F7 930A ST R16,-Y
03F8 B70F IN R16,0x3F
03F9 930A ST R16,-Y
FILE: D:\new_sd\uart.c
(0001)
(0002) #include "GLO.H"
(0003) #include "uart.h"
(0004) //--------------------------------------------------------------------
(0005) /*
(0006) uart0接收结束中断 与PL-2303通信
(0007) */
(0008) //中断向量
(0009) //协议帧格式
(0010) //SYNC + LENGTH(2 byte) + COMMAND + DATA + CHECKSUM
(0011) //
(0012) //--------------------------------------------------------------------
(0013) #pragma interrupt_handler uart0_rx_isr:19
(0014)
(0015) void uart0_rx_isr(void)
(0016) {
(0017) unsigned char status,data;
(0018) status = UCSR0A;
03FA B10B IN R16,0x0B
(0019) data = UDR0;
03FB B10C IN R16,0x0C
(0020) /* if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
(0021) {
(0022) }
(0023) // PORTA = led_7[data];
(0024) */
(0025) data = UDR0;
03FC B10C IN R16,0x0C
03FD 9109 LD R16,Y+
03FE BF0F OUT 0x3F,R16
03FF 9109 LD R16,Y+
0400 9518 RETI
(0026) }
(0027) //--------------------------------------------------------------------
(0028) /*
(0029) uart0 寄存器空中断(发送中断)
(0030) */
(0031) //--------------------------------------------------------------------
(0032) /*
(0033) #pragma interrupt_handler uart0_udre_isr:20
(0034)
(0035) void uart0_udre_isr(void)
(0036) {
(0037) while (!(UCSRA & DATA_REGISTER_EMPTY)); // 等待发送寄存器空
(0038) UDR = data;
(0039)
(0040) }
(0041) */
(0042)
(0043) void USART_Transmit(unsigned char data)
(0044) {
(0045) while (!(UCSR0A & DATA_REGISTER_EMPTY)); // 等待发送寄存器空
_USART_Transmit:
data --> R16
0401 9B5D SBIS 0x0B,5
0402 CFFE RJMP _USART_Transmit
(0046) UDR0 = data; // 发送数据
0403 B90C OUT 0x0C,R16
0404 9508 RET
_SD_Initialize:
recbuf --> Y+0
ret --> R10
0405 940E0CFC CALL push_gset3
0407 9724 SBIW R28,4
FILE: D:\new_sd\SD\SD\sddriver.c
(0001) /*******************************************************************************************************
(0002) ** Descriptions: sd 卡驱动软件包: SD卡物理层 用户API函数
(0003) ********************************************************************************************************/
(0004) #include "D:\new_sd\define.h"
(0005)
(0006)
(0007) /* SD卡信息结构体变量 the information structure variable of SD Card */
(0008) sd_struct sds;
(0009)
(0010) /* 超时时间单位表(单位:0.000000001ns) timeout unit table */
(0011) const uint32 time_unit[8] = {1000000000,100000000,10000000,
(0012) 1000000,100000,10000,1000,100};
(0013)
(0014) /* 超时时间表 timeout value table */
(0015) const uint8 time_value[16] = { 0,10,12,13,15,20,25,30,
(0016) 35,40,45,50,55,60,70,80};
(0017)
(0018) /* 超时时间因数表 timeout factor table */
(0019) const uint8 r2w_fator[6] = {1,2,4,8,16,32};
(0020)
(0021) /********************************************************************************************
(0022)
(0023) 用户API函数: 初始化,读,写,擦 SD卡 User API Function: Initialize,read,write,erase SD Card
(0024)
(0025) ********************************************************************************************/
(0026)
(0027)
(0028) /*******************************************************************************************************************
(0029) ** 函数名称: INT8U SD_Initialize() Name: INT8U SD_Initialize()
(0030) ** 功能描述: 初始化SD卡 Function: initialize sd card
(0031) ** 输 入: 无 Input: NULL
(0032) ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
(0033) ********************************************************************************************************************/
(0034) uint8 SD_Initialize(void)
(0035) {
(0036) uint8 recbuf[4],ret;
(0037)
(0038) SD_HardWareInit(); /* 初始化读写SD卡的硬件条件 Initialize the hardware that access SD Card */
0408 940E0BEE CALL _SD_HardWareInit
(0039)
(0040) SPI_CS_Assert(); /* 1. 置CS为低 assert CS */
040A 940E0BF3 CALL _SPI_CS_Assert
(0041) SD_SPIDelay(30); /* 2. 至少延时 74 clock delay more than 74 clock */
040C E10E LDI R16,0x1E
040D 940E0BDF CALL _SD_SPIDelay
(0042) SPI_CS_Deassert(); /* 3. 置CS为高 dessert CS */
040F 940E0BF4 CALL _SPI_CS_Deassert
(0043) SD_SPIDelay(3); /* 4. 延时2(8 clock) delay 2(8 clock) */
0411 E003 LDI R16,3
0412 940E0BDF CALL _SD_SPIDelay
(0044)
(0045) ret = SD_ResetSD(); /* 5. 发出CMDO命令复位SD卡 send CMD0 command to reset sd card */
0414 940E0803 CALL _SD_ResetSD
0416 2EA0 MOV R10,R16
(0046) if (ret != SD_NO_ERR)
0417 2300 TST R16
0418 F009 BEQ 0x041A
(0047) return ret;
0419 C027 RJMP 0x0441
(0048)
(0049) ret = SD_ActiveInit(); /* 6. 激活卡进入初始化过程. active card initialize process */
041A D186 RCALL _SD_ActiveInit
041B 2EA0 MOV R10,R16
(0050) if (ret != SD_NO_ERR)
041C 2300 TST R16
041D F009 BEQ 0x041F
(0051) return ret;
041E C022 RJMP 0x0441
(0052)
(0053) ret = SD_ReadOCR(4, recbuf); /* 7. 读OCR寄存器,查询卡支持的电压值 read OCR register,get the supported voltage */
041F 019E MOVW R18,R28
0420 E004 LDI R16,4
0421 940E08F6 CALL _SD_ReadOCR
0423 2EA0 MOV R10,R16
(0054) if (ret != SD_NO_ERR)
0424 2300 TST R16
0425 F009 BEQ 0x0427
(0055) return ret;
0426 C01A RJMP 0x0441
(0056)
(0057) if ((recbuf[1] & MSK_OCR_33) != MSK_OCR_33)
0427 8189 LDD R24,Y+1
0428 7C80 ANDI R24,0xC0
0429 3C80 CPI R24,0xC0
042A F011 BEQ 0x042D
(0058) return SD_ERR_VOL_NOTSUSP; /* 不支持3.3V,返回错误码 not support 3.3V,return error code */
042B E004 LDI R16,4
042C C014 RJMP 0x0441
(0059)
(0060) SPI_ClkToMax(); /* 8. 设置SPI时钟到最大值 set SPI clock to maximum */
042D 940E0BF0 CALL _SPI_ClkToMax
(0061)
(0062) #if SD_CRC_EN
(0063) ret = SD_EnableCRC(1); /* 使能CRC校验 enable CRC check */
042F E001 LDI R16,1
0430 940E0931 CALL _SD_EnableCRC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -