⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsm.lst

📁 实现机于通讯芯片的电话接听 拨出 以及来电振领提示
💻 LST
📖 第 1 页 / 共 3 页
字号:
__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 + -