📄 mt.lst
字号:
(0001)
(0002) /*函数的使用说明:
(0003) 1.该twi模块包含四种工作模式,主发,主收,从收,从发,其中主发由
(0004) twiWriteByte(从机地址,要发送的数据)实现,主收由twiReadByte(从机地址)实现,从机
(0005) 的发送与接收均通过中断实现
(0006) 2.在从机模式下,需调用twi_init()来使能并初始化twi总线
(0007) 3.在主机模式下,调用twiWriteByte(从机地址,要发送的数据)向指定的从机写入数据,
(0008) 调用twiReadByte(从机地址)从指定的从机读取数据,然后可通过查询错误状态error_state
(0009) 的值决定下一步如何操作。
(0010) */
(0011)
(0012) #include "twi.h"
(0013)
(0014) //TWI同程序的接口参数
(0015) //receive_data,error_state不用设置
(0016) char receive_data=0; // 接收到的数据
(0017) char error_state=0; // twi错误状态
(0018) //以下三个参数根据需求进行设置
(0019) char slave_address=0xa0; // 设置从机地址,Bits 7..1:存放从机地址,Bit 0:最低位为广播识别使能位
(0020) char bit_race=0x20; // 设置主机模式的比特率,SCL=CPU频率/(16+2*(TWBR)*4TWPS),TWPS在4的指数位置
(0021) char send_data=0x02; // 从机发送模式下从机向主机发送的数据
(0022) //要发送的数据
(0023) char trandata[num] = {0x00,0x01,0x02,0x03};
(0024) //*************************PTR8000全局变量**********************************
(0025) unsigned char Recv;
(0026) unsigned char RC0 = 0x4c,RC1 = 0x0c;//用于设置发送频率
(0027) unsigned char Add = 0xa1; //设置发送地址
(0028) //*************************** twi错误状态说明*********************************
(0029) // 0:twi传送无错误
(0030) // 1:在主发模式下,SLA+W已发送,返回NOT ACK
(0031) // 2:在主发模式下,DATA已发送,返回NOT ACK
(0032) // 3:在主发模式下,SLA+W或者数据的仲裁失败
(0033) // 4:在主收模式下,SLA+R或者数据的仲裁失败
(0034) // 5:在主收模式下,SLA+R已发送,返回NOT ACK
(0035) // 6:在主发模式下,START信号发送不成功
(0036) // 7:在主收模式下,START信号发送不成功
(0037) // 8:在主收模式下,数据接受完成
(0038) // 9:在主收模式下,数据接受不成功
(0039) //*****************************************************************************
(0040)
(0041)
(0042) //*************************函数定义部分**************************************
(0043) void port_init(void); //初始化MEGA各控制引脚
(0044)
(0045) void Delay_1ms(void); //延时1ms函数
(0046) void Delay_Nms(unsigned int N); //延时Nms函数
(0047) void LED(unsigned char i); //点亮/熄灭LED
(0048)
(0049) //串口通讯用函数
(0050) void Uart_Init(void); //UART初始化
(0051) void Uart_Send(unsigned char c); //UART发送一个字符
(0052)
(0053)
(0054) //SPI通讯用函数
(0055) void SPI_MasterInit(void); //SPI主机初始化
(0056) void SPI_M_Send(unsigned char c); //主机方式发送一个字符
(0057) unsigned char SPI_M_Recv(unsigned char c); //主机接收一个字符
(0058)
(0059) //PTR8000用函数
(0060) void PTR8_Standby(void); //set TRC_CE Disable
(0061) void PTR8_TREN(void); //set TRX_CE Enable
(0062) void PTR8_TX(void); //无线模块发送状态
(0063) void PTR8_RX(void); //无线模块接收状态
(0064) void Init_PTR8_CR(void); //初始化PTR8000控制状态
(0065)
(0066) void Init_Device(void); //初始化串口、SPI口及其他设备
(0067)
(0068) //******************************函数实现部分************************************
(0069)
(0070) //*************************** I/O 初始化****************************************
(0071) //******************************************************************************
(0072) /* 函数名: init_port
(0073) 功能说明:初始化各MEGA8各控制引脚
(0074) 参数说明:无
(0075) 函数作者:Haibo YU
(0076) 版本号: 1.0
(0077) 创建时间:2005-12-23
(0078) 修改时间:
(0079) 修改内容: */
(0080) void port_init(void)
(0081) {
(0082) PORTB = 0x2f; //置PB0,PB1,PB2,PB3,PB5为1,PB4,PB6,PB7为0
_port_init:
01E1 E28F LDI R24,0x2F
01E2 BB88 OUT 0x18,R24
(0083) DDRB = 0x2f; //置PB0,PB1,PB2--SS,PB3--MOSI,PB5--SCK为输出,PB4--MISO为输入
01E3 BB87 OUT 0x17,R24
(0084) PORTC = 0x0f;
01E4 E08F LDI R24,0xF
01E5 BB85 OUT 0x15,R24
(0085) DDRC = 0x0f; //PC4--SDA,PC5--SCL为输入,PC0--PC3全为输出以便测试
01E6 BB84 OUT 0x14,R24
(0086) PORTD = 0x05; //置PWR,TXEN为1, TRXCE为0
01E7 E085 LDI R24,5
01E8 BB82 OUT 0x12,R24
(0087) DDRD = 0x07; //置PD3,PD4,PD5输入;PD2--PWR,PD0--TXEN,PD1--TRXCE输出
01E9 E087 LDI R24,7
01EA BB81 OUT 0x11,R24
(0088) }
01EB 9508 RET
(0089) //**************************************************************************************
(0090)
(0091) /* 函数名: Delay_1ms
(0092) 功能说明:软件延时1ms
(0093) 参数说明:无
(0094) 函数作者:Haibo YU
(0095) 版本号: 1.0
(0096) 创建时间:2005-12-06
(0097) 修改时间:
(0098) 修改内容: */
(0099)
(0100) void Delay_1ms(void)
(0101) {
(0102) unsigned int i;
(0103) for ( i = 0 ; i < ( unsigned int ) 11 * 143 - 2 ; i ++ )
_Delay_1ms:
i --> R16
01EC 2700 CLR R16
01ED 2711 CLR R17
01EE C002 RJMP 0x01F1
01EF 5F0F SUBI R16,0xFF
01F0 4F1F SBCI R17,0xFF
01F1 3203 CPI R16,0x23
01F2 E0E6 LDI R30,6
01F3 071E CPC R17,R30
01F4 F3D0 BCS 0x01EF
(0104) ;
(0105) }
01F5 9508 RET
_Delay_Nms:
j --> R20
N --> R22
01F6 D0A0 RCALL push_gset2
01F7 01B8 MOVW R22,R16
(0106) //******************************************************************
(0107)
(0108) /* 函数名: Delay_Nms
(0109) 功能说明:软件延时Nms,适用于所有CPU
(0110) 参数说明:N值决定延时长度。范围为0~65536之间的整数
(0111) 函数作者:Haibo YU
(0112) 版本号: 1.0
(0113) 创建时间:2005-12-06
(0114) 修改时间:
(0115) 修改内容: */
(0116) void Delay_Nms(unsigned int N)
(0117) {
(0118) unsigned int j;
(0119) for( j = 0 ; j < N ; j ++ )
01F8 2744 CLR R20
01F9 2755 CLR R21
01FA C003 RJMP 0x01FE
(0120) Delay_1ms();
01FB DFF0 RCALL _Delay_1ms
01FC 5F4F SUBI R20,0xFF
01FD 4F5F SBCI R21,0xFF
01FE 1746 CP R20,R22
01FF 0757 CPC R21,R23
0200 F3D0 BCS 0x01FB
(0121) }
0201 D078 RCALL pop_gset2
0202 9508 RET
(0122) //*******************************************************************
(0123)
(0124) /* 函数名: LED
(0125) 功能说明:点亮/熄灭LED
(0126) 参数说明:0----点亮;1----熄灭
(0127) 函数作者:Haibo YU
(0128) 版本号: 1.0
(0129) 创建时间:2005-12-23
(0130) 修改时间:
(0131) 修改内容: */
(0132)
(0133) void LED(unsigned char i)
(0134) {
(0135) if(i == 0)
_LED:
i --> R16
0203 2300 TST R16
0204 F411 BNE 0x0207
(0136) PORTB &= ~BIT(PB1);
0205 98C1 CBI 0x18,1
0206 C001 RJMP 0x0208
(0137) else
(0138) PORTB |= BIT(PB1);
0207 9AC1 SBI 0x18,1
(0139) }
0208 9508 RET
(0140)
(0141) //*******************************************************************
(0142)
(0143) //串口通讯用函数
(0144)
(0145) /* 函数名: Uart_Init
(0146) 功能说明:串口初始化函数,适用于所有CPU
(0147) 波特率9600,8位字节,无奇偶校验
(0148) 参数说明:无
(0149) 函数作者:Haibo YU
(0150) 版本号: 1.0
(0151) 创建时间:2005-12-02
(0152) 修改时间:
(0153) 修改内容: */
(0154) void Uart_Init(void)
(0155) {
(0156) UCSRB = 0x00; //disable while setting baud rate
_Uart_Init:
0209 2422 CLR R2
020A B82A OUT 0x0A,R2
(0157) UCSRA = 0x00;
020B B82B OUT 0x0B,R2
(0158) UCSRC = 0x86;
020C E886 LDI R24,0x86
020D BD80 OUT 0x20,R24
(0159) UBRRL = 0x47; //set baud rate lo
020E E487 LDI R24,0x47
020F B989 OUT 0x09,R24
(0160) UBRRH = 0x00; //set baud rate hi
0210 BC20 OUT 0x20,R2
(0161) UCSRB = 0x98;
0211 E988 LDI R24,0x98
0212 B98A OUT 0x0A,R24
(0162) }
0213 9508 RET
(0163) //********************************************************************
(0164)
(0165) /* 函数名: Uart_Send
(0166) 功能说明:通过查询方式,串口发送一个字节函数,适用于所有CPU
(0167) 参数说明:c为所要发送的字节
(0168) 函数作者:Haibo YU
(0169) 版本号: 1.0
(0170) 创建时间:2005-12-02
(0171) 修改时间:
(0172) 修改内容: */
(0173) void Uart_Send(unsigned char c)
(0174) {
(0175) while(!(UCSRA&(1<<UDRE)))
_Uart_Send:
c --> R16
0214 9B5D SBIS 0x0B,5
0215 CFFE RJMP _Uart_Send
(0176) ; //等待空闲
(0177) UDR=c; //发送数据
0216 B90C OUT 0x0C,R16
(0178) }
0217 9508 RET
_uart0_rx_isr:
0218 D087 RCALL push_lset
(0179) /*接收中断函数*/
(0180) #pragma interrupt_handler uart0_rx_isr:12
(0181) void uart0_rx_isr(void)
(0182) {
(0183) Recv = UDR;
0219 B02C IN R2,0x0C
021A 9220006C STS _Recv,R2
(0184) Uart_Send(Recv);//接收到的数据立即通过串口返回
021C 2D02 MOV R16,R2
021D DFF6 RCALL _Uart_Send
(0185)
(0186) }
021E D098 RCALL pop_lset
021F 9518 RETI
(0187) //**********************************************************************
(0188)
(0189) //SPI通讯用函数
(0190)
(0191) /* 函数名: SPI_MasterInit
(0192) 功能说明:SPI主机初始化函数。使能SPI,MSB在前,主模式
(0193) 起始上升沿,采样上升沿。16分频
(0194) 参数说明: 无
(0195) 返回值: 无
(0196) 函数作者:Haibo YU
(0197) 版本号: 1.0
(0198) 创建时间:2005-12-02
(0199) 修改时间:
(0200) 修改内容: */
(0201)
(0202) void SPI_MasterInit(void)
(0203) {
(0204) SPCR = 0x51; //SPI控制寄存器初始化:SPI允许,MSB先发,主模式,16分频
_SPI_MasterInit:
0220 E581 LDI R24,0x51
0221 B98D OUT 0x0D,R24
(0205) }
0222 9508 RET
(0206) //**********************************************************************
(0207) /* 函数名: SPI_M_Send
(0208) 功能说明:SPI主机发送一个字节函数。
(0209) 参数说明: c为要发送的字节
(0210) 返回值: 无
(0211) 函数作者:Haibo YU
(0212) 版本号: 1.0
(0213) 创建时间:2005-12-02
(0214) 修改时间:2005-12-05
(0215) 修改内容: 去掉SS信号控制语句 */
(0216)
(0217) void SPI_M_Send(unsigned char c)
(0218) {
(0219) SPDR = c; //传送开始
_SPI_M_Send:
c --> R16
0223 B90F OUT 0x0F,R16
(0220) while(!(SPSR & 0X80))
0224 9B77 SBIS 0x0E,7
0225 CFFE RJMP 0x0224
(0221) ; //查询SPIF标志
(0222)
(0223) }
0226 9508 RET
(0224) //************************************************************************
(0225)
(0226) /* 函数名: SPI_M_Recv
(0227) 功能说明:SPI主机方式接收一个字节函数。
(0228) 参数说明:任意无效字符
(0229) 返回值: 返回接收到的字节
(0230) 函数作者:Haibo YU
(0231) 版本号: 1.0
(0232) 创建时间:2005-12-06
(0233) 修改时间:
(0234) 修改内容: */
(0235)
(0236) unsigned char SPI_M_Recv(unsigned char c)
(0237) {
(0238) SPDR = c; //传送开始
_SPI_M_Recv:
c --> R16
0227 B90F OUT 0x0F,R16
(0239) while(!(SPSR & 0X80))
0228 9B77 SBIS 0x0E,7
0229 CFFE RJMP 0x0228
(0240) ; //查询SPIF标志
(0241) return SPDR; //返回接收的字符
022A B10F IN R16,0x0F
022B 9508 RET
(0242) }
(0243) //*************************************************************************
(0244)
(0245) //***************************PTR8000无线模块用函数*****************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -