📄 fsdfds.lst
字号:
_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 + -