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

📄 adc_port.lst

📁 AVR单片机做的数字电压表
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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 + -