📄 lesson10.lst
字号:
__start:
__text_start:
1B EFCF LDI R28,0xFF
1C E0D4 LDI R29,4
1D BFCD OUT 0x3D,R28
1E BFDE OUT 0x3E,R29
1F 51C0 SUBI R28,0x10
20 40D0 SBCI R29,0
21 EA0A LDI R16,0xAA
22 8308 STD Y+0,R16
23 2400 CLR R0
24 E0E2 LDI R30,2
25 E0F1 LDI R31,1
26 E011 LDI R17,1
27 32E3 CPI R30,0x23
28 07F1 CPC R31,R17
29 F011 BEQ 0x002C
2A 9201 ST R0,Z+
2B CFFB RJMP 0x0027
2C 8300 STD Z+0,R16
2D E3E4 LDI R30,0x34
2E E0F0 LDI R31,0
2F E0A0 LDI R26,0
30 E0B1 LDI R27,1
31 E010 LDI R17,0
32 E000 LDI R16,0
33 BF0B OUT 0x3B,R16
34 33E6 CPI R30,0x36
35 07F1 CPC R31,R17
36 F021 BEQ 0x003B
37 95C8 LPM
38 9631 ADIW R30,1
39 920D ST R0,X+
3A CFF9 RJMP 0x0034
3B D076 RCALL _main
_exit:
3C CFFF RJMP _exit
_delay:
i --> R20
j --> R22
ms --> R16
3D D167 RCALL push_xgsetF000
FILE: C:\DOCUME~1\zhanghanyu\桌面\ICC\chengxu10\lesson10\lesson10.c
(0001) #include <iom88v.h>
(0002) #include <macros.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005)
(0006) //晶振 7.3728MHZ
(0007) #define mclk 7372800
(0008) // #pragma interrupt_handler uart_rx:12
(0009) #pragma interrupt_handler uart_rx:iv_USART0_RXC
(0010) uchar rdata,flag=0;
(0011) uchar Rec_Data[27];
(0012) uchar Data_Len =0,i;
(0013) uchar adcL,adcH;
(0014) uint adresult;
(0015) void delay(uint ms) //延时函数
(0016) {
(0017) uint i,j;
(0018) for(i=0;i<ms;i++)
3E 2744 CLR R20
3F 2755 CLR R21
40 C00B RJMP 0x004C
(0019) {
(0020) for(j=0;j<1100;j++);
41 2766 CLR R22
42 2777 CLR R23
43 C002 RJMP 0x0046
44 5F6F SUBI R22,0xFF
45 4F7F SBCI R23,0xFF
46 346C CPI R22,0x4C
47 E0E4 LDI R30,4
48 077E CPC R23,R30
49 F3D0 BCS 0x0044
4A 5F4F SUBI R20,0xFF
4B 4F5F SBCI R21,0xFF
4C 1740 CP R20,R16
4D 0751 CPC R21,R17
4E F390 BCS 0x0041
4F C15A RJMP pop_xgsetF000
_uart_init:
baud --> R10
50 D15E RCALL push_xgsetF00C
51 0158 MOVW R10,R16
(0021) }
(0022) }
(0023)
(0024) //0D 0A 3E 0D 0A 52 65 61 64 20 46 77 64 20 33 3E 0D 0A 20 39 33 31 36 37 3F 20 20
(0025) //0D 0A 3E 0D 0A 52 65 61 64 20 46 6C 6F 77 20 31 3E 0D 0A 20 35 34 2E 39 32 30 3F 20 20
(0026) void uart_init(uint baud) //串口初始化
(0027) {
(0028)
(0029) UCSR0B=0x00;
52 2422 CLR R2
53 9220 00C1 STS 0x00C1,R2
(0030) UCSR0A=0x00; //控制寄存器清零
55 9220 00C0 STS 0x00C0,R2
(0031) UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);
57 E086 LDI R24,6
58 9380 00C2 STS 0x00C2,R24
(0032) //选择UCSRC,异步模式,禁止
(0033) // 校验,1位停止位,8位数据位
(0034) baud=mclk/16/baud-1 ; //波特率最大为65K
5A 0115 MOVW R2,R10
5B 2444 CLR R4
5C 2455 CLR R5
5D E040 LDI R20,0
5E E058 LDI R21,0x8
5F E067 LDI R22,7
60 E070 LDI R23,0
61 925A ST R5,-Y
62 924A ST R4,-Y
63 923A ST R3,-Y
64 922A ST R2,-Y
65 018A MOVW R16,R20
66 019B MOVW R18,R22
67 D0DB RCALL div32s
68 E041 LDI R20,1
69 E050 LDI R21,0
6A E060 LDI R22,0
6B E070 LDI R23,0
6C 0118 MOVW R2,R16
6D 0129 MOVW R4,R18
6E 1A24 SUB R2,R20
6F 0A35 SBC R3,R21
70 0A46 SBC R4,R22
71 0A57 SBC R5,R23
72 0151 MOVW R10,R2
(0035) UBRR0L=baud;
73 92A0 00C4 STS 0x00C4,R10
(0036) UBRR0H=baud>>8; //设置波特率
75 2C23 MOV R2,R3
76 2433 CLR R3
77 9220 00C5 STS 0x00C5,R2
(0037) UCSR0B=(1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0);
79 E988 LDI R24,0x98
7A 9380 00C1 STS 0x00C1,R24
(0038) //接收、发送使能,接收中断使能
(0039) SREG=BIT(7); //全局中断开放
7C E880 LDI R24,0x80
7D BF8F OUT 0x3F,R24
(0040) DDRD|=0X02; //配置TX为输出(很重要)
7E 9A51 SBI 0x0A,1
7F C136 RJMP pop_xgsetF00C
(0041)
(0042) }
(0043)
(0044) void adc_init(void)
(0045) {
(0046) ADCSRA = 0x00; //disable adc
_adc_init:
80 2422 CLR R2
81 9220 007A STS 0x007A,R2
83 9508 RET
(0047) //ADMUX = 0x46; //选择AVCC为参考,采集电压右对齐,1110 1.1V
(0048) }
(0049) void uart_sendB(uchar data) //发送字符
(0050) {
(0051) while(!(UCSR0A&(BIT(UDRE0)))) ;
_uart_sendB:
data --> R16
84 9020 00C0 LDS R2,0x00C0
86 FE25 SBRS R2,5
87 CFFC RJMP _uart_sendB
(0052) UDR0=data;
88 9300 00C6 STS 0x00C6,R16
(0053) while(!(UCSR0A&(BIT(TXC0))));
8A 9020 00C0 LDS R2,0x00C0
8C FE26 SBRS R2,6
8D CFFC RJMP 0x008A
(0054) UCSR0A|=BIT(TXC0);
8E 9180 00C0 LDS R24,0x00C0
90 6480 ORI R24,0x40
91 9380 00C0 STS 0x00C0,R24
93 9508 RET
_uart_rx:
94 922A ST R2,-Y
95 938A ST R24,-Y
96 939A ST R25,-Y
97 B62F IN R2,0x3F
98 922A ST R2,-Y
(0055) }
(0056) void uart_rx() //接收字符
(0057) {
(0058) UCSR0B&=~BIT(RXCIE0);
99 9180 00C1 LDS R24,0x00C1
9B 778F ANDI R24,0x7F
9C 9380 00C1 STS 0x00C1,R24
(0059) rdata=UDR0;
9E 9020 00C6 LDS R2,0x00C6
A0 9220 0122 STS rdata,R2
(0060) //flag=1;
(0061) Data_Len++;
A2 9180 0101 LDS R24,Data_Len
A4 5F8F SUBI R24,0xFF
A5 9380 0101 STS Data_Len,R24
(0062) UCSR0B|=BIT(RXCIE0);
A7 9180 00C1 LDS R24,0x00C1
A9 6880 ORI R24,0x80
AA 9380 00C1 STS 0x00C1,R24
AC 9029 LD R2,Y+
AD BE2F OUT 0x3F,R2
AE 9199 LD R25,Y+
AF 9189 LD R24,Y+
B0 9029 LD R2,Y+
B1 9518 RETI
(0063) }
(0064) void main()
(0065) {
(0066) //uchar i=4;
(0067) //uchar j='a';
(0068) uart_init(4800); //初始化串口
_main:
B2 EC00 LDI R16,0xC0
B3 E112 LDI R17,0x12
B4 DF9B RCALL _uart_init
(0069)
(0070) adc_init(); //初始化ADC
B5 DFCA RCALL _adc_init
B6 C084 RJMP 0x013B
(0071)
(0072) while(1)
(0073) {
(0074)
(0075) if(rdata==0xaa) //开始ADC转换标志
B7 9180 0122 LDS R24,rdata
B9 3A8A CPI R24,0xAA
BA F009 BEQ 0x00BC
BB C07F RJMP 0x013B
(0076) {
(0077) rdata=0x00;
BC 2422 CLR R2
BD 9220 0122 STS rdata,R2
(0078) //****************************************************
(0079) ADMUX = 0x46; //选择AVCC为参考,采集电压右对齐 6通道
BF E486 LDI R24,0x46
C0 9380 007C STS 0x007C,R24
(0080) //delay(100);
(0081) ADCSRA =0x84; //0b11000100 8分频
C2 E884 LDI R24,0x84
C3 9380 007A STS 0x007A,R24
(0082) ADCSRA |=BIT(ADSC); //开始转换
C5 9180 007A LDS R24,0x007A
C7 6480 ORI R24,0x40
C8 9380 007A STS 0x007A,R24
(0083)
(0084) while(!(ADCSRA&(1<<ADIF)));
CA 9020 007A LDS R2,0x007A
CC FE24 SBRS R2,4
CD CFFC RJMP 0x00CA
(0085)
(0086) //while(ADCSRA&(1<<ADSC)); //为1等待
(0087) adcL=ADCL;
CE 9020 0078 LDS R2,0x0078
D0 9220 0105 STS adcL,R2
(0088) adcH=ADCH;
D2 9020 0079 LDS R2,0x0079
D4 9220 0104 STS adcH,R2
(0089) ADCSRA |=BIT(1<<ADIF);
D6 E110 LDI R17,0x10
D7 E001 LDI R16,1
D8 D0ED RCALL lsl8
D9 9020 007A LDS R2,0x007A
DB 2A20 OR R2,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -