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

📄 fsdfds.lst

📁 Proteus与AVR应用实例,对初学者很有帮助。
💻 LST
📖 第 1 页 / 共 3 页
字号:
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00DC 940E0267  CALL	push_gset2
    00DE 2F42      MOV	R20,R18
    00DF 2F60      MOV	R22,R16
(0104) }
(0105) 
(0106) 
(0107) void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
(0108) {
(0109)     unsigned char address;
(0110)     if (y == 0) address = 0x80 + x;
    00E0 2344      TST	R20
    00E1 F419      BNE	0x00E5
    00E2 2F46      MOV	R20,R22
    00E3 5840      SUBI	R20,0x80
    00E4 C002      RJMP	0x00E7
(0111)     else   address = 0xc0 + x;
    00E5 2F46      MOV	R20,R22
    00E6 5440      SUBI	R20,0x40
(0112)     LCD_write_command( address);
    00E7 2F04      MOV	R16,R20
    00E8 DFB3      RCALL	_LCD_write_command
    00E9 940E025B  CALL	pop_gset2
    00EB 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    00EC 940E0265  CALL	push_gset3
    00EE 2EA2      MOV	R10,R18
    00EF 2F60      MOV	R22,R16
    00F0 814E      LDD	R20,Y+6
    00F1 815F      LDD	R21,Y+7
(0113) }
(0114)   
(0115) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0116) {
(0117)     LCD_set_xy( X, Y ); //写地址    
    00F2 2D2A      MOV	R18,R10
    00F3 2F06      MOV	R16,R22
    00F4 DFE7      RCALL	_LCD_set_xy
    00F5 C005      RJMP	0x00FB
(0118)     while (*s)  // 写显示字符
(0119)     {
(0120)       LCD_write_data( *s );
    00F6 01FA      MOVW	R30,R20
    00F7 8100      LDD	R16,Z+0
    00F8 DFC3      RCALL	_LCD_write_data
(0121)       s ++;
    00F9 5F4F      SUBI	R20,0xFF
    00FA 4F5F      SBCI	R21,0xFF
    00FB 01FA      MOVW	R30,R20
    00FC 8020      LDD	R2,Z+0
    00FD 2022      TST	R2
    00FE F7B9      BNE	0x00F6
    00FF 940E025E  CALL	pop_gset3
    0101 9508      RET
_LCD_write_char:
  data                 --> Y+4
  Y                    --> R22
  X                    --> R20
    0102 940E0267  CALL	push_gset2
    0104 2F62      MOV	R22,R18
    0105 2F40      MOV	R20,R16
(0122)     }
(0123)       
(0124) }
(0125) 
(0126) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0127) {
(0128)   LCD_set_xy( X, Y ); //写地址
    0106 2F26      MOV	R18,R22
    0107 2F04      MOV	R16,R20
    0108 DFD3      RCALL	_LCD_set_xy
(0129)   LCD_write_data( data);
    0109 810C      LDD	R16,Y+4
    010A DFB1      RCALL	_LCD_write_data
    010B 940E025B  CALL	pop_gset2
    010D 9508      RET
_ADC_convert:
  ADC_channel          --> R20
    010E 940E0269  CALL	push_gset1
    0110 2F40      MOV	R20,R16
FILE: D:\我的文档\桌面\harvest\adc.h
(0001) #ifndef __adc_h
(0002) #define __adc_h
(0003) #include <iom16v.h>  
(0004) //#include <iom128v.h> 
(0005) #include <macros.h> 
(0006) #include <delay.h> 
(0007) #include <lcd.h> 
(0008) #include <parameter.h> 
(0009) //--------------------------查询方式读取ADC 0~31通道--------------------------//   
(0010) unsigned int ADC_convert(unsigned char ADC_channel)   
(0011) {   
(0012)   ADMUX=(1<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(ADC_channel&0x1F); //ADLAR_bit5=0 右对齐  
    0111 2F84      MOV	R24,R20
    0112 718F      ANDI	R24,0x1F
    0113 6C80      ORI	R24,0xC0
    0114 B987      OUT	0x07,R24
(0013) /* 
(0014)   ADMUX (ADC Multiplexer Select Register) 
(0015)              bit7  bit6  
(0016)              REFS1 REFS0  参考电压选择  
(0017)               0     0     AREF,内部Vref关闭  
(0018)               0     1     AVCC,AREF引脚外加滤波电容  
(0019)               1     0     保留  
(0020)               1     1     2.56V的片内基准电压源,AREF引脚外加滤波电容  
(0021)              bit5         ADC结果左对齐选择 1=左对齐  0=右对齐 
(0022)              bit4~0       选择32通道   
(0023) 
(0024) */ 
(0025)   ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0); 
    0115 E886      LDI	R24,0x86
    0116 B986      OUT	0x06,R24
(0026) /*   
(0027)                ADCSRA (ADC Control and Status Register A) 
(0028)                 bit7   ADEN ADC使能=1 
(0029)                 bit6   ADSC 启动ADC开始转换=1 
(0030)                 bit5   ADATE 自己触发使能 
(0031)                 bit4   ADIF ADC中断标志 
(0032)                 bit3   ADIE ADC中断使能 
(0033)                 bit2:0 ADC 预分频选择位 110=64时钟分频 
(0034) */   
(0035)   delay_nus(200);    
    0117 EC08      LDI	R16,0xC8
    0118 E010      LDI	R17,0
    0119 DF3F      RCALL	_delay_nus
(0036)   ADCSRA|=(1<<ADSC);            //启动ADC开始转换 
    011A 9A36      SBI	0x06,6
(0037)   while ((ADCSRA&0x10)!=0x10);  //等待ADC转换结束  
    011B B186      IN	R24,0x06
    011C 7180      ANDI	R24,0x10
    011D 3180      CPI	R24,0x10
    011E F7E1      BNE	0x011B
(0038)   ADCSRA|=(1<<ADIF);                        //写1清除标志位 
    011F 9A34      SBI	0x06,4
(0039)   ADCSRA=0x00;                  //关闭ADC  
    0120 2422      CLR	R2
    0121 B826      OUT	0x06,R2
(0040)   return ((ADC&0x03FF)*25/10+1);                    //ADC=ADCH:ADCL  2.56V的片内基准电压源
    0122 B124      IN	R18,0x04
    0123 B135      IN	R19,0x05
    0124 7033      ANDI	R19,3
    0125 E109      LDI	R16,0x19
    0126 E010      LDI	R17,0
    0127 940E024B  CALL	empy16s
    0129 E02A      LDI	R18,0xA
    012A E030      LDI	R19,0
    012B 940E0231  CALL	div16u
    012D 5F0F      SUBI	R16,0xFF
    012E 4F1F      SBCI	R17,0xFF
    012F 940E026C  CALL	pop_gset1
    0131 9508      RET
_change:
  p                    --> R20
  i                    --> R22
    0132 940E0267  CALL	push_gset2
    0134 01A9      MOVW	R20,R18
    0135 01B8      MOVW	R22,R16
(0041) } 
(0042) 
(0043) //---------------------------16进制转换成ASCII码------------------------------//
(0044) void change(unsigned int i,unsigned char *p)		 
(0045) {
(0046)  p[4]=i%10+48;//个
    0136 E02A      LDI	R18,0xA
    0137 E030      LDI	R19,0
    0138 018B      MOVW	R16,R22
    0139 940E022F  CALL	mod16u
    013B 01C8      MOVW	R24,R16
    013C 96C0      ADIW	R24,0x30
    013D 01FA      MOVW	R30,R20
    013E 8384      STD	Z+4,R24
(0047)  p[3]=i/10%10+48;//十
    013F E02A      LDI	R18,0xA
    0140 E030      LDI	R19,0
    0141 018B      MOVW	R16,R22
    0142 940E0231  CALL	div16u
    0144 E02A      LDI	R18,0xA
    0145 E030      LDI	R19,0
    0146 940E022F  CALL	mod16u
    0148 01C8      MOVW	R24,R16
    0149 96C0      ADIW	R24,0x30
    014A 01FA      MOVW	R30,R20
    014B 8383      STD	Z+3,R24
(0048)  p[2]=i/100%10+48;//百
    014C E624      LDI	R18,0x64
    014D E030      LDI	R19,0
    014E 018B      MOVW	R16,R22
    014F 940E0231  CALL	div16u
    0151 E02A      LDI	R18,0xA
    0152 E030      LDI	R19,0
    0153 940E022F  CALL	mod16u
    0155 01C8      MOVW	R24,R16
    0156 96C0      ADIW	R24,0x30
    0157 01FA      MOVW	R30,R20
    0158 8382      STD	Z+2,R24
(0049)  p[1]='.';//.
    0159 E28E      LDI	R24,0x2E
    015A 01FA      MOVW	R30,R20
    015B 8381      STD	Z+1,R24
(0050)  p[0]=i/1000%10+48;//千
    015C EE28      LDI	R18,0xE8
    015D E033      LDI	R19,3
    015E 018B      MOVW	R16,R22
    015F 940E0231  CALL	div16u
    0161 E02A      LDI	R18,0xA
    0162 E030      LDI	R19,0
    0163 940E022F  CALL	mod16u
    0165 01C8      MOVW	R24,R16
    0166 96C0      ADIW	R24,0x30
    0167 01FA      MOVW	R30,R20
    0168 8380      STD	Z+0,R24
    0169 940E025B  CALL	pop_gset2
    016B 9508      RET
_adcdisplay:
    016C 9722      SBIW	R28,2
(0051) }
(0052) 
(0053) //-----------------channel通道的电压值送lcd显示-------------------------------//
(0054) void adcdisplay(void)// 
(0055) {
(0056)  vol=ADC_convert(channel);//查询方式读取ADC channel通道
    016D 91000079  LDS	R16,channel
    016F DF9E      RCALL	_ADC_convert
    0170 9310007B  STS	vol+1,R17
    0172 9300007A  STS	vol,R16
(0057)  change(vol,Data);//16进制转换成ASCII码
    0174 E620      LDI	R18,0x60
    0175 E030      LDI	R19,0
    0176 DFBB      RCALL	_change
(0058)  LCD_write_string(2,0,"CHANNEL:");
    0177 E68F      LDI	R24,0x6F
    0178 E090      LDI	R25,0
    0179 8399      STD	Y+1,R25
    017A 8388      STD	Y+0,R24
    017B 2722      CLR	R18
    017C E002      LDI	R16,2
    017D DF6E      RCALL	_LCD_write_string
(0059)  LCD_write_string(1,1,"VOLTAGE:");
    017E E686      LDI	R24,0x66
    017F E090      LDI	R25,0
    0180 8399      STD	Y+1,R25
    0181 8388      STD	Y+0,R24
    0182 E021      LDI	R18,1
    0183 E001      LDI	R16,1
    0184 DF67      RCALL	_LCD_write_string
(0060)  LCD_write_char(11,0,channel+48);//显示通道数
    0185 91800079  LDS	R24,channel
    0187 5D80      SUBI	R24,0xD0
    0188 8388      STD	Y+0,R24
    0189 2722      CLR	R18
    018A E00B      LDI	R16,0xB
    018B DF76      RCALL	_LCD_write_char
(0061)  LCD_write_string(10,1,Data);//显示电压值
    018C E680      LDI	R24,0x60
    018D E090      LDI	R25,0
    018E 8399      STD	Y+1,R25
    018F 8388      STD	Y+0,R24
    0190 E021      LDI	R18,1
    0191 E00A      LDI	R16,0xA
    0192 DF59      RCALL	_LCD_write_string
(0062)  LCD_write_char(15,1,86);//显示'V'
    0193 E586      LDI	R24,0x56
    0194 8388      STD	Y+0,R24
    0195 E021      LDI	R18,1
    0196 E00F      LDI	R16,0xF
    0197 DF6A      RCALL	_LCD_write_char
    0198 9622      ADIW	R28,2
    0199 9508      RET
(0063) }  
(0064) 
(0065) //----------------------------ADC端口初始化-----------------------------------// 
(0066) void ADC_int(void)
(0067) {
(0068)  DDRA=0x00;
_ADC_int:
    019A 2422      CLR	R2
    019B BA2A      OUT	0x1A,R2
(0069)  PORTA=0x01;		//A口为不带上拉输入
    019C E081      LDI	R24,1
    019D BB8B      OUT	0x1B,R24
    019E 9508      RET
FILE: D:\我的文档\桌面\harvest\time0.h
(0001) #ifndef __time0_h
(0002) #define __time0_h
(0003) #include <iom16v.h>  
(0004) //#include <iom128v.h> 
(0005) #include <macros.h> 
(0006) #include <delay.h> 
(0007) #include <parameter.h> 
(0008) //---------------------------定时器0初始化------------------------------------//
(0009) void timer0_int(void)
(0010) {  
(0011)   DDRD |= 0xC0;  
_timer0_int:
    019F B381      IN	R24,0x11
    01A0 6C80      ORI	R24,0xC0
    01A1 BB81      OUT	0x11,R24
(0012)  // TCNT0=178;  // T/C0 开始值 定时10ms  
(0013)  // TCNT0=100;  // T/C0 开始值 定时20ms  
(0014)   TCNT0=57;  // T/C0 开始值 定时0.0002s  
    01A2 E389      LDI	R24,0x39
    01A3 BF82      OUT	0x32,R24
(0015)   TCCR0=0x02;
    01A4 E082      LDI	R24,2
    01A5 BF83      OUT	0x33,R24
    01A6 9508      RET
_timer0_ovf_isr:
    01A7 922A      ST	R2,-Y
    01A8 923A      ST	R3,-Y
    01A9 938A      ST	R24,-Y

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -