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

📄 usart.lst

📁 avr icc开发的avr单片机与pc机vb通讯控制程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0045 E5CF      LDI	R28,0x5F
    0046 E0D4      LDI	R29,4
    0047 BFCD      OUT	0x3D,R28
    0048 BFDE      OUT	0x3E,R29
    0049 51C0      SUBI	R28,0x10
    004A 40D0      SBCI	R29,0
    004B EA0A      LDI	R16,0xAA
    004C 8308      STD	Y+0,R16
    004D 2400      CLR	R0
    004E E9E6      LDI	R30,0x96
    004F E0F0      LDI	R31,0
    0050 E010      LDI	R17,0
    0051 3AE2      CPI	R30,0xA2
    0052 07F1      CPC	R31,R17
    0053 F011      BEQ	0x0056
    0054 9201      ST	R0,Z+
    0055 CFFB      RJMP	0x0051
    0056 8300      STD	Z+0,R16
    0057 E5E4      LDI	R30,0x54
    0058 E0F0      LDI	R31,0
    0059 E6A0      LDI	R26,0x60
    005A E0B0      LDI	R27,0
    005B E010      LDI	R17,0
    005C 38EA      CPI	R30,0x8A
    005D 07F1      CPC	R31,R17
    005E F021      BEQ	0x0063
    005F 95C8      LPM
    0060 9631      ADIW	R30,1
    0061 920D      ST	R0,X+
    0062 CFF9      RJMP	0x005C
    0063 D127      RCALL	_main
_exit:
    0064 CFFF      RJMP	_exit
FILE: D:\dai\AVR_USART\usart.c
(0001) #define USART_C
(0002) #include "includes.h"
(0003) void UsartInit(void)
(0004) {
(0005)     // 晶振频率 : 4.0MHz
(0006)     // 通信参数:  9600  8 Data, 1 Stop, No Parity 
(0007)     // 波特率:
(0008)     // UBRRL= 0x0C    19200;
(0009)     // UBRRL= 0x19    9600;
(0010)     // UBRRL= 0x33    4800;
(0011)     // UBRRL= 0x67    2400	
(0012)     UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);  //允许发送和接收,接收中断使能
_UsartInit:
    0065 B18A      IN	R24,0x0A
    0066 6988      ORI	R24,0x98
    0067 B98A      OUT	0x0A,R24
(0013)     UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据位+1位停止位
    0068 B580      IN	R24,0x20
    0069 6886      ORI	R24,0x86
    006A BD80      OUT	0x20,R24
(0014)     UBRRH = 0x00; 
    006B 2422      CLR	R2
    006C BC20      OUT	0x20,R2
(0015)     UBRRL = 0x19;  
    006D E189      LDI	R24,0x19
    006E B989      OUT	0x09,R24
    006F 9508      RET
_PutChar:
  c                    --> R20
    0070 D18B      RCALL	push_gset1
    0071 2F40      MOV	R20,R16
(0016)     //sei();
(0017) }
(0018) 
(0019) int PutChar(char c)
(0020) {
(0021)     if(c == '\n')
    0072 304A      CPI	R20,0xA
    0073 F411      BNE	0x0076
(0022)     {
(0023)         PutChar('\r');
    0074 E00D      LDI	R16,0xD
    0075 DFFA      RCALL	_PutChar
(0024)     }
(0025)     UDR = c;
    0076 B94C      OUT	0x0C,R20
(0026)     while(!(UCSRA &(1<<UDRE)));
    0077 9B5D      SBIS	0x0B,5
    0078 CFFE      RJMP	0x0077
(0027)     UCSRA |= (1<<UDRE);
    0079 9A5D      SBI	0x0B,5
(0028)     return 0;
    007A 2700      CLR	R16
    007B 2711      CLR	R17
    007C D182      RCALL	pop_gset1
    007D 9508      RET
_SendNbyte:
  w                    --> R20
  L                    --> R22
  p                    --> R10
    007E D179      RCALL	push_gset3
    007F 2F62      MOV	R22,R18
    0080 0158      MOVW	R10,R16
(0029) }
(0030) 
(0031) 
(0032) void SendNbyte(unsigned char *p,unsigned char L)
(0033) {
(0034)     unsigned char w;
(0035)     for(w=0;w<L;w++)
    0081 2744      CLR	R20
    0082 C007      RJMP	0x008A
(0036)     {
(0037)        // UDR = *(p+w);
(0038)        // while(!(UCSRA &(1<<UDRE)));
(0039)         //UCSRA |= (1<<UDRE);
(0040)         PutChar(*(p+w));
    0083 2FE4      MOV	R30,R20
    0084 27FF      CLR	R31
    0085 0DEA      ADD	R30,R10
    0086 1DFB      ADC	R31,R11
    0087 8100      LDD	R16,Z+0
    0088 DFE7      RCALL	_PutChar
    0089 9543      INC	R20
    008A 1746      CP	R20,R22
    008B F3B8      BCS	0x0083
    008C D165      RCALL	pop_gset3
    008D 9508      RET
_PutStr:
  Str                  --> R20
    008E D16D      RCALL	push_gset1
    008F 01A8      MOVW	R20,R16
(0041)     }
(0042)     
(0043) }
(0044) 
(0045) void PutStr(unsigned char *Str)
(0046) {
    0090 C005      RJMP	0x0096
(0047)     while(*Str != '\0')
(0048)     {
(0049)         PutChar(*Str);
    0091 01FA      MOVW	R30,R20
    0092 8100      LDD	R16,Z+0
    0093 DFDC      RCALL	_PutChar
(0050)         Str++;
    0094 5F4F      SUBI	R20,0xFF
    0095 4F5F      SBCI	R21,0xFF
    0096 01FA      MOVW	R30,R20
    0097 8020      LDD	R2,Z+0
    0098 2022      TST	R2
    0099 F7B9      BNE	0x0091
    009A D164      RCALL	pop_gset1
    009B 9508      RET
FILE: D:\dai\AVR_USART\delay.c
(0001) #define DELAY_C
(0002) #include "includes.h"
(0003) #define XTAL 4    //晶振频率,单位MHz
(0004) void delay_1us(void)                 //1us延时函数
(0005)   {
(0006)    asm("nop");
_delay_1us:
    009C 0000      NOP
    009D 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    009E D15B      RCALL	push_gset2
    009F 01B8      MOVW	R22,R16
(0007)   }
(0008) 
(0009) void delay_nus(unsigned int n)       //N us延时函数
(0010)   {
(0011)    unsigned int i=0;
    00A0 2744      CLR	R20
    00A1 2755      CLR	R21
(0012)    for (i=0;i<n;i++)
    00A2 C003      RJMP	0x00A6
(0013)    delay_1us();
    00A3 DFF8      RCALL	_delay_1us
    00A4 5F4F      SUBI	R20,0xFF
    00A5 4F5F      SBCI	R21,0xFF
    00A6 1746      CP	R20,R22
    00A7 0757      CPC	R21,R23
    00A8 F3D0      BCS	0x00A3
    00A9 D146      RCALL	pop_gset2
    00AA 9508      RET
(0014)   }
(0015)   
(0016) void delay_1ms(void)                 //1ms延时函数
(0017)   {
(0018)    unsigned int i;
(0019)    for (i=0;i<(unsigned int)(XTAL*143-2);i++);
_delay_1ms:
  i                    --> R16
    00AB 2700      CLR	R16
    00AC 2711      CLR	R17
    00AD C002      RJMP	0x00B0
    00AE 5F0F      SUBI	R16,0xFF
    00AF 4F1F      SBCI	R17,0xFF
    00B0 330A      CPI	R16,0x3A
    00B1 E0E2      LDI	R30,2
    00B2 071E      CPC	R17,R30
    00B3 F3D0      BCS	0x00AE
    00B4 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    00B5 D144      RCALL	push_gset2
    00B6 01B8      MOVW	R22,R16
(0020)   }
(0021)   
(0022) void delay_nms(unsigned int n)       //N ms延时函数
(0023)   {
(0024)    unsigned int i=0;
    00B7 2744      CLR	R20
    00B8 2755      CLR	R21
(0025)    for (i=0;i<n;i++)
    00B9 C003      RJMP	0x00BD
(0026)    {
(0027)       delay_1ms();
    00BA DFF0      RCALL	_delay_1ms
    00BB 5F4F      SUBI	R20,0xFF
    00BC 4F5F      SBCI	R21,0xFF
    00BD 1746      CP	R20,R22
    00BE 0757      CPC	R21,R23
    00BF F3D0      BCS	0x00BA
    00C0 D12F      RCALL	pop_gset2
    00C1 9508      RET
FILE: D:\dai\AVR_USART\LCD.c
(0001) // ************************************************
(0002) // *** 采用4位数据线的1602液晶驱动程序 ***
(0003) // *** LCD.C ***
(0004) // ************************************************
(0005) #define ENABLE_BIT_DEFINITIONS
(0006) #define LCD_C
(0007) #include "includes.h"
(0008) // ***** Define I/O pins ***** //
(0009) #define BIT7 0x80
(0010) #define BIT6 0x40
(0011) #define BIT5 0x20
(0012) #define BIT4 0x10
(0013) #define BIT3 0x08
(0014) #define BIT2 0x04
(0015) #define BIT1 0x02
(0016) #define BIT0 0x01
(0017) // *** Set port for LCD Data Bus 8 bit mode *** //
(0018) #define LCD_OP_PORT PORTB
(0019) #define LCD_IP_PORT PINB
(0020) #define LCD_DIR_PORT DDRB
(0021) // *** Set LCD Enable Port and Bit values *** //
(0022) //#define LCD_EN LCD_OP_PORT.2
(0023) // *** Set LCD Register Select Port and Bit values *** //
(0024) //#define LCD_RS LCD_OP_PORT.0
(0025) // *** Set LCD Read/Write Port and Bit values *** //
(0026) //#define LCD_RW LCD_OP_PORT.1
(0027) /****************************************************************/
(0028)  
(0029)  #define LCD_EN  (1 << 2)     //引脚定义
(0030)  #define LCD_RS (1 << 0)
(0031)  #define LCD_RW (1 << 1)
(0032)  
(0033)  #define lcd_set_e()  (LCD_OP_PORT |= LCD_EN)   //置位与清零
(0034)  #define lcd_set_rs() (LCD_OP_PORT |= LCD_RS)
(0035)  #define lcd_set_rw() (LCD_OP_PORT |= LCD_RW)
(0036)  #define lcd_clear_e()  (LCD_OP_PORT &= ~LCD_EN)
(0037)  #define lcd_clear_rs() (LCD_OP_PORT &= ~LCD_RS)
(0038)  #define lcd_clear_rw() (LCD_OP_PORT &= ~LCD_RW)
(0039) /****************************************************************/
(0040) 
(0041) #define LCD_ON 0x0C
(0042) #define LCD_CURS_ON 0x0D
(0043) #define LCD_OFF 0x08
(0044) #define LCD_HOME 0x02
(0045) #define LCD_CLEAR 0x01
(0046) #define LCD_NEW_LINE 0xC0
(0047) #define LCD_FUNCTION_SET 0x28
(0048) #define LCD_MODE_SET 0x06
(0049) 
(0050) 
(0051) void LCD_INIT(void)
(0052) {
(0053) LCD_DIR_PORT = 0xff; // LCD port output
_LCD_INIT:
    00C2 EF8F      LDI	R24,0xFF
    00C3 BB87      OUT	0x17,R24
(0054) LCD_OP_PORT = 0x30; // Load high-data to port
    00C4 E380      LDI	R24,0x30
    00C5 BB88      OUT	0x18,R24
(0055) lcd_clear_rw(); // Set LCD to write
    00C6 98C1      CBI	0x18,1
(0056) lcd_clear_rs(); // Set LCD to command
    00C7 98C0      CBI	0x18,0
    00C8 940E0213  CALL	<created procedures>
(0057) lcd_set_e(); // Write data to LCD
(0058) asm("nop");
(0059) asm("nop");
(0060) lcd_clear_e(); // Disable LCD
(0061) delay_nus(40);
    00CA E208      LDI	R16,0x28
    00CB E010      LDI	R17,0
    00CC DFD1      RCALL	_delay_nus
(0062) lcd_clear_rw() ; // Set LCD to write
    00CD 98C1      CBI	0x18,1
(0063) lcd_clear_rs(); // Set LCD to command
    00CE 98C0      CBI	0x18,0
    00CF 940E0213  CALL	<created procedures>
(0064) lcd_set_e(); // Write data to LCD
(0065) asm("nop");
(0066) asm("nop");
(0067) lcd_clear_e(); // Disable LCD
(0068) delay_nus(40);
    00D1 E208      LDI	R16,0x28
    00D2 E010      LDI	R17,0
    00D3 DFCA      RCALL	_delay_nus
    00D4 940E0213  CALL	<created procedures>
(0069) lcd_set_e(); // Write data to LCD
(0070) asm("nop");
(0071) asm("nop");
(0072) lcd_clear_e(); // Disable LCD
(0073) delay_nus(40);
    00D6 E208      LDI	R16,0x28
    00D7 E010      LDI	R17,0
    00D8 DFC5      RCALL	_delay_nus
(0074) LCD_OP_PORT = 0x20;
    00D9 E280      LDI	R24,0x20
    00DA BB88      OUT	0x18,R24
    00DB 940E0213  CALL	<created procedures>
(0075) lcd_set_e(); // Write data to LCD
(0076) asm("nop");
(0077) asm("nop");
(0078) lcd_clear_e(); // Disable LCD
(0079) delay_nus(40);
    00DD E208      LDI	R16,0x28
    00DE E010      LDI	R17,0
    00DF DFBE      RCALL	_delay_nus
    00E0 9508      RET
_LCD_Busy:
  low                  --> R20
  high                 --> R22
  temp                 --> R10
    00E1 D116      RCALL	push_gset3
(0080) }
(0081) //*****************************************************//
(0082) // This routine will return the busy flag from the LCD //
(0083) //*****************************************************//
(0084) void LCD_Busy ( void )
(0085) {
(0086) unsigned char temp,high;
(0087) unsigned char low;
(0088) LCD_DIR_PORT = 0x0f; // Make I/O Port input
    00E2 E08F      LDI	R24,0xF
    00E3 BB87      OUT	0x17,R24
(0089) do
(0090) {
(0091) temp=LCD_OP_PORT;
    00E4 B2A8      IN	R10,0x18
(0092) temp=temp&BIT3;
    00E5 2D8A      MOV	R24,R10
    00E6 7088      ANDI	R24,0x8
    00E7 2EA8      MOV	R10,R24
(0093) LCD_OP_PORT=temp;
    00E8 BB88      OUT	0x18,R24
(0094) lcd_set_rw(); // Set LCD to READ
    00E9 9AC1      SBI	0x18,1
(0095) lcd_clear_rs();
    00EA 98C0      CBI	0x18,0
(0096) lcd_set_e();
    00EB 9AC2      SBI	0x18,2
(0097) delay_nus(3);
    00EC E003      LDI	R16,3
    00ED E010      LDI	R17,0
    00EE DFAF      RCALL	_delay_nus
(0098) high = LCD_IP_PORT; // read the high nibble.
    00EF B366      IN	R22,0x16
(0099) lcd_clear_e(); // Disable LCD
    00F0 98C2      CBI	0x18,2
(0100) lcd_set_e();
    00F1 9AC2      SBI	0x18,2
(0101) asm("nop");
    00F2 0000      NOP
(0102) asm("nop");
    00F3 0000      NOP
(0103) low = LCD_IP_PORT; // read the low nibble.
    00F4 B346      IN	R20,0x16
(0104) lcd_clear_e(); // Disable LCD
    00F5 98C2      CBI	0x18,2
(0105) } while(high & 0x80);
    00F6 FD67      SBRC	R22,7
    00F7 CFEC      RJMP	0x00E4
(0106) delay_nus(20);
    00F8 E104      LDI	R16,0x14
    00F9 E010      LDI	R17,0
    00FA DFA3      RCALL	_delay_nus
    00FB D0F6      RCALL	pop_gset3
    00FC 9508      RET
_LCD_WriteControl:
  temp                 --> R20
  CMD                  --> R22
    00FD D0FC      RCALL	push_gset2
    00FE 2F60      MOV	R22,R16
(0107) }
(0108) // ********************************************** //
(0109) // *** Write a control instruction to the LCD *** //
(0110) // ********************************************** //
(0111) void LCD_WriteControl (unsigned char CMD)
(0112) {
(0113) char temp;
(0114) LCD_Busy(); // Test if LCD busy
    00FF DFE1      RCALL	_LCD_Busy
    0100 940E0218  CALL	0x218
(0115) LCD_DIR_PORT = 0xff; // LCD port output
(0116) temp=LCD_OP_PORT;
(0117) temp=temp&BIT3;
(0118) LCD_OP_PORT =(CMD & 0xf0)|temp; // Load high-data to port
(0119) lcd_clear_rw(); // Set LCD to write
(0120) lcd_clear_rs(); // Set LCD to command
    0102 98C0      CBI	0x18,0
    0103 940E0213  CALL	<created procedures>
    0105 940E0222  CALL	0x222
(0121) lcd_set_e(); // Write data to LCD
(0122) asm("nop");
(0123) asm("nop");
(0124) lcd_clear_e(); // Disable LCD
(0125) LCD_OP_PORT =(CMD<<4)|temp; // Load low-data to port
(0126) lcd_clear_rw(); // Set LCD to write
(0127) lcd_clear_rs(); // Set LCD to command
    0107 98C0      CBI	0x18,0
    0108 940E0213  CALL	<created procedures>
(0128) lcd_set_e(); // Write data to LCD
(0129) asm("nop");
(0130) asm("nop");
(0131) lcd_clear_e(); // Disable LCD
    010A D0E5      RCALL	pop_gset2
    010B 9508      RET
_LCD_WriteData:
  temp                 --> R20
  Data                 --> R22
    010C D0ED      RCALL	push_gset2
    010D 2F60      MOV	R22,R16
(0132) }
(0133) // ***************************************** //
(0134) // *** Write one byte of data to the LCD *** //
(0135) // ***************************************** //
(0136) void LCD_WriteData (unsigned char Data)
(0137) {
(0138) char temp;
(0139) LCD_Busy(); // Test if LCD Busy
    010E DFD2      RCALL	_LCD_Busy
    010F 940E0218  CALL	0x218
(0140) LCD_DIR_PORT = 0xFF; // LCD port output
(0141) temp=LCD_OP_PORT;
(0142) temp=temp&BIT3;
(0143) LCD_OP_PORT =(Data & 0xf0)|temp; // Load high-data to port
(0144) lcd_clear_rw() ; // Set LCD to write
(0145) lcd_set_rs(); // Set LCD to data
    0111 9AC0      SBI	0x18,0
    0112 940E0213  CALL	<created procedures>
    0114 940E0222  CALL	0x222
(0146) lcd_set_e(); // Write data to LCD
(0147) asm("nop");
(0148) asm("nop");
(0149) lcd_clear_e(); // Disable LCD
(0150) LCD_OP_PORT = (Data << 4)|temp; // Load low-data to port
(0151) lcd_clear_rw() ; // Set LCD to write

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -