📄 gsm.lst
字号:
__start:
__text_start:
0051 E5CF LDI R28,0x5F
0052 E0D4 LDI R29,4
0053 BFCD OUT 0x3D,R28
0054 BFDE OUT 0x3E,R29
0055 58C0 SUBI R28,0x80
0056 40D0 SBCI R29,0
0057 EA0A LDI R16,0xAA
0058 8308 STD Y+0,R16
0059 2400 CLR R0
005A EDEC LDI R30,0xDC
005B E0F0 LDI R31,0
005C E011 LDI R17,1
005D 30EC CPI R30,0xC
005E 07F1 CPC R31,R17
005F F011 BEQ 0x0062
0060 9201 ST R0,Z+
0061 CFFB RJMP 0x005D
0062 8300 STD Z+0,R16
0063 E2E6 LDI R30,0x26
0064 E0F0 LDI R31,0
0065 E6A0 LDI R26,0x60
0066 E0B0 LDI R27,0
0067 E010 LDI R17,0
0068 3AE2 CPI R30,0xA2
0069 07F1 CPC R31,R17
006A F021 BEQ 0x006F
006B 95C8 LPM
006C 9631 ADIW R30,1
006D 920D ST R0,X+
006E CFF9 RJMP 0x0068
006F D052 RCALL _main
_exit:
0070 CFFF RJMP _exit
FILE: C:\DOCUME~1\Rooger\桌面\GSM_PHONE\usart.c
(0001) //***************************************************************************
(0002)
(0003) #include <iom8v.h>
(0004) #include <macros.h>
(0005) #include "usart.h"
(0006)
(0007) /*****************************************************************************
(0008) *
(0009) * Function name : USART_Init
(0010) *
(0011) * Returns : None
(0012) *
(0013) * Parameters : unsigned int baudrate
(0014) *
(0015) * Purpose : Initialize the USART
(0016) *
(0017) *****************************************************************************/
(0018) void USART_Init()
(0019) {
(0020) // Set baud rate (38.4k)EXT OSC = 3.6864M
(0021) UBRRH = 0x00;
_USART_Init:
0071 2422 CLR R2
0072 BC20 OUT 0x20,R2
(0022) UBRRL = 0x01;
0073 E081 LDI R24,1
0074 B989 OUT 0x09,R24
(0023)
(0024) UCSRB = (1 << RXEN)|(1<<TXEN); //RXEN->enable usrt recieving;
0075 E188 LDI R24,0x18
0076 B98A OUT 0x0A,R24
(0025) // Set frame format : 8data, 1stop bits
(0026) UCSRC = (1<<URSEL) | (0 << USBS) | (3 << UCSZ0);
0077 E886 LDI R24,0x86
0078 BD80 OUT 0x20,R24
0079 9508 RET
(0027) }
(0028)
(0029)
(0030) /*****************************************************************************
(0031) *
(0032) * Function name : Usart_Tx
(0033) *
(0034) * Returns : None
(0035) *
(0036) * Parameters : char data: byte to send
(0037) *
(0038) * Purpose : Send one byte through the USART
(0039) *
(0040) *****************************************************************************/
(0041) void Usart_Tx(char data)
(0042) {
(0043) while (!(UCSRA & (1<<UDRE)));
_Usart_Tx:
data --> R16
007A 9B5D SBIS 0x0B,5
007B CFFE RJMP _Usart_Tx
(0044) UDR = data;
007C B90C OUT 0x0C,R16
007D 9508 RET
_Usart_TxData:
iTemp --> R20
data --> R20
iValue --> R22
007E D31B RCALL push_gset2
007F 01B8 MOVW R22,R16
(0045) }
(0046) void Usart_TxData(unsigned int iValue)
(0047) {
(0048) char data;
(0049) unsigned int iTemp;
(0050) iTemp = iValue;
0080 01AB MOVW R20,R22
(0051) data = (iTemp >> 8) & 0xff;
0081 2F45 MOV R20,R21
0082 2755 CLR R21
0083 7050 ANDI R21,0
(0052) Usart_Tx(data);
0084 2F04 MOV R16,R20
0085 DFF4 RCALL _Usart_Tx
(0053) data = iValue & 0xff;
0086 2F46 MOV R20,R22
0087 7050 ANDI R21,0
(0054) Usart_Tx(data);
0088 2F04 MOV R16,R20
0089 DFF0 RCALL _Usart_Tx
008A D305 RCALL pop_gset2
008B 9508 RET
_Usart_Command:
ComCounter --> Y+1
J --> R22
num_bytes --> R10
command --> R20
008C D30B RCALL push_gset3
008D 2EA2 MOV R10,R18
008E 01A8 MOVW R20,R16
(0055) }
(0056) void Usart_Command(char *command, char num_bytes)
(0057) {
(0058) unsigned char J;
(0059) char ComCounter;
(0060) for (J = 0; J < num_bytes; J++)
008F 2766 CLR R22
0090 C007 RJMP 0x0098
(0061) {
(0062) Usart_Tx(command[J]);
0091 2FE6 MOV R30,R22
0092 27FF CLR R31
0093 0FE4 ADD R30,R20
0094 1FF5 ADC R31,R21
0095 8100 LDD R16,Z+0
0096 DFE3 RCALL _Usart_Tx
0097 9563 INC R22
0098 156A CP R22,R10
0099 F3B8 BCS 0x0091
009A D2F7 RCALL pop_gset3
009B 9508 RET
_Usart_Rx:
data --> Y+1
iCounter --> R20
009C D2FF RCALL push_gset1
(0063) }
(0064) }
(0065) /*****************************************************************************
(0066) *
(0067) * Function name : Usart_Rx
(0068) *
(0069) * Returns : char: byte received
(0070) *
(0071) * Parameters : None
(0072) *
(0073) * Purpose : Receives one byte from the USART
(0074) *
(0075) *****************************************************************************/
(0076) char Usart_Rx(void)
(0077) {
(0078) int iCounter;
(0079) char data;
(0080) iCounter = 0;
009D 2744 CLR R20
009E 2755 CLR R21
009F C00B RJMP 0x00AB
(0081) while (!(UCSRA & (1<<RXC)))
(0082) {
(0083) Delay(5);
00A0 E005 LDI R16,5
00A1 E010 LDI R17,0
00A2 D00E RCALL _Delay
(0084) iCounter++;
00A3 5F4F SUBI R20,0xFF
00A4 4F5F SBCI R21,0xFF
(0085) if (iCounter > 60000) break;
00A5 E680 LDI R24,0x60
00A6 EE9A LDI R25,0xEA
00A7 1784 CP R24,R20
00A8 0795 CPC R25,R21
00A9 F408 BCC 0x00AB
00AA C002 RJMP 0x00AD
00AB 9B5F SBIS 0x0B,7
00AC CFF3 RJMP 0x00A0
(0086) }
(0087) return UDR;
00AD B10C IN R16,0x0C
00AE D2F0 RCALL pop_gset1
00AF 9508 RET
(0088) }
(0089) //*****************************************************************************/
(0090) #pragma interrupt_handler Usart_Rx_isr:12
(0091) void Usart_Rx_isr(void)
(0092) {
_Usart_Rx_isr:
data --> Y+1
00B0 9518 RETI
_Delay:
i --> R20
num --> R16
00B1 D2EA RCALL push_gset1
FILE: C:\DOCUME~1\Rooger\桌面\GSM_PHONE\gsm_main.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "define.h"
(0004) #include "iic.h"
(0005) /***********************define iic paramer***********************/
(0006) uchar buf[18];
(0007) uchar cmd=0;//i2c数据缓存
(0008) uchar cmd_num=0;//i2c数据计数
(0009) uchar flag=0; //标记
(0010) uchar j=0; //i2c发送数据记数
(0011) uchar *data;//i2c发送数据缓存
(0012) uchar xk=0;
(0013) uchar req_flag=0,start_flag=0,vision_flag=0,cmd_flag=0;//定义来自pc端不同数据的标记
(0014) uchar hand[]={0x0f,0x34,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
(0015) uchar ring[]={0x01,0x36,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
(0016) uchar telnum[14];//拨出的电话号码
(0017) uchar num=0;//电话号码长度
(0018) uchar num_end_flag=0;//电话号码结束标记
(0019) uchar hkon[]={0x01,0x31,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
(0020) uchar hkoff[]={0x01,0x30,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
(0021) uchar mton[]={0x01,0x44,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
(0022) uchar mtoff[]={0x01,0x43,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
(0023) uchar idnum[14];
(0024) uchar hookon=0,hookoff=0,muteon=0,muteoff=0;
(0025) /****************************************************************/
(0026) void Delay(uint num )
(0027) {
(0028) uint i;
(0029) for(;num>0;num--)
00B2 C00A RJMP 0x00BD
(0030) {
(0031) i=600;
00B3 E548 LDI R20,0x58
00B4 E052 LDI R21,2
00B5 C002 RJMP 0x00B8
(0032) while(i)
(0033) {
(0034) i--;
00B6 5041 SUBI R20,1
00B7 4050 SBCI R21,0
00B8 3040 CPI R20,0
00B9 0745 CPC R20,R21
00BA F7D9 BNE 0x00B6
00BB 5001 SUBI R16,1
00BC 4010 SBCI R17,0
00BD 3000 CPI R16,0
00BE 0701 CPC R16,R17
00BF F799 BNE 0x00B3
00C0 D2DE RCALL pop_gset1
00C1 9508 RET
(0035) }
(0036) }
(0037) }
(0038) void main()
(0039) {
(0040) DDRC |=0x38; //设置SDA SCL MUTE即port3 portc4 portc5为输出
_main:
00C2 B384 IN R24,0x14
00C3 6388 ORI R24,0x38
00C4 BB84 OUT 0x14,R24
(0041) DDRB |=0x20;//设置pwr 即portb5为输出
00C5 9ABD SBI 0x17,5
(0042) DDRD |=0x04;//设置gsm_rst即portd2为输出
00C6 9A8A SBI 0x11,2
(0043)
(0044) /*********IIC初始化******************/
(0045) TWBR=0;
00C7 2422 CLR R2
00C8 B820 OUT 0x00,R2
(0046) TWSR=00;
00C9 B821 OUT 0x01,R2
(0047) TWAR=0x20;
00CA E280 LDI R24,0x20
00CB B982 OUT 0x02,R24
(0048) Twi_ACK();
00CC EC85 LDI R24,0xC5
00CD BF86 OUT 0x36,R24
(0049) /***********系统功能初始化***************/
(0050)
(0051) PWRON;
00CE B388 IN R24,0x18
00CF 7D8F ANDI R24,0xDF
00D0 BB88 OUT 0x18,R24
(0052) PORTD |=0x04;
00D1 9A92 SBI 0x12,2
(0053) Delay(500);
00D2 EF04 LDI R16,0xF4
00D3 E011 LDI R17,1
00D4 DFDC RCALL _Delay
(0054) PORTD &=0xfb;
00D5 B382 IN R24,0x12
00D6 7F8B ANDI R24,0xFB
00D7 BB82 OUT 0x12,R24
(0055)
(0056) USART_Init();
00D8 DF98 RCALL _USART_Init
(0057) SREG |= 0x80;
00D9 9478 BSET 7
(0058) Delay(1000);
00DA EE08 LDI R16,0xE8
00DB E013 LDI R17,3
00DC DFD4 RCALL _Delay
(0059) Usart_Command("AT",2);
00DD E022 LDI R18,2
00DE E030 LDI R19,0
00DF ED09 LDI R16,0xD9
00E0 E010 LDI R17,0
00E1 DFAA RCALL _Usart_Command
(0060) Usart_Tx(0x0d);
00E2 E00D LDI R16,0xD
00E3 E010 LDI R17,0
00E4 DF95 RCALL _Usart_Tx
(0061) // Delay(30000);
(0062) Usart_Command("AT+CLIP=1",9); //设置来电显示
00E5 E029 LDI R18,0x9
00E6 E030 LDI R19,0
00E7 EC0F LDI R16,0xCF
00E8 E010 LDI R17,0
00E9 DFA2 RCALL _Usart_Command
(0063) Usart_Tx(0x0d);
00EA E00D LDI R16,0xD
00EB E010 LDI R17,0
00EC DF8D RCALL _Usart_Tx
00ED C10C RJMP 0x01FA
(0064) while(1)
(0065) {
(0066) if(start_flag) //如果接受到的是0x0f
00EE 90200066 LDS R2,start_flag
00F0 2022 TST R2
00F1 F039 BEQ 0x00F9
(0067) {
(0068) start_flag=0;
00F2 2422 CLR R2
00F3 92200066 STS start_flag,R2
(0069) cmd_num=0;
00F5 92200061 STS cmd_num,R2
(0070) data=hand;//准备握手数据
00F7 E689 LDI R24,0x69
00F8 D2D8 RCALL 0x03D1
(0071) }
(0072) if(vision_flag)//接收到请求ID命令
00F9 90200067 LDS R2,vision_flag
00FB 2022 TST R2
00FC F039 BEQ 0x0104
(0073) {
(0074) vision_flag=0;
00FD 2422 CLR R2
00FE 92200067 STS vision_flag,R2
(0075) cmd_num=0;
0100 92200061 STS cmd_num,R2
(0076) data=idnum;//准备ID数据
0102 ED8C LDI R24,0xDC
0103 D2CD RCALL 0x03D1
(0077) }
(0078) if(req_flag)
0104 90200065 LDS R2,req_flag
0106 2022 TST R2
0107 F161 BEQ 0x0134
(0079) {
(0080) if(hookon) //Hook on置位
0108 902000BF LDS R2,hookon
010A 2022 TST R2
010B F031 BEQ 0x0112
(0081) {
(0082) data=hkon;//准备hookon数据
010C E887 LDI R24,0x87
010D D2C3 RCALL 0x03D1
(0083) hookon=0;
010E 2422 CLR R2
010F 922000BF STS hookon,R2
(0084) }
0111 C01D RJMP 0x012F
(0085) else if(hookoff)//hook off置位
0112 902000C0 LDS R2,hookoff
0114 2022 TST R2
0115 F031 BEQ 0x011C
(0086) {
(0087) data=hkoff;//准备hook off数据
0116 E985 LDI R24,0x95
0117 D2B9 RCALL 0x03D1
(0088) hookoff=0;
0118 2422 CLR R2
0119 922000C0 STS hookoff,R2
(0089) }
011B C013 RJMP 0x012F
(0090) else if(muteon) //静音关闭标记置位
011C 902000C1 LDS R2,muteon
011E 2022 TST R2
011F F031 BEQ 0x0126
(0091) {
(0092) data=mton;//准备静音数据
0120 EA83 LDI R24,0xA3
0121 D2AF RCALL 0x03D1
(0093) muteon=0;
0122 2422 CLR R2
0123 922000C1 STS muteon,R2
(0094) }
0125 C009 RJMP 0x012F
(0095) else if(muteoff)//静音打开标记置位
0126 902000C2 LDS R2,muteoff
0128 2022 TST R2
0129 F029 BEQ 0x012F
(0096) {
(0097) data=mtoff;//准备静音打开数据
012A EB81 LDI R24,0xB1
012B D2A5 RCALL 0x03D1
(0098) muteoff=0;
012C 2422 CLR R2
012D 922000C2 STS muteoff,R2
(0099) }
(0100) req_flag=0;
012F 2422 CLR R2
0130 92200065 STS req_flag,R2
(0101) cmd_num=0;
0132 92200061 STS cmd_num,R2
(0102) }
(0103) if(cmd_flag)
0134 90200068 LDS R2,cmd_flag
0136 2022 TST R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -