📄 usart.lst
字号:
__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 + -