📄 ad.lst
字号:
__start:
__text_start:
0008 E5CF LDI R28,0x5F
0009 E0D2 LDI R29,2
000A BFCD OUT P3D,R28
000B BFDE OUT P3E,R29
000C 51C0 SUBI R28,0x10
000D 40D0 SBCI R29,0
000E C10F RJMP _adc_isr
000F 8308 STD R16,0+Y
0010 2400 CLR R0
0011 E7E0 LDI R30,0x70
0012 E0F0 LDI R31,0
0013 E010 LDI R17,0
0014 37E3 CPI R30,0x73
0015 07F1 CPC R31,R17
0016 F011 BEQ 0x0019
0017 9201 ST R0,Z+
0018 CFFB RJMP 0x0014
0019 8300 STD R16,0+Z
001A E0E0 LDI R30,0
001B E0F0 LDI R31,0
001C E6A0 LDI R26,0x60
001D E0B0 LDI R27,0
001E E010 LDI R17,0
001F 31E0 CPI R30,0x10
0020 07F1 CPC R31,R17
0021 F021 BEQ 0x0026
0022 95C8 LPM
0023 9631 ADIW R30,1
0024 920D ST R0,X+
0025 CFF9 RJMP 0x001F
0026 D001 RCALL _main
_exit:
0027 CFFF RJMP _exit
FILE: E:\avrc\disp.c
(0001) #include <iom8v.h> //和单片机类型相对应的头文件,选择Atmega8做实验;
(0002) #include <macros.h>
(0003) #include <stdio.h>
(0004) #define uchar unsigned char
(0005) #define uint unsigned int
(0006) void send_byte(uchar x);
(0007) void disp_led(uchar buffer,uchar control);
(0008) void delay_1ms(void);
(0009) void delay_nms(unsigned int n);
(0010) uchar disp_table[16] = {
(0011) 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0012) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0013) uint count;
(0014) uchar dp;
(0015) void main(void)
(0016) {
(0017) uint i;
(0018) int j;
(0019) disp_led(0,0);//显示0
_main:
i --> Y+1
j --> R20
0028 2722 CLR R18
0029 2700 CLR R16
002A D057 RCALL _disp_led
(0020) OSCCAL=0X9d; //系统时钟校准,不同的芯片和不同的频率,
002B E98D LDI R24,0x9D
002C BF81 OUT P31,R24
(0021) DDRB=0x03; //定义B口的PB0、PB1为输出口
002D E083 LDI R24,3
002E BB87 OUT P17,R24
(0022) DDRC=0x30; //定义C口的PC4和PC5为输出口
002F E380 LDI R24,0x30
0030 BB84 OUT P14,R24
(0023) WDR(); //看门狗计数清零
0031 95A8 WDR
(0024) WDTCR=0x0F; //使能watchdog,并且,采用2048K分频,典型溢出时间5V时2.1S
0032 E08F LDI R24,0xF
0033 BD81 OUT P21,R24
(0025) ADCSRA=0X00;
0034 2422 CLR R2
0035 B826 OUT P06,R2
(0026) ADMUX =(1<<REFS0)|(1<<REFS1)|(1<<MUX1)|(1<<MUX0); //采用内部2.56参考电压,ADC3输入
0036 EC83 LDI R24,0xC3
0037 B987 OUT P07,R24
(0027) ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC转换 64分频
0038 EC8E LDI R24,0xCE
0039 B986 OUT P06,R24
(0028) SEI(); //开放中断
003A 9478 BSET 7
(0029) //delay_nms(5000); //延时5秒
(0030) PORTB=0B00000010; //PB1口输出高电平,PB0口输出低电平,关闭绿灯,红灯亮
003B E082 LDI R24,2
003C BB88 OUT P18,R24
(0031) delay_nms(500); //延时1秒
003D EF04 LDI R16,0xF4
003E E011 LDI R17,1
003F D0D0 RCALL _delay_nms
0040 C020 RJMP 0x0061
(0032) while(1)
(0033) {
(0034) PORTB=0B00000010;
0041 E082 LDI R24,2
0042 BB88 OUT P18,R24
(0035) delay_nms(100); //延时0.1左右
0043 E604 LDI R16,0x64
0044 E010 LDI R17,0
0045 D0CA RCALL _delay_nms
(0036) j=((25600/1023)*(ADCH*256+ADCL))/1000;//数据计算
0046 B024 IN R2,P04
0047 B035 IN R3,P05
0048 2D33 MOV R19,R3
0049 2D22 MOV R18,R2
004A E109 LDI R16,0x19
004B E010 LDI R17,0
004C D0DB RCALL mpy16s
004D EE28 LDI R18,0xE8
004E E033 LDI R19,3
004F D10A RCALL div16s
0050 2F40 MOV R20,R16
0051 2F51 MOV R21,R17
(0037) count=j;
0052 93500072 STS R21,_count+1
0054 93400071 STS R20,_count
(0038) if(j>24)
0056 E188 LDI R24,0x18
0057 E090 LDI R25,0
0058 1780 CP R24,R16
0059 0791 CPC R25,R17
005A F414 BGE 0x005D
(0039) PORTB=0B00000011; //翻转PB0和PB1口 过压或过流显示
005B E083 LDI R24,3
005C BB88 OUT P18,R24
(0040) disp_led(0,1); //显示数据
005D E021 LDI R18,1
005E 2700 CLR R16
005F D022 RCALL _disp_led
(0041) WDR(); //清看门狗
0060 95A8 WDR
0061 CFDF RJMP 0x0041
(0042) }
(0043) }
0062 9508 RET
_send_byte:
i --> R20
x --> R22
0063 D127 RCALL push_gset2
0064 2F60 MOV R22,R16
(0044) void send_byte(uchar x)
(0045) {
(0046) uchar i;
(0047) for(i=0;i<8;i++)
0065 2744 CLR R20
0066 C017 RJMP 0x007E
(0048) {
(0049) PORTC=0<<5; // PC5为底 为164提供时钟信号
0067 2422 CLR R2
0068 BA25 OUT P15,R2
(0050) if((x&(1<<(7-i)))||((dp==1)&&(i==0))) //判断每位数据的电平,及小数点判断
0069 E017 LDI R17,7
006A 1B14 SUB R17,R20
006B E001 LDI R16,1
006C D128 RCALL lsl8
006D 2E26 MOV R2,R22
006E 2220 AND R2,R16
006F F431 BNE 0x0076
0070 91800070 LDS R24,_dp
0072 3081 CPI R24,1
0073 F429 BNE 0x0079
0074 2344 TST R20
0075 F419 BNE 0x0079
(0051) PORTC=1<<4; //若为高着PC4输出高电平
0076 E180 LDI R24,0x10
0077 BB85 OUT P15,R24
0078 C002 RJMP 0x007B
(0052) else
(0053) PORTC=0<<4; //若为低着输出低电平
0079 2422 CLR R2
007A BA25 OUT P15,R2
(0054) PORTC=1<<5; //PC5 提供始终信号
007B E280 LDI R24,0x20
007C BB85 OUT P15,R24
007D 9543 INC R20
007E 3048 CPI R20,0x8
007F F338 BCS 0x0067
(0055) }
(0056) }
0080 D110 RCALL pop_gset2
0081 9508 RET
_disp_led:
temp --> Y+0
tempcount --> R20
i --> R22
control --> R20
buffer --> R10
0082 D10B RCALL push_gset3
0083 2F42 MOV R20,R18
0084 2EA0 MOV R10,R16
0085 9726 SBIW R28,6
(0057) //显示程序 CONTROL为控制显示 BUFFER为显示数据
(0058) void disp_led(uchar buffer,uchar control)
(0059) {
(0060) uchar i,temp[6];
(0061) uint tempcount;
(0062) dp=0;
0086 2422 CLR R2
0087 92200070 STS R2,_dp
(0063) switch(control)
0089 2755 CLR R21
008A 3040 CPI R20,0
008B 0745 CPC R20,R21
008C F029 BEQ 0x0092
008D 3041 CPI R20,1
008E E0E0 LDI R30,0
008F 075E CPC R21,R30
0090 F0A1 BEQ 0x00A5
0091 C06E RJMP 0x0100
(0064) {
(0065) case 0: //CONTROL为零全部数码管显示buffer
(0066) {
(0067) for(i=0;i<11;i++)
0092 2766 CLR R22
0093 C00E RJMP 0x00A2
(0068) send_byte(disp_table[buffer%10]);//显示数字
0094 E02A LDI R18,0xA
0095 E030 LDI R19,0
0096 2D0A MOV R16,R10
0097 2711 CLR R17
0098 D0BF RCALL mod16s
0099 2FE0 MOV R30,R16
009A 2FF1 MOV R31,R17
009B E680 LDI R24,0x60
009C E090 LDI R25,0
009D 0FE8 ADD R30,R24
009E 1FF9 ADC R31,R25
009F 8100 LDD R16,0+Z
00A0 DFC2 RCALL _send_byte
00A1 9563 INC R22
00A2 306B CPI R22,0xB
00A3 F380 BCS 0x0094
(0069) break;
00A4 C05B RJMP 0x0100
(0070) }
(0071) case 1: //control为1,显示count中的数据为6位
(0072) {
(0073) tempcount=count;
00A5 91400071 LDS R20,_count
00A7 91500072 LDS R21,_count+1
(0074) for(i=0;i<6;i++) //取出每位中的数据
00A9 2766 CLR R22
00AA C014 RJMP 0x00BF
(0075) {
(0076) temp[i]=tempcount%10;
00AB E02A LDI R18,0xA
00AC E030 LDI R19,0
00AD 2F04 MOV R16,R20
00AE 2F15 MOV R17,R21
00AF D08C RCALL mod16u
00B0 2F8C MOV R24,R28
00B1 2F9D MOV R25,R29
00B2 2FE6 MOV R30,R22
00B3 27FF CLR R31
00B4 0FE8 ADD R30,R24
00B5 1FF9 ADC R31,R25
00B6 8300 STD R16,0+Z
(0077) tempcount/=10;
00B7 E02A LDI R18,0xA
00B8 E030 LDI R19,0
00B9 2F04 MOV R16,R20
00BA 2F15 MOV R17,R21
00BB D082 RCALL div16u
00BC 2F40 MOV R20,R16
00BD 2F51 MOV R21,R17
00BE 9563 INC R22
00BF 3066 CPI R22,6
00C0 F350 BCS 0x00AB
(0078) }
(0079) send_byte(disp_table[buffer/10]); //最开始显示buffer数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -