📄 adc_port.lst
字号:
(0189) {
(0190) LCD_WriteCmd(0x80|i); //行位置
0383 2F04 MOV R16,R20
0384 6800 ORI R16,0x80
0385 DF82 RCALL _LCD_WriteCmd
(0191) LCD_WriteCmd(0x80); //列位置
0386 E800 LDI R16,0x80
0387 DF80 RCALL _LCD_WriteCmd
(0192) for(j=0;j<32;j++) //256/8=32 byte
0388 2766 CLR R22
0389 C003 RJMP 0x038D
(0193) LCD_WriteData(0);
038A 2700 CLR R16
038B DF97 RCALL _LCD_WriteData
038C 9563 INC R22
038D 3260 CPI R22,0x20
038E F3D8 BCS 0x038A
038F 9543 INC R20
0390 3240 CPI R20,0x20
0391 F388 BCS 0x0383
0392 940E05D2 CALL pop_gset2
0394 9508 RET
_LCD_PutStr:
puts --> R20
col --> R22
row --> R10
0395 940E05E2 CALL push_gset3
0397 2F62 MOV R22,R18
0398 2EA0 MOV R10,R16
0399 814E LDD R20,Y+6
039A 815F LDD R21,Y+7
(0194) }
(0195) }
(0196)
(0197) void LCD_PutStr(unsigned char row,unsigned char col,unsigned char *puts)
(0198) {
(0199) LCD_WriteCmd(0x30); //8BitMCU,基本指令集合
039B E300 LDI R16,0x30
039C DF6B RCALL _LCD_WriteCmd
(0200) LCD_WriteCmd(AC_TABLE[8*row+col]); //起始位置
039D E088 LDI R24,0x8
039E 9D8A MUL R24,R10
039F 01F0 MOVW R30,R0
03A0 2E26 MOV R2,R22
03A1 2433 CLR R3
03A2 0DE2 ADD R30,R2
03A3 1DF3 ADC R31,R3
03A4 E584 LDI R24,0x54
03A5 E090 LDI R25,0
03A6 0FE8 ADD R30,R24
03A7 1FF9 ADC R31,R25
03A8 9104 LPM R16,0(Z)
03A9 DF5E RCALL _LCD_WriteCmd
03AA C023 RJMP 0x03CE
(0201) while(*puts != '\0') //判断字符串是否显示完毕
(0202) {
(0203) if(col==8) //判断换行
03AB 3068 CPI R22,0x8
03AC F411 BNE 0x03AF
(0204) { //若不判断,则自动从第一行到第三行
(0205) col=0;
03AD 2766 CLR R22
(0206) row++;
03AE 94A3 INC R10
(0207) }
(0208) if(row==4) row=0; //一屏显示完,回到屏左上角
03AF 2D8A MOV R24,R10
03B0 3084 CPI R24,4
03B1 F409 BNE 0x03B3
03B2 24AA CLR R10
(0209) LCD_WriteCmd(AC_TABLE[8*row+col]);
03B3 E088 LDI R24,0x8
03B4 9D8A MUL R24,R10
03B5 01F0 MOVW R30,R0
03B6 2E26 MOV R2,R22
03B7 2433 CLR R3
03B8 0DE2 ADD R30,R2
03B9 1DF3 ADC R31,R3
03BA E584 LDI R24,0x54
03BB E090 LDI R25,0
03BC 0FE8 ADD R30,R24
03BD 1FF9 ADC R31,R25
03BE 9104 LPM R16,0(Z)
03BF DF48 RCALL _LCD_WriteCmd
(0210) LCD_WriteData(*puts); //一个汉字要写两次
03C0 01FA MOVW R30,R20
03C1 8100 LDD R16,Z+0
03C2 DF60 RCALL _LCD_WriteData
(0211) puts++;
03C3 5F4F SUBI R20,0xFF
03C4 4F5F SBCI R21,0xFF
(0212) if (*puts != '\0')
03C5 01FA MOVW R30,R20
03C6 8020 LDD R2,Z+0
03C7 2022 TST R2
03C8 F051 BEQ 0x03D3
(0213) {
(0214) LCD_WriteData(*puts);
03C9 8100 LDD R16,Z+0
03CA DF58 RCALL _LCD_WriteData
(0215) puts++;
03CB 5F4F SUBI R20,0xFF
03CC 4F5F SBCI R21,0xFF
(0216) }else{break;}
(0217) col++;
03CD 9563 INC R22
03CE 01FA MOVW R30,R20
03CF 8020 LDD R2,Z+0
03D0 2022 TST R2
03D1 F009 BEQ 0x03D3
03D2 CFD8 RJMP 0x03AB
03D3 940E05D5 CALL pop_gset3
03D5 9508 RET
_LCD_PutBMP:
i --> R20
x --> R22
j --> R12
puts --> R10
03D6 940E05E0 CALL push_gset4
03D8 0158 MOVW R10,R16
(0218) }
(0219) }
(0220)
(0221) void LCD_PutBMP(unsigned const char *puts) //必须加const 只能写上下半屏相同的图片
(0222) {
(0223) unsigned int x=0;
03D9 2766 CLR R22
03DA 2777 CLR R23
(0224) unsigned char i,j;
(0225) LCD_WriteCmd(0x34); //8Bit扩充指令集,即使是36H也要写两次
03DB E304 LDI R16,0x34
03DC DF2B RCALL _LCD_WriteCmd
(0226) LCD_WriteCmd(0x36); //绘图ON,基本指令集里面36H不能开绘图
03DD E306 LDI R16,0x36
03DE DF29 RCALL _LCD_WriteCmd
(0227) for(i=0;i<32;i++) //12864实际为256x32
03DF 2744 CLR R20
03E0 C013 RJMP 0x03F4
(0228) {
(0229) LCD_WriteCmd(0x80|i); //行位置
03E1 2F04 MOV R16,R20
03E2 6800 ORI R16,0x80
03E3 DF24 RCALL _LCD_WriteCmd
(0230) LCD_WriteCmd(0x80); //列位置
03E4 E800 LDI R16,0x80
03E5 DF22 RCALL _LCD_WriteCmd
(0231) for(j=0;j<32;j++) //256/8=32 byte
03E6 24CC CLR R12
03E7 C008 RJMP 0x03F0
(0232) { //列位置每行自动增加
(0233) LCD_WriteData(puts[x]);
03E8 01FB MOVW R30,R22
03E9 0DEA ADD R30,R10
03EA 1DFB ADC R31,R11
03EB 9104 LPM R16,0(Z)
03EC DF36 RCALL _LCD_WriteData
(0234) x++;
03ED 5F6F SUBI R22,0xFF
03EE 4F7F SBCI R23,0xFF
03EF 94C3 INC R12
03F0 2D8C MOV R24,R12
03F1 3280 CPI R24,0x20
03F2 F3A8 BCS 0x03E8
03F3 9543 INC R20
03F4 3240 CPI R20,0x20
03F5 F358 BCS 0x03E1
03F6 940E05D8 CALL pop_gset4
03F8 9508 RET
_Disp_Img:
i --> R20
y --> R12
j --> R10
x --> R14
img --> R22
03F9 940E05DE CALL push_gset5
03FB 01B8 MOVW R22,R16
(0235) }
(0236) }
(0237) }
(0238)
(0239)
(0240) void Disp_Img(unsigned const char *img) //写整屏图片
(0241) { unsigned int j=0;
03FC 24AA CLR R10
03FD 24BB CLR R11
(0242) unsigned char x,y,i;
(0243) for(i=0;i<9;i+=8)
03FE 2744 CLR R20
03FF C02B RJMP 0x042B
(0244) for(y=0;y<32;y++)/*原来 为 y<26 ,上下两个半屏不能正常对接显示,导致显示的图片中间有空隙*/
0400 24CC CLR R12
0401 C024 RJMP 0x0426
(0245) for(x=0;x<8;x++)
0402 24EE CLR R14
0403 C01E RJMP 0x0422
(0246) { LCD_WriteCmd(0x36);//功能设置---8BIT控制界面,扩充指令集
0404 E306 LDI R16,0x36
0405 DF02 RCALL _LCD_WriteCmd
(0247) LCD_WriteCmd(y+0x80); //行地址
0406 2D0C MOV R16,R12
0407 5800 SUBI R16,0x80
0408 DEFF RCALL _LCD_WriteCmd
(0248) LCD_WriteCmd(x+0x80+i); //列地址
0409 2D0E MOV R16,R14
040A 5800 SUBI R16,0x80
040B 0F04 ADD R16,R20
040C DEFB RCALL _LCD_WriteCmd
(0249) LCD_WriteCmd(0x30);
040D E300 LDI R16,0x30
040E DEF9 RCALL _LCD_WriteCmd
(0250) LCD_WriteData(img[j++]);
040F 0115 MOVW R2,R10
0410 01C1 MOVW R24,R2
0411 9601 ADIW R24,1
0412 015C MOVW R10,R24
0413 01F1 MOVW R30,R2
0414 0FE6 ADD R30,R22
0415 1FF7 ADC R31,R23
0416 9104 LPM R16,0(Z)
0417 DF0B RCALL _LCD_WriteData
(0251) LCD_WriteData(img[j++]);
0418 0115 MOVW R2,R10
0419 01C1 MOVW R24,R2
041A 9601 ADIW R24,1
041B 015C MOVW R10,R24
041C 01F1 MOVW R30,R2
041D 0FE6 ADD R30,R22
041E 1FF7 ADC R31,R23
041F 9104 LPM R16,0(Z)
0420 DF02 RCALL _LCD_WriteData
0421 94E3 INC R14
0422 2D8E MOV R24,R14
0423 3088 CPI R24,0x8
0424 F2F8 BCS 0x0404
0425 94C3 INC R12
0426 2D8C MOV R24,R12
0427 3280 CPI R24,0x20
0428 F408 BCC 0x042A
0429 CFD8 RJMP 0x0402
042A 5F48 SUBI R20,0xF8
042B 3049 CPI R20,0x9
042C F408 BCC 0x042E
042D CFD2 RJMP 0x0400
042E 940E05DB CALL pop_gset5
0430 9508 RET
_DisplayDots:
i --> R20
j --> R10
DotByte --> R22
0431 940E05E2 CALL push_gset3
0433 2F60 MOV R22,R16
(0252) }
(0253)
(0254) }
(0255)
(0256)
(0257)
(0258) //维捷登测试用点阵显示
(0259) void DisplayDots(unsigned char DotByte)
(0260) {
(0261) unsigned char i,j;
(0262) LCD_WriteCmd(0x34); //8Bit扩充指令集,即使是36H也要写两次
0434 E304 LDI R16,0x34
0435 DED2 RCALL _LCD_WriteCmd
(0263) LCD_WriteCmd(0x36); //绘图ON,基本指令集里面36H不能开绘图
0436 E306 LDI R16,0x36
0437 DED0 RCALL _LCD_WriteCmd
(0264) for(i=0;i<32;i++) //12864实际为256x32
0438 2744 CLR R20
0439 C00F RJMP 0x0449
(0265) {
(0266) LCD_WriteCmd(0x80|i); //行位置
043A 2F04 MOV R16,R20
043B 6800 ORI R16,0x80
043C DECB RCALL _LCD_WriteCmd
(0267) LCD_WriteCmd(0x80); //列位置
043D E800 LDI R16,0x80
043E DEC9 RCALL _LCD_WriteCmd
(0268) for(j=0;j<32;j++) //256/8=32 byte
043F 24AA CLR R10
0440 C003 RJMP 0x0444
(0269) { //列位置每行自动增加
(0270) LCD_WriteData(DotByte);
0441 2F06 MOV R16,R22
0442 DEE0 RCALL _LCD_WriteData
0443 94A3 INC R10
0444 2D8A MOV R24,R10
0445 3280 CPI R24,0x20
0446 F3D0 BCS 0x0441
(0271) }
(0272) DotByte=~DotByte;
0447 9560 COM R22
0448 9543 INC R20
0449 3240 CPI R20,0x20
044A F378 BCS 0x043A
044B 940E05D5 CALL pop_gset3
044D 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
044E 940E05E4 CALL push_gset2
FILE: E:\单片机\本人实验\重新实验\adc_vcc\main.c
(0001) #include "iom16v.h"
(0002) #include "macros.h"
(0003) #include "lcd.h"
(0004) //#include <stdio.h>
(0005) // #include <stdlib.h> //sprintf函数用
(0006) //#include <string.h> //字符连接函数用
(0007) #define uchar unsigned char
(0008) #define uint unsigned int
(0009) uchar str[]="电压为 毫伏";
(0010) uchar str2[4] ;
(0011) float adc_data; //不能为uint型,否则只显示个位
(0012) uint vcc;
(0013)
(0014)
(0015) void delay_ms(uchar i)
(0016) {
(0017) uchar a,b;
(0018) for(a=1;a<i;a++)
0450 E041 LDI R20,1
0451 C006 RJMP 0x0458
(0019) for(b=1;b<141;b++)
0452 E061 LDI R22,1
0453 C001 RJMP 0x0455
0454 9563 INC R22
0455 386D CPI R22,0x8D
0456 F3E8 BCS 0x0454
0457 9543 INC R20
0458 1740 CP R20,R16
0459 F3C0 BCS 0x0452
045A 940E05D2 CALL pop_gset2
045C 9508 RET
_change:
p --> R20
i --> R22
045D 940E05E4 CALL push_gset2
045F 01A9 MOVW R20,R18
0460 01B8 MOVW R22,R16
(0020) {;}
(0021) }
(0022)
(0023)
(0024) /*****************字符连接函数********************/
(0025) /*void strcatenate(char t[], char s[] )
(0026) {
(0027) strcat(t,s);
(0028) } */
(0029)
(0030) /****************电压i伏特转换为对应字符*************************/
(0031) void change(uint i,uchar *p) //显示处理
(0032) { p[3]=i%10+48;//个
0461 E02A LDI R18,0xA
0462 E030 LDI R19,0
0463 018B MOVW R16,R22
0464 940E05B6 CALL mod16u
0466 01C8 MOVW R24,R16
0467 96C0 ADIW R24,0x30
0468 01FA MOVW R30,R20
0469 8383 STD Z+3,R24
(0033) p[2]=i/10%10+48;//十
046A E02A LDI R18,0xA
046B E030 LDI R19,0
046C 018B MOVW R16,R22
046D 940E05B8 CALL div16u
046F E02A LDI R18,0xA
0470 E030 LDI R19,0
0471 940E05B6 CALL mod16u
0473 01C8 MOVW R24,R16
0474 96C0 ADIW R24,0x30
0475 01FA MOVW R30,R20
0476 8382 STD Z+2,R24
(0034) p[1]=i/100%10+48;//百
0477 E624 LDI R18,0x64
0478 E030 LDI R19,0
0479 018B MOVW R16,R22
047A 940E05B8 CALL div16u
047C E02A LDI R18,0xA
047D E030 LDI R19,0
047E 940E05B6 CALL mod16u
0480 01C8 MOVW R24,R16
0481 96C0 ADIW R24,0x30
0482 01FA MOVW R30,R20
0483 8381 STD Z+1,R24
(0035) p[0]=i/1000%10+48;//千
0484 EE28 LDI R18,0xE8
0485 E033 LDI R19,3
0486 018B MOVW R16,R22
0487 940E05B8 CALL div16u
0489 E02A LDI R18,0xA
048A E030 LDI R19,0
048B 940E05B6 CALL mod16u
048D 01C8 MOVW R24,R16
048E 96C0 ADIW R24,0x30
048F 01FA MOVW R30,R20
0490 8380 STD Z+0,R24
0491 940E05D2 CALL pop_gset2
0493 9508 RET
_adc_end:
0494 920A ST R0,-Y
0495 921A ST R1,-Y
0496 922A ST R2,-Y
0497 923A ST R3,-Y
0498 924A ST R4,-Y
0499 925A ST R5,-Y
049A 930A ST R16,-Y
049B 931A ST R17,-Y
049C 932A ST R18,-Y
049D 933A ST R19,-Y
049E 938A ST R24,-Y
049F 939A ST R25,-Y
04A0 93AA ST R26,-Y
04A1 93BA ST R27,-Y
04A2 B60F IN R0,0x3F
04A3 920A ST R0,-Y
(0036) }
(0037)
(0038) #pragma interrupt_handler adc_end: 15
(0039) void adc_end(void)
(0040) {
(0041) adc_data=(float)(ADCH*4+ADCL/64);
04A4 E420 LDI R18,0x40
04A5 E030 LDI R19,0
04A6 B104 IN R16,0x04
04A7 2711 CLR R17
04A8 940E059C CALL div16s
04AA 0118 MOVW R2,R16
04AB B045 IN R4,0x05
04AC E084 LDI R24,4
04AD 9D84 MUL R24,R4
04AE 0180 MOVW R16,R0
04AF 0D02 ADD R16,R2
04B0 1D13 ADC R17,R3
04B1 940E0662 CALL int2fp
04B3 931000C6 STS adc_data+1,R17
04B5 930000C5 STS adc_data,R16
04B7 933000C8 STS adc_data+3,R19
04B9 932000C7 STS adc_data+2,R18
(0042)
(0043)
(0044) if (adc_data>3*1024/5) //大于3V PB0亮
04BB E804 LDI R16,0x84
04BC E014 LDI R17,4
04BD 940E0606 CALL lpm32
04BF 933A ST R19,-Y
04C0 932A ST R18,-Y
04C1 931A ST R17,-Y
04C2 930A ST R16,-Y
04C3 904000C7 LDS R4,adc_data+2
04C5 905000C8 LDS R5,adc_data+3
04C7 902000C5 LDS R2,adc_data
04C9 903000C6 LDS R3,adc_data+1
04CB 925A ST R5,-Y
04CC 924A ST R4,-Y
04CD 923A ST R3,-Y
04CE 922A ST R2,-Y
04CF 940E077A CALL cmp32f
04D1 F41C BGE 0x04D5
(0045) PORTB=~0B001;
04D2 EF8E LDI R24,0xFE
04D3 BB88 OUT 0x18,R24
04D4 C01C RJMP 0x04F1
(0046) else if (adc_data<0.5*1024/5) //小于0.5V PB1亮
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -