📄 uart.lst
字号:
__start:
__text_start:
0043 E5CF LDI R28,0x5F
0044 E0D4 LDI R29,4
0045 BFCD OUT 0x3D,R28
0046 BFDE OUT 0x3E,R29
0047 51C0 SUBI R28,0x10
0048 40D0 SBCI R29,0
0049 EA0A LDI R16,0xAA
004A 8308 STD Y+0,R16
004B 2400 CLR R0
004C EBEF LDI R30,0xBF
004D E0F0 LDI R31,0
004E E010 LDI R17,0
004F 3BEF CPI R30,0xBF
0050 07F1 CPC R31,R17
0051 F011 BEQ 0x0054
0052 9201 ST R0,Z+
0053 CFFB RJMP 0x004F
0054 8300 STD Z+0,R16
0055 E2E6 LDI R30,0x26
0056 E0F0 LDI R31,0
0057 E6A0 LDI R26,0x60
0058 E0B0 LDI R27,0
0059 E010 LDI R17,0
005A 38E5 CPI R30,0x85
005B 07F1 CPC R31,R17
005C F021 BEQ 0x0061
005D 95C8 LPM
005E 9631 ADIW R30,1
005F 920D ST R0,X+
0060 CFF9 RJMP 0x005A
0061 D038 RCALL _main
_exit:
0062 CFFF RJMP _exit
FILE: E:\icc\iccavr\mega8\mega8\uart\uart.c
(0001) /******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* RS232通信演示程序 */
(0005) /* 作者:ntzwq@wx88.net */
(0006) /* 2002年5月10日 */
(0007) /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
(0008) /******************************************/
(0009) // 1、使用ICCAVR的终端调试窗口(Terminal),进行通信调试。
(0010) // 2、对ICCAVR的终端调试窗口进行设置,设置串口为com1或com2,
(0011) // 通信波特率为19200(Tools->Environment Options...)。
(0012) // 3、将PC屏幕光标定位于调试窗口中。
(0013) #include <iom8v.h>
(0014) #define fosc 8000000 //晶振8MHZ
(0015) #define baud 19200 //波特率
(0016) #define osc_address 0x1ff0
(0017) extern unsigned char read_flash(unsigned int add);
(0018) /* 字符输出函数 */
(0019) void putchar(unsigned char c)
(0020) {
(0021) while (!(UCSRA&(1<<UDRE)));
_putchar:
c --> R16
0063 9B5D SBIS 0x0B,5
0064 CFFE RJMP _putchar
(0022) UDR=c;
0065 B90C OUT 0x0C,R16
(0023) }
0066 9508 RET
(0024) /* 字符输入函数 */
(0025) unsigned char getchar(void)
(0026) {
(0027) while(!(UCSRA& (1<<RXC)));
_getchar:
0067 9B5F SBIS 0x0B,7
0068 CFFE RJMP _getchar
(0028) return UDR;
0069 B10C IN R16,0x0C
006A 9508 RET
_puts:
s --> R20
006B D05A RCALL push_gset1
006C 01A8 MOVW R20,R16
(0029) }
(0030) /* 字符串输出函数 */
(0031) int puts(char *s)
(0032) {
006D C005 RJMP 0x0073
(0033) while (*s)
(0034) {
(0035) putchar(*s);
006E 01FA MOVW R30,R20
006F 8100 LDD R16,Z+0
0070 DFF2 RCALL _putchar
(0036) s++;
0071 5F4F SUBI R20,0xFF
0072 4F5F SBCI R21,0xFF
0073 01FA MOVW R30,R20
0074 8020 LDD R2,Z+0
0075 2022 TST R2
0076 F7B9 BNE 0x006E
(0037) }
(0038) putchar(0x0a);//回车换行
0077 E00A LDI R16,0xA
0078 DFEA RCALL _putchar
(0039) putchar(0x0d);
0079 E00D LDI R16,0xD
007A DFE8 RCALL _putchar
(0040) return 1;
007B E001 LDI R16,1
007C E010 LDI R17,0
007D D04B RCALL pop_gset1
007E 9508 RET
_putstr:
s --> R20
007F D046 RCALL push_gset1
0080 01A8 MOVW R20,R16
(0041) }
(0042) /* 不含回车换行的字符串输出函数 */
(0043) void putstr(char *s)
(0044) {
0081 C005 RJMP 0x0087
(0045) while (*s)
(0046) {
(0047) putchar(*s);
0082 01FA MOVW R30,R20
0083 8100 LDD R16,Z+0
0084 DFDE RCALL _putchar
(0048) s++;
0085 5F4F SUBI R20,0xFF
0086 4F5F SBCI R21,0xFF
0087 01FA MOVW R30,R20
0088 8020 LDD R2,Z+0
0089 2022 TST R2
008A F7B9 BNE 0x0082
(0049) }
(0050) }
008B D03D RCALL pop_gset1
008C 9508 RET
(0051) /* UART初始化 */
(0052) void uart_init(void)
(0053) {
(0054) OSCCAL=read_flash(osc_address);
_uart_init:
008D EF00 LDI R16,0xF0
008E E11F LDI R17,0x1F
008F D031 RCALL _read_flash
0090 BF01 OUT 0x31,R16
(0055) UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
0091 E188 LDI R24,0x18
0092 B98A OUT 0x0A,R24
(0056) UBRRL=(fosc/16/(baud+1))%256;
0093 E18A LDI R24,0x1A
0094 B989 OUT 0x09,R24
(0057) UBRRH=(fosc/16/(baud+1))/256;
0095 2422 CLR R2
0096 BC20 OUT 0x20,R2
(0058) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
0097 E886 LDI R24,0x86
0098 BD80 OUT 0x20,R24
(0059) }
0099 9508 RET
(0060) /* RS232通信main函数 */
(0061) void main(void)
(0062) {
(0063) unsigned char i;
(0064) uart_init();
_main:
i --> R20
009A DFF2 RCALL _uart_init
(0065) puts("广州天河双龙电子公司RS232通信演示程序");
009B E909 LDI R16,0x99
009C E010 LDI R17,0
009D DFCD RCALL _puts
(0066) puts("HTTP://WWW.SL.COM.CN");
009E E804 LDI R16,0x84
009F E010 LDI R17,0
00A0 DFCA RCALL _puts
(0067) puts("MAIL TO:sllg@sl.com.cn");
00A1 E60D LDI R16,0x6D
00A2 E010 LDI R17,0
00A3 DFC7 RCALL _puts
00A4 C01A RJMP 0x00BF
(0068) while(1)
(0069) {
(0070) i=getchar();
00A5 DFC1 RCALL _getchar
00A6 2F40 MOV R20,R16
(0071) if (i!=0)//按PC键盘开始测试
00A7 2300 TST R16
00A8 F0B1 BEQ 0x00BF
(0072) {
(0073) putstr("当前按键是:");
00A9 E600 LDI R16,0x60
00AA E010 LDI R17,0
00AB DFD3 RCALL _putstr
(0074) putchar(i);
00AC 2F04 MOV R16,R20
00AD DFB5 RCALL _putchar
(0075) putchar(0x0a);
00AE E00A LDI R16,0xA
00AF DFB3 RCALL _putchar
(0076) putchar(0x0d);
00B0 E00D LDI R16,0xD
00B1 DFB1 RCALL _putchar
(0077) puts("广州天河双龙电子公司RS232通信演示程序");
00B2 E909 LDI R16,0x99
00B3 E010 LDI R17,0
00B4 DFB6 RCALL _puts
(0078) puts("HTTP://WWW.SL.COM.CN");
00B5 E804 LDI R16,0x84
00B6 E010 LDI R17,0
00B7 DFB3 RCALL _puts
(0079) puts("MAIL TO:sllg@sl.com.cn");
00B8 E60D LDI R16,0x6D
00B9 E010 LDI R17,0
00BA DFB0 RCALL _puts
(0080) putchar(0x0a);
00BB E00A LDI R16,0xA
00BC DFA6 RCALL _putchar
(0081) putchar(0x0d);
00BD E00D LDI R16,0xD
00BE DFA4 RCALL _putchar
00BF CFE5 RJMP 0x00A5
(0082) }
(0083) }
(0084) }
00C0 9508 RET
FILE: E:\icc\iccavr\mega8\mega8\uart\read_flash.s
(0001) ;unsigned char read_flash(unsigned int add);
(0002) _read_flash::
(0003) mov r31,r17
_read_flash:
00C1 2FF1 MOV R31,R17
(0004) mov r30,r16
00C2 2FE0 MOV R30,R16
(0005) lpm r16,z
00C3 9104 LPM R16,0(Z)
(0006) clr r17
00C4 2711 CLR R17
(0007) ret
FILE: <library>
00C5 9508 RET
push_gset1:
00C6 935A ST R21,-Y
00C7 934A ST R20,-Y
00C8 9508 RET
pop_gset1:
00C9 E0E1 LDI R30,1
pop:
00CA 9149 LD R20,Y+
00CB 9159 LD R21,Y+
00CC FDE0 SBRC R30,0
00CD 9508 RET
00CE 9169 LD R22,Y+
00CF 9179 LD R23,Y+
00D0 FDE1 SBRC R30,1
00D1 9508 RET
00D2 90A9 LD R10,Y+
00D3 90B9 LD R11,Y+
00D4 FDE2 SBRC R30,2
00D5 9508 RET
00D6 90C9 LD R12,Y+
00D7 90D9 LD R13,Y+
00D8 FDE3 SBRC R30,3
00D9 9508 RET
00DA 90E9 LD R14,Y+
00DB 90F9 LD R15,Y+
00DC 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -