📄 uart.lst
字号:
__text_start:
__start:
005A EFCF LDI R28,0xFF
005B E1D0 LDI R29,0x10
005C BFCD OUT P3D,R28
005D BFDE OUT P3E,R29
005E 51C0 SUBI R28,0x10
005F 40D0 SBCI R29,0
0060 EA0A LDI R16,0xAA
0061 8308 STD R16,0+Y
0062 2400 CLR R0
0063 E2E7 LDI R30,0x27
0064 E0F1 LDI R31,1
0065 E011 LDI R17,1
0066 33EB CPI R30,0x3B
0067 07F1 CPC R31,R17
0068 F011 BEQ 0x006B
0069 9201 ST R0,Z+
006A CFFB RJMP 0x0066
006B 8300 STD R16,0+Z
006C E8EC LDI R30,0x8C
006D E0F0 LDI R31,0
006E E0A0 LDI R26,0
006F E0B1 LDI R27,1
0070 E010 LDI R17,0
0071 3BE3 CPI R30,0xB3
0072 07F1 CPC R31,R17
0073 F021 BEQ 0x0078
0074 95C8 LPM
0075 9631 ADIW R30,1
0076 920D ST R0,X+
0077 CFF9 RJMP 0x0071
0078 940E007B CALL _main
_exit:
007A CFFF RJMP _exit
FILE: G:\猛\avr实践\UART\UART.c
(0001) #include <iom128.h>
(0002) #include <macros.h>
(0003)
(0004) //LED 开关定义
(0005)
(0006) #define Red_LED_on PORTB&~BIT(0)
(0007) #define Red_LED_off PORTB|(1<<0)
(0008) #define Green_LED_on PORTB&(~(1<<1))
(0009) #define Green_LED_off PORTB|(1<<1)
(0010) #define Yellow_LED_on PORTB&(~(1<<2))
(0011) #define Yellow_LED_off PORTB|(1<<2)
(0012)
(0013) //UART
(0014) unsigned char Rx_counter = 0;
(0015) unsigned char Tx_counter = 0;
(0016) unsigned char Tx_data_buf[] = {222,111,100,50,20,10,5,2,1,22};
(0017) unsigned char Tx_data;
(0018) unsigned char Rx_data_buf[12];
(0019) unsigned char Rx_data;
(0020) unsigned char UART0_TX_flag = 1;
(0021) unsigned char UART0_RX_flag = 1;
(0022) unsigned char Type_flag = 4;
(0023) //Display
(0024) unsigned char number_bai;
(0025) unsigned char number_shi;
(0026) unsigned char number_ge ;
(0027) unsigned char Display_type;
(0028) unsigned char Display_value;
(0029) unsigned char LED_table[]=
(0030) {
(0031) 0x3F, //"0"
(0032) 0x06, //"1"
(0033) 0x5B, //"2"
(0034) 0x4F, //"3"
(0035) 0x66, //"4"
(0036) 0x6D, //"5"
(0037) 0x7D, //"6"
(0038) 0x07, //"7"
(0039) 0x7F, //"8"
(0040) 0x6F, //"9"
(0041) 0x77, //"A"
(0042) 0x7C, //"B"
(0043) 0x39, //"C"
(0044) 0x5E, //"D"
(0045) 0x79, //"E"
(0046) 0x71, //"F"
(0047) 0x76, //"H"
(0048) 0x38, //"L"
(0049) 0x37, //"n"
(0050) 0x3E, //"u"
(0051) 0x73, //"P"
(0052) 0x5C, //"o"
(0053) 0x40, //"-"
(0054) 0x00, //熄灭
(0055) };
(0056)
(0057) //use for test;
(0058) unsigned char m;
(0059)
(0060) //define Interrupt Vactor
(0061)
(0062) #pragma interrupt_handler UART0_TX_INT:21 //外部中断0
(0063) #pragma interrupt_handler UART0_RX_INT:19 //外部中断1
(0064) #pragma interrupt_handler External_INT_0:2 //外部中断0
(0065) #pragma interrupt_handler External_INT_1:3 //外部中断1
(0066) #pragma interrupt_handler External_INT_2:4 //外部中断2
(0067)
(0068) //pre_define
(0069)
(0070) void Port_initialize(void);
(0071) void INT_initialize(void);
(0072) void UART_initialize(void);
(0073)
(0074) void UART0_TX_INT(void);
(0075) void UART0_RX_INT(void);
(0076) void External_INT_0(void);
(0077) void External_INT_1(void);
(0078) void External_INT_2(void);
(0079)
(0080) void LED_Display(unsigned char Type,unsigned char Data);
(0081) void DATA_to_NUM(unsigned char data);
(0082) void Delay(void);
(0083)
(0084)
(0085) void main(void)
(0086) {
(0087) unsigned char i;
(0088)
(0089) Port_initialize();
_main:
i --> R22
007B D05F RCALL _Port_initialize
(0090) UART_initialize();
007C D06E RCALL _UART_initialize
(0091) INT_initialize();
007D D064 RCALL _INT_initialize
(0092)
(0093) for (; ; )
(0094) {
(0095) switch (Type_flag)
007E 9140010E LDS R20,0x10E
0080 2755 CLR R21
0081 3040 CPI R20,0
0082 0745 CPC R20,R21
0083 F069 BEQ 0x0091
0084 3041 CPI R20,1
0085 E0E0 LDI R30,0
0086 075E CPC R21,R30
0087 F089 BEQ 0x0099
0088 3042 CPI R20,2
0089 E0E0 LDI R30,0
008A 075E CPC R21,R30
008B F0A9 BEQ 0x00A1
008C 3043 CPI R20,3
008D E0E0 LDI R30,0
008E 075E CPC R21,R30
008F F0C9 BEQ 0x00A9
0090 C020 RJMP 0x00B1
(0096) {
(0097) case 0: //发送的数值
(0098) {
(0099) Display_type = 0;
0091 2422 CLR R2
0092 92200129 STS _Display_type,R2
(0100) Display_value = Tx_data;
0094 9020013A LDS R2,_Tx_data
0096 92200128 STS _Display_value,R2
(0101)
(0102) }break;
0098 C01B RJMP 0x00B4
(0103)
(0104) case 1: //发送计数
(0105) {
(0106) Display_type = 1;
0099 E081 LDI R24,1
009A 93800129 STS _Display_type,R24
(0107) Display_value = Tx_counter;
009C 90200101 LDS R2,0x101
009E 92200128 STS _Display_value,R2
(0108)
(0109) }break;
00A0 C013 RJMP 0x00B4
(0110)
(0111) case 2: //接收的数值
(0112) {
(0113) Display_type = 2;
00A1 E082 LDI R24,2
00A2 93800129 STS _Display_type,R24
(0114) Display_value = Rx_data;
00A4 9020012D LDS R2,_Rx_data
00A6 92200128 STS _Display_value,R2
(0115)
(0116) }break;
00A8 C00B RJMP 0x00B4
(0117)
(0118) case 3: //接收计数
(0119) {
(0120) Display_type = 3;
00A9 E083 LDI R24,3
00AA 93800129 STS _Display_type,R24
(0121) Display_value = Rx_counter;
00AC 90200100 LDS R2,0x100
00AE 92200128 STS _Display_value,R2
(0122)
(0123) }break;
00B0 C003 RJMP 0x00B4
(0124)
(0125) default:
(0126) {
(0127) Display_type = 0x0f;
00B1 E08F LDI R24,0xF
00B2 93800129 STS _Display_type,R24
(0128)
(0129) }break;
(0130) }
(0131)
(0132) LED_Display(Display_type,Display_value); //数码管显示
00B4 91200128 LDS R18,_Display_value
00B6 91000129 LDS R16,_Display_type
00B8 D0EA RCALL _LED_Display
(0133)
(0134) if (UART0_TX_flag == 0)
00B9 9020010C LDS R2,0x10C
00BB 2022 TST R2
00BC F459 BNE 0x00C8
(0135) {
(0136) PORTB = Red_LED_on;
00BD 98C0 CBI P18,0
(0137)
(0138) for (i=0;i<10 ;i++ )
00BE 2766 CLR R22
00BF C002 RJMP 0x00C2
(0139) {
(0140) Delay();
00C0 D038 RCALL _Delay
00C1 9563 INC R22
00C2 306A CPI R22,0xA
00C3 F3E0 BCS 0x00C0
(0141) }
(0142)
(0143) UART0_TX_flag = 1;
00C4 E081 LDI R24,1
00C5 9380010C STS 0x10C,R24
(0144) }
00C7 C001 RJMP 0x00C9
(0145) else
(0146) {
(0147) PORTB = Red_LED_off;
00C8 9AC0 SBI P18,0
(0148) }
(0149)
(0150) if (UART0_RX_flag == 0)
00C9 9020010D LDS R2,0x10D
00CB 2022 TST R2
00CC F459 BNE 0x00D8
(0151) {
(0152) PORTB = Green_LED_on;
00CD 98C1 CBI P18,1
(0153)
(0154) for (i=0;i<10 ;i++ )
00CE 2766 CLR R22
00CF C002 RJMP 0x00D2
(0155) {
(0156) Delay();
00D0 D028 RCALL _Delay
00D1 9563 INC R22
00D2 306A CPI R22,0xA
00D3 F3E0 BCS 0x00D0
(0157) }
(0158)
(0159) UART0_RX_flag = 1;
00D4 E081 LDI R24,1
00D5 9380010D STS 0x10D,R24
(0160) }
00D7 CFA6 RJMP 0x007E
(0161) else
(0162) {
(0163) PORTB = Green_LED_off;
00D8 9AC1 SBI P18,1
00D9 CFA4 RJMP 0x007E
00DA 9508 RET
(0164) }
(0165) }
(0166) }
(0167)
(0168) void Port_initialize(void)
(0169) {
(0170) DDRA = 0xFF;
_Port_initialize:
00DB EF8F LDI R24,0xFF
00DC BB8A OUT P1A,R24
(0171) DDRB = 0xFF;
00DD BB87 OUT P17,R24
(0172) DDRD = 0x00;
00DE 2422 CLR R2
00DF BA21 OUT P11,R2
(0173) PORTB = 0xFF;
00E0 BB88 OUT P18,R24
(0174) }
00E1 9508 RET
(0175) void INT_initialize(void)
(0176) {
(0177) EICRA = 0xaa; //fall edge trigger
_INT_initialize:
00E2 EA8A LDI R24,0xAA
00E3 9380006A STS 0x6A,R24
(0178) EICRB = 0x00; //no influence
00E5 2422 CLR R2
00E6 BE2A OUT P3A,R2
(0179) EIMSK = 0x0f;
00E7 E08F LDI R24,0xF
00E8 BF89 OUT P39,R24
(0180)
(0181) SEI();
00E9 9478 BSET 7
(0182)
(0183) }
00EA 9508 RET
(0184) void UART_initialize(void)
(0185) {
(0186) CLI();
_UART_initialize:
00EB 94F8 BCLR 7
(0187)
(0188) UBRR0H = 0x00;
00EC 2422 CLR R2
00ED 92200090 STS 0x90,R2
(0189) UBRR0L = 0x67; //波特率9600bps
00EF E687 LDI R24,0x67
00F0 B989 OUT P09,R24
(0190) UCSR0A = 0x00;
00F1 B82B OUT P0B,R2
(0191) UCSR0B = 0x98; //11011000接收与发送使能
00F2 E988 LDI R24,0x98
00F3 B98A OUT P0A,R24
(0192) UCSR0C = 0x26; //00100110帧格式: 8bits,1stop bit,P 校验
00F4 E286 LDI R24,0x26
00F5 93800095 STS 0x95,R24
(0193)
(0194) SEI();
00F7 9478 BSET 7
(0195) }
00F8 9508 RET
(0196) void Delay(void)
(0197) {
(0198) unsigned int i;
(0199)
(0200) for ( i = 0; i < 6000; i++ )
_Delay:
i --> R16
00F9 2700 CLR R16
00FA 2711 CLR R17
00FB C003 RJMP 0x00FF
(0201) {
(0202) NOP();
00FC 0000 NOP
00FD 5F0F SUBI R16,0xFF
00FE 4F1F SBCI R17,0xFF
00FF 3700 CPI R16,0x70
0100 E1E7 LDI R30,0x17
0101 071E CPC R17,R30
0102 F3C8 BCS 0x00FC
(0203) }
(0204) }
0103 9508 RET
_UART0_TX_INT:
0104 922A ST R2,-Y
0105 938A ST R24,-Y
0106 939A ST R25,-Y
0107 93EA ST R30,-Y
0108 93FA ST R31,-Y
0109 B62F IN R2,P3F
010A 922A ST R2,-Y
(0205)
(0206) void UART0_TX_INT(void)
(0207) {
(0208) UART0_TX_flag = 0;
010B 2422 CLR R2
010C 9220010C STS 0x10C,R2
(0209)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -