📄 usart.lst
字号:
(0152) lcd_set_rs(); // Set LCD to data
0116 9AC0 SBI 0x18,0
0117 940E0213 CALL <created procedures>
(0153) lcd_set_e(); // Write data to LCD
(0154) asm("nop");
(0155) asm("nop");
(0156) lcd_clear_e(); // Disable LCD
0119 D0D6 RCALL pop_gset2
011A 9508 RET
(0157) }
(0158) // ********************************* //
(0159) // *** Initialize the LCD driver *** //
(0160) // ********************************* //
(0161) void Init_LCD(void)
(0162) {
(0163) LCD_INIT();
_Init_LCD:
011B DFA6 RCALL _LCD_INIT
(0164) LCD_WriteControl (LCD_FUNCTION_SET);
011C E208 LDI R16,0x28
011D DFDF RCALL _LCD_WriteControl
(0165) LCD_WriteControl (LCD_OFF);
011E E008 LDI R16,0x8
011F DFDD RCALL _LCD_WriteControl
(0166) LCD_WriteControl (LCD_CLEAR);
0120 E001 LDI R16,1
0121 DFDB RCALL _LCD_WriteControl
(0167) LCD_WriteControl (LCD_MODE_SET);
0122 E006 LDI R16,6
0123 DFD9 RCALL _LCD_WriteControl
(0168) LCD_WriteControl (LCD_ON);
0124 E00C LDI R16,0xC
0125 DFD7 RCALL _LCD_WriteControl
(0169) LCD_WriteControl (LCD_HOME);
0126 E002 LDI R16,2
0127 DFD5 RCALL _LCD_WriteControl
0128 9508 RET
(0170) }
(0171) // ************************************************ //
(0172) // *** Clear the LCD screen (also homes cursor) *** //
(0173) // ************************************************ //
(0174) void LCD_Clear(void)
(0175) {
(0176) LCD_WriteControl(0x01);
_LCD_Clear:
0129 E001 LDI R16,1
012A DFD2 RCALL _LCD_WriteControl
012B 9508 RET
(0177) }
(0178) // *********************************************** //
(0179) // *** Position the LCD cursor at row 1, col 1 *** //
(0180) // *********************************************** //
(0181) void LCD_Home(void)
(0182) {
(0183) LCD_WriteControl(0x02);
_LCD_Home:
012C E002 LDI R16,2
012D DFCF RCALL _LCD_WriteControl
012E 9508 RET
_LCD_DisplayCharacter:
Char --> R20
012F D0CC RCALL push_gset1
0130 2F40 MOV R20,R16
(0184) }
(0185) // ****************************************************************** //
(0186) // *** Display a single character, at the current cursor location *** //
(0187) // ****************************************************************** //
(0188) void LCD_DisplayCharacter (char Char)
(0189) {
(0190) LCD_WriteData (Char);
0131 2F04 MOV R16,R20
0132 DFD9 RCALL _LCD_WriteData
0133 D0CB RCALL pop_gset1
0134 9508 RET
_LCD_DisplayString_F:
string --> R20
column --> R10
row --> R22
0135 D0C2 RCALL push_gset3
0136 940E0229 CALL 0x229
(0191) }
(0192) // ********************************************************************* //
(0193) // *** Display a string at the specified row and column, using FLASH *** //
(0194) // ********************************************************************* //
(0195) void LCD_DisplayString_F (char row, char column , unsigned char const *string)
(0196) {
(0197) LCD_Cursor (row, column);
0138 D01C RCALL _LCD_Cursor
0139 C006 RJMP 0x0140
(0198) while (*string)
(0199) {
(0200) LCD_DisplayCharacter (*string++);
013A 011A MOVW R2,R20
013B 5F4F SUBI R20,0xFF
013C 4F5F SBCI R21,0xFF
013D 01F1 MOVW R30,R2
013E 9104 LPM R16,0(Z)
013F DFEF RCALL _LCD_DisplayCharacter
0140 01FA MOVW R30,R20
0141 91E4 LPM R30,0(Z)
0142 23EE TST R30
0143 F7B1 BNE 0x013A
0144 D0AD RCALL pop_gset3
0145 9508 RET
_LCD_DisplayString:
string --> R20
column --> R10
row --> R22
0146 D0B1 RCALL push_gset3
0147 940E0229 CALL 0x229
(0201) }
(0202) }
(0203) // ******************************************************************* //
(0204) // *** Display a string at the specified row and column, using RAM *** //
(0205) // ******************************************************************* //
(0206) void LCD_DisplayString (char row, char column ,unsigned char *string)
(0207) {
(0208) LCD_Cursor (row, column);
0149 D00B RCALL _LCD_Cursor
014A C004 RJMP 0x014F
(0209) while (*string)
(0210) LCD_DisplayCharacter (*string++);
014B 01FA MOVW R30,R20
014C 9101 LD R16,Z+
014D 01AF MOVW R20,R30
014E DFE0 RCALL _LCD_DisplayCharacter
014F 01FA MOVW R30,R20
0150 8020 LDD R2,Z+0
0151 2022 TST R2
0152 F7C1 BNE 0x014B
0153 D09E RCALL pop_gset3
0154 9508 RET
_LCD_Cursor:
column --> R20
row --> R22
0155 D0A4 RCALL push_gset2
0156 2F42 MOV R20,R18
0157 2F60 MOV R22,R16
(0211) }
(0212) // *************************************************** //
(0213) // *** Position the LCD cursor at "row", "column". *** //
(0214) // *************************************************** //
(0215) void LCD_Cursor (char row, char column)
(0216) {
(0217) switch (row) {
0158 2777 CLR R23
0159 3061 CPI R22,1
015A E0E0 LDI R30,0
015B 077E CPC R23,R30
015C F069 BEQ 0x016A
015D 3062 CPI R22,2
015E E0E0 LDI R30,0
015F 077E CPC R23,R30
0160 F071 BEQ 0x016F
0161 3063 CPI R22,3
0162 E0E0 LDI R30,0
0163 077E CPC R23,R30
0164 F079 BEQ 0x0174
0165 3064 CPI R22,4
0166 E0E0 LDI R30,0
0167 077E CPC R23,R30
0168 F081 BEQ 0x0179
0169 C013 RJMP 0x017D
(0218) case 1: LCD_WriteControl (0x80 + column - 1); break;
016A 2F04 MOV R16,R20
016B 5800 SUBI R16,0x80
016C 5001 SUBI R16,1
016D DF8F RCALL _LCD_WriteControl
016E C00E RJMP 0x017D
(0219) case 2: LCD_WriteControl (0xc0 + column - 1); break;
016F 2F04 MOV R16,R20
0170 5400 SUBI R16,0x40
0171 5001 SUBI R16,1
0172 DF8A RCALL _LCD_WriteControl
0173 C009 RJMP 0x017D
(0220) case 3: LCD_WriteControl (0x94 + column - 1); break;
0174 2F04 MOV R16,R20
0175 560C SUBI R16,0x6C
0176 5001 SUBI R16,1
0177 DF85 RCALL _LCD_WriteControl
0178 C004 RJMP 0x017D
(0221) case 4: LCD_WriteControl (0xd4 + column - 1); break;
0179 2F04 MOV R16,R20
017A 520C SUBI R16,0x2C
017B 5001 SUBI R16,1
017C DF80 RCALL _LCD_WriteControl
(0222) default: break;
017D D072 RCALL pop_gset2
017E 9508 RET
(0223) }
(0224) }
(0225) // ************************** //
(0226) // *** Turn the cursor on *** //
(0227) // ************************** //
(0228) void LCD_Cursor_On (void)
(0229) {
(0230) LCD_WriteControl (LCD_CURS_ON);
_LCD_Cursor_On:
017F E00D LDI R16,0xD
0180 DF7C RCALL _LCD_WriteControl
0181 9508 RET
(0231) }
(0232) // *************************** //
(0233) // *** Turn the cursor off *** //
(0234) // *************************** //
(0235) void LCD_Cursor_Off (void)
(0236) {
(0237) LCD_WriteControl (LCD_ON);
_LCD_Cursor_Off:
0182 E00C LDI R16,0xC
0183 DF79 RCALL _LCD_WriteControl
0184 9508 RET
(0238) }
(0239) // ******************** //
(0240) // *** Turn Off LCD *** //
(0241) // ******************** //
(0242) void LCD_Display_Off (void)
(0243) {
(0244) LCD_WriteControl(LCD_OFF);
_LCD_Display_Off:
0185 E008 LDI R16,0x8
0186 DF76 RCALL _LCD_WriteControl
0187 9508 RET
(0245) }
(0246) // ******************* //
(0247) // *** Turn On LCD *** //
(0248) // ******************* //
(0249) void LCD_Display_On (void)
(0250) {
(0251) LCD_WriteControl(LCD_ON);
_LCD_Display_On:
0188 E00C LDI R16,0xC
0189 DF73 RCALL _LCD_WriteControl
018A 9508 RET
_main:
msg --> R20
018B 9722 SBIW R28,2
FILE: D:\dai\AVR_USART\main.c
(0001) #define MAIN_C
(0002) #include "includes.h"
(0003) /***************************/
(0004) /*串口通信*/
(0005) /*晶振为4MHz*/
(0006) /*波特率为9600bps*/
(0007) /*发送采用查询方式,接收采用中断方式*/
(0008) /*当收到的字符达到所定义的长度时,则在LCD上显示收到的字符*/
(0009) /***************************/
(0010) #define BufSize 10
(0011) unsigned char RsBuf[BufSize]; //定义接收缓冲器
(0012) int RsBytes = 0;
(0013) unsigned char flag = 0;
(0014) void main(void)
(0015) {
(0016) unsigned char *msg = "Usart Test!\n";
018C E849 LDI R20,0x89
018D E050 LDI R21,0
(0017) SREG |= (1<<7); //使能全局中断
018E 9478 BSET 7
(0018) UsartInit();
018F DED5 RCALL _UsartInit
(0019) Init_LCD();
0190 DF8A RCALL _Init_LCD
(0020) SendNbyte(msg,12);
0191 E02C LDI R18,0xC
0192 018A MOVW R16,R20
0193 DEEA RCALL _SendNbyte
(0021) PutStr("Test Ok\n");
0194 E800 LDI R16,0x80
0195 E010 LDI R17,0
0196 DEF7 RCALL _PutStr
(0022) LCD_DisplayString(1,1,"Usart Test!");
0197 E784 LDI R24,0x74
0198 940E0230 CALL 0x230
019A E001 LDI R16,1
019B DFAA RCALL _LCD_DisplayString
(0023) delay_nms(2000);
019C ED00 LDI R16,0xD0
019D E017 LDI R17,7
019E DF16 RCALL _delay_nms
(0024) LCD_Clear();
019F DF89 RCALL _LCD_Clear
(0025) LCD_DisplayString(1,1,"Recive is :");
01A0 E688 LDI R24,0x68
01A1 940E0230 CALL 0x230
01A3 E001 LDI R16,1
01A4 DFA1 RCALL _LCD_DisplayString
01A5 C016 RJMP 0x01BC
(0026) while(1)
(0027) {PORTA =UDR-0x30 ;
01A6 B18C IN R24,0x0C
01A7 5380 SUBI R24,0x30
01A8 BB8B OUT 0x1B,R24
(0028) DDRA = 0xff;
01A9 EF8F LDI R24,0xFF
01AA BB8A OUT 0x1A,R24
(0029) if(flag)
01AB 90200067 LDS R2,flag
01AD 2022 TST R2
01AE F069 BEQ 0x01BC
(0030) {
(0031) PutStr(RsBuf);
01AF E906 LDI R16,0x96
01B0 E010 LDI R17,0
01B1 DEDC RCALL _PutStr
(0032)
(0033) LCD_DisplayString(2,1,RsBuf);
01B2 E986 LDI R24,0x96
01B3 940E0230 CALL 0x230
01B5 E002 LDI R16,2
01B6 DF8F RCALL _LCD_DisplayString
(0034) PutChar('\n');
01B7 E00A LDI R16,0xA
01B8 DEB7 RCALL _PutChar
(0035) flag = 0;
01B9 2422 CLR R2
01BA 92200067 STS flag,R2
01BC CFE9 RJMP 0x01A6
01BD 9622 ADIW R28,2
01BE 9508 RET
_uart0_rx_isr:
01BF 922A ST R2,-Y
01C0 923A ST R3,-Y
01C1 938A ST R24,-Y
01C2 939A ST R25,-Y
01C3 93EA ST R30,-Y
01C4 93FA ST R31,-Y
01C5 B62F IN R2,0x3F
01C6 922A ST R2,-Y
(0036) }
(0037) }
(0038) }
(0039)
(0040) //接收中断子程序
(0041)
(0042)
(0043)
(0044) #pragma interrupt_handler uart0_rx_isr:12
(0045) void uart0_rx_isr(void)
(0046) {
(0047) //uart has received a character in UDR
(0048) RsBuf[RsBytes] = UDR;
01C7 E986 LDI R24,0x96
01C8 E090 LDI R25,0
01C9 91E00065 LDS R30,RsBytes
01CB 91F00066 LDS R31,RsBytes+1
01CD 0FE8 ADD R30,R24
01CE 1FF9 ADC R31,R25
01CF B02C IN R2,0x0C
01D0 8220 STD Z+0,R2
(0049) RsBytes ++;
01D1 91800065 LDS R24,RsBytes
01D3 91900066 LDS R25,RsBytes+1
01D5 9601 ADIW R24,1
01D6 93900066 STS RsBytes+1,R25
01D8 93800065 STS RsBytes,R24
(0050) // PutChar(RsBuf[RsBytes]); //回显
(0051) if(RsBytes >= BufSize)
01DA 308A CPI R24,0xA
01DB E0E0 LDI R30,0
01DC 079E CPC R25,R30
01DD F04C BLT 0x01E7
(0052) {
(0053) flag = 1;
01DE E081 LDI R24,1
01DF 93800067 STS flag,R24
(0054) RsBytes = 0;
01E1 2422 CLR R2
01E2 2433 CLR R3
01E3 92300066 STS RsBytes+1,R3
01E5 92200065 STS RsBytes,R2
(0055) }
FILE: <library>
01E7 9029 LD R2,Y+
01E8 BE2F OUT 0x3F,R2
01E9 91F9 LD R31,Y+
01EA 91E9 LD R30,Y+
01EB 9199 LD R25,Y+
01EC 9189 LD R24,Y+
01ED 9039 LD R3,Y+
01EE 9029 LD R2,Y+
01EF 9518 RETI
pop_gset2:
01F0 E0E2 LDI R30,2
01F1 C00E RJMP pop
pop_gset3:
01F2 E0E4 LDI R30,4
01F3 C00C RJMP pop
push_gset5:
01F4 92FA ST R15,-Y
01F5 92EA ST R14,-Y
push_gset4:
01F6 92DA ST R13,-Y
01F7 92CA ST R12,-Y
push_gset3:
01F8 92BA ST R11,-Y
01F9 92AA ST R10,-Y
push_gset2:
01FA 937A ST R23,-Y
01FB 936A ST R22,-Y
push_gset1:
01FC 935A ST R21,-Y
01FD 934A ST R20,-Y
01FE 9508 RET
pop_gset1:
01FF E0E1 LDI R30,1
pop:
0200 9149 LD R20,Y+
0201 9159 LD R21,Y+
0202 FDE0 SBRC R30,0
0203 9508 RET
0204 9169 LD R22,Y+
0205 9179 LD R23,Y+
0206 FDE1 SBRC R30,1
0207 9508 RET
0208 90A9 LD R10,Y+
0209 90B9 LD R11,Y+
020A FDE2 SBRC R30,2
020B 9508 RET
020C 90C9 LD R12,Y+
020D 90D9 LD R13,Y+
020E FDE3 SBRC R30,3
020F 9508 RET
0210 90E9 LD R14,Y+
0211 90F9 LD R15,Y+
0212 9508 RET
<created procedures>:
0213 9AC2 SBI 0x18,2
0214 0000 NOP
0215 0000 NOP
0216 98C2 CBI 0x18,2
0217 9508 RET
0218 EF8F LDI R24,0xFF
0219 BB87 OUT 0x17,R24
021A B348 IN R20,0x18
021B 7048 ANDI R20,0x8
021C 2F86 MOV R24,R22
021D 7F80 ANDI R24,0xF0
021E 2B84 OR R24,R20
021F BB88 OUT 0x18,R24
0220 98C1 CBI 0x18,1
0221 9508 RET
0222 2F86 MOV R24,R22
0223 708F ANDI R24,0xF
0224 9582 SWAP R24
0225 2B84 OR R24,R20
0226 BB88 OUT 0x18,R24
0227 98C1 CBI 0x18,1
0228 9508 RET
0229 2EA2 MOV R10,R18
022A 2F60 MOV R22,R16
022B 814E LDD R20,Y+6
022C 815F LDD R21,Y+7
022D 2D2A MOV R18,R10
022E 2F06 MOV R16,R22
022F 9508 RET
0230 E090 LDI R25,0
0231 8399 STD Y+1,R25
0232 8388 STD Y+0,R24
0233 E021 LDI R18,1
0234 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -