⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad.lst

📁 电压计(c语言编写的) 通过led灯显示 电路图说明: 1、R1、R2、D1、D2 组成发光二极管显示
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -