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

📄 ad7705.lst

📁 基于mega128上实现ad7705的驱动程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0166 01CE      MOVW	R24,R28
    0167 9602      ADIW	R24,2
    0168 01F0      MOVW	R30,R0
    0169 0FE8      ADD	R30,R24
    016A 1FF9      ADC	R31,R25
    016B 8020      LDD	R2,Z+0
    016C 8031      LDD	R3,Z+1
    016D 01CE      MOVW	R24,R28
    016E 01F0      MOVW	R30,R0
    016F 0FE8      ADD	R30,R24
    0170 1FF9      ADC	R31,R25
    0171 8040      LDD	R4,Z+0
    0172 8051      LDD	R5,Z+1
    0173 1424      CP	R2,R4
    0174 0435      CPC	R3,R5
    0175 F500      BCC	0x0196
(0120)       {
(0121)         temp=value_buf[i];
    0176 E082      LDI	R24,2
    0177 9D8C      MUL	R24,R12
    0178 01F0      MOVW	R30,R0
    0179 01CE      MOVW	R24,R28
    017A 0FE8      ADD	R30,R24
    017B 1FF9      ADC	R31,R25
    017C 80E0      LDD	R14,Z+0
    017D 80F1      LDD	R15,Z+1
(0122)         value_buf[i]=value_buf[i+1]; 
    017E E082      LDI	R24,2
    017F 9D8C      MUL	R24,R12
    0180 01CE      MOVW	R24,R28
    0181 9602      ADIW	R24,2
    0182 01F0      MOVW	R30,R0
    0183 0FE8      ADD	R30,R24
    0184 1FF9      ADC	R31,R25
    0185 8020      LDD	R2,Z+0
    0186 8031      LDD	R3,Z+1
    0187 01CE      MOVW	R24,R28
    0188 01F0      MOVW	R30,R0
    0189 0FE8      ADD	R30,R24
    018A 1FF9      ADC	R31,R25
    018B 8231      STD	Z+1,R3
    018C 8220      STD	Z+0,R2
(0123)         value_buf[i+1]=temp;
    018D E082      LDI	R24,2
    018E 9D8C      MUL	R24,R12
    018F 01F0      MOVW	R30,R0
    0190 01CE      MOVW	R24,R28
    0191 9602      ADIW	R24,2
    0192 0FE8      ADD	R30,R24
    0193 1FF9      ADC	R31,R25
    0194 82F1      STD	Z+1,R15
    0195 82E0      STD	Z+0,R14
    0196 94C3      INC	R12
    0197 E087      LDI	R24,7
    0198 198A      SUB	R24,R10
    0199 16C8      CP	R12,R24
    019A F408      BCC	0x019C
    019B CFC8      RJMP	0x0164
    019C 94A3      INC	R10
    019D 2D8A      MOV	R24,R10
    019E 3086      CPI	R24,6
    019F F408      BCC	0x01A1
    01A0 CFC1      RJMP	0x0162
(0124)       }
(0125)     }
(0126)   }
(0127)   return value_buf[(N-1)/2];
    01A1 810E      LDD	R16,Y+6
    01A2 811F      LDD	R17,Y+7
    01A3 962E      ADIW	R28,0xE
    01A4 940E053B  CALL	pop_gset5
    01A6 9508      RET
_key_scay:
  key                  --> R20
    01A7 940E0546  CALL	push_gset1
FILE: D:\各种模块设计\模块程序集\ad7705\KeyScay.h
(0001) /*............................................................*/ 
(0002)  //键盘扫描函数
(0003)  //输入无
(0004)  //输出无
(0005)  //备注:采用线反转法
(0006)  
(0007)  unsigned char key_scay(void) 
(0008)   {
(0009)    unsigned char key;
(0010)    DDRB=0xF0;           //PB0-3为输入,PB4-7为输出,
    01A9 EF80      LDI	R24,0xF0
    01AA BB87      OUT	0x17,R24
(0011)    PORTB=0x0F;          //行线为1且内部上拉,列线为0
    01AB E08F      LDI	R24,0xF
    01AC BB88      OUT	0x18,R24
(0012)    
(0013)    if(PINA&0x08)        //第一行有键按下
    01AD 9BCB      SBIS	0x19,3
    01AE C002      RJMP	0x01B1
(0014)      key=0;
    01AF 2744      CLR	R20
    01B0 C00B      RJMP	0x01BC
(0015)    else if(PINA&0x04)   //第二行有键按下
    01B1 9BCA      SBIS	0x19,2
    01B2 C002      RJMP	0x01B5
(0016)      key=4;
    01B3 E044      LDI	R20,4
    01B4 C007      RJMP	0x01BC
(0017)    else if(PINA&0x02)   //第三行有键按下
    01B5 9BC9      SBIS	0x19,1
    01B6 C002      RJMP	0x01B9
(0018)      key=8;
    01B7 E048      LDI	R20,0x8
    01B8 C003      RJMP	0x01BC
(0019)    else if(PINA&0x01)   //第四行有键按下
    01B9 9BC8      SBIS	0x19,0
    01BA C001      RJMP	0x01BC
(0020)      key=12;
    01BB E04C      LDI	R20,0xC
(0021)    DDRB=0x0F;           //反转I/O口方向
    01BC E08F      LDI	R24,0xF
    01BD BB87      OUT	0x17,R24
(0022)    PORTB=0xF0;          //置行为低电平
    01BE EF80      LDI	R24,0xF0
    01BF BB88      OUT	0x18,R24
(0023)    delay_nms(20);       //延迟消抖
    01C0 E104      LDI	R16,0x14
    01C1 E010      LDI	R17,0
    01C2 DED5      RCALL	_delay_nms
(0024)    
(0025)    if(PINA&0x80)        //第一列有键按下
    01C3 9BCF      SBIS	0x19,7
    01C4 C001      RJMP	0x01C6
(0026)      key+=0;
    01C5 C00B      RJMP	0x01D1
(0027)    else if(PINA&0x40)   //第二列有键按下
    01C6 9BCE      SBIS	0x19,6
    01C7 C002      RJMP	0x01CA
(0028)      key+=1;
    01C8 9543      INC	R20
    01C9 C007      RJMP	0x01D1
(0029)    else if(PINA&0x20)   //第三列有键按下
    01CA 9BCD      SBIS	0x19,5
    01CB C002      RJMP	0x01CE
(0030)      key+=2;
    01CC 5F4E      SUBI	R20,0xFE
    01CD C003      RJMP	0x01D1
(0031)    else if(PINA&0x10)   //第四列有键按下
    01CE 9BCC      SBIS	0x19,4
    01CF C001      RJMP	0x01D1
(0032)      key+=3;
    01D0 5F4D      SUBI	R20,0xFD
(0033)    DDRB=0xF0;
    01D1 EF80      LDI	R24,0xF0
    01D2 BB87      OUT	0x17,R24
(0034)    PORTB=0x0F;
    01D3 E08F      LDI	R24,0xF
    01D4 BB88      OUT	0x18,R24
(0035)    return(key);
    01D5 2F04      MOV	R16,R20
    01D6 940E0549  CALL	pop_gset1
    01D8 9508      RET
FILE: D:\各种模块设计\模块程序集\ad7705\lcd.h
(0001) /****************************************************************************/
(0002) //功能: LCD1602液晶显示程序
(0003) //输入: 无
(0004) //输出: 无
(0005) //备注: LCD1602采用四线连接方式4~7
(0006) /****************************************************************************/
(0007) #include "delay.h"
(0008) 
(0009) #define uchar unsigned char 
(0010) #define uint unsigned int
(0011) /****************************端口宏定义**************************************/
(0012) //LCD1602端口连接按照下面方式连接,RW接地.																		 
(0013) #define LCD_EN_PORT   PORTA 
(0014) #define LCD_EN_DDR    DDRA 
(0015) #define LCD_EN        (1<<PA3)
(0016) 
(0017) #define LCD_RS_PORT   PORTA 
(0018) #define LCD_RS_DDR    DDRA 
(0019) #define LCD_RS        (1<<PA1)
(0020) 
(0021) #define LCD_DATA_PORT PORTA 
(0022) #define LCD_DATA_DDR  DDRA 
(0023) #define LCD_DATA_PIN  PINA 
(0024) #define LCD_DATA ((1<<4)|(1<<5)|(1<<6)|(1<<7))
(0025) /****************************函数申明****************************************/
(0026) void LCD_init(void);
(0027) void LCD_en_write(void);
(0028) void LCD_Write_char(uchar command,uchar data);
(0029) void LCD_Clear(void);
(0030) void LCD_set_xy (uchar x, uchar y);
(0031) void LCD_DisplayCharacter (uchar Char);
(0032) void LCD_DisplayString (uchar x, uchar y ,uchar *string);
(0033) void LCD_DisplayInt (uchar x, uchar y ,uint t);
(0034) void LCD_Displayasc (uchar x, uchar y,  uchar asc);
(0035) void LCD_DisplayLong(uchar x, uchar y ,unsigned long t);
(0036) 
(0037) /*******************************液晶初始化***********************************/
(0038) void LCD_init(void) //液晶初始化 
(0039) { 
(0040)   LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出 
_LCD_init:
    01D9 B38A      IN	R24,0x1A
    01DA 6F80      ORI	R24,0xF0
    01DB BB8A      OUT	0x1A,R24
(0041)   LCD_EN_DDR|=LCD_EN; //设置EN方向为输出 
    01DC 9AD3      SBI	0x1A,3
(0042)   LCD_RS_DDR|=LCD_RS; //设置RS方向为输出 
    01DD 9AD1      SBI	0x1A,1
(0043)   LCD_Write_char(1,0x28); 
    01DE E228      LDI	R18,0x28
    01DF E001      LDI	R16,1
    01E0 D017      RCALL	_LCD_Write_char
(0044)   LCD_en_write(); 
    01E1 D010      RCALL	_LCD_en_write
(0045)   delay_nus(40); 
    01E2 E208      LDI	R16,0x28
    01E3 E010      LDI	R17,0
    01E4 DE9A      RCALL	_delay_nus
(0046)   LCD_Write_char(1,0x28); //4位显示 
    01E5 E228      LDI	R18,0x28
    01E6 E001      LDI	R16,1
    01E7 D010      RCALL	_LCD_Write_char
(0047)   LCD_Write_char(1,0x0c); //显示开 
    01E8 E02C      LDI	R18,0xC
    01E9 E001      LDI	R16,1
    01EA D00D      RCALL	_LCD_Write_char
(0048)   LCD_Write_char(1,0x01); //清屏 
    01EB E021      LDI	R18,1
    01EC E001      LDI	R16,1
    01ED D00A      RCALL	_LCD_Write_char
(0049)   delay_nms(2); 
    01EE E002      LDI	R16,2
    01EF E010      LDI	R17,0
    01F0 DEA7      RCALL	_delay_nms
    01F1 9508      RET
(0050) } 
(0051) /*******************************液晶使能*************************************/
(0052) void LCD_en_write(void) //液晶使能 
(0053) { 
(0054)   LCD_EN_PORT|=LCD_EN; 
_LCD_en_write:
    01F2 9ADB      SBI	0x1B,3
(0055)   delay_nus(1); 
    01F3 E001      LDI	R16,1
    01F4 E010      LDI	R17,0
    01F5 DE89      RCALL	_delay_nus
(0056)   LCD_EN_PORT&=~LCD_EN; 
    01F6 98DB      CBI	0x1B,3
    01F7 9508      RET
_LCD_Write_char:
  data                 --> R20
  command              --> R22
    01F8 940E0544  CALL	push_gset2
    01FA 2F42      MOV	R20,R18
    01FB 2F60      MOV	R22,R16
(0057) } 
(0058) /*******************************写操作***************************************/
(0059) void LCD_Write_char(unsigned char command,unsigned char data) 
(0060) { 
(0061)   delay_nus(16); 
    01FC E100      LDI	R16,0x10
    01FD E010      LDI	R17,0
    01FE DE80      RCALL	_delay_nus
(0062)   if(command==1)        //command为1则写指令
    01FF 3061      CPI	R22,1
    0200 F411      BNE	0x0203
(0063)   LCD_RS_PORT&=~LCD_RS; //RS=0 
    0201 98D9      CBI	0x1B,1
    0202 C003      RJMP	0x0206
(0064)   else                 //command为零则写数据
(0065)   LCD_RS_PORT&=LCD_RS; 
    0203 B38B      IN	R24,0x1B
    0204 7082      ANDI	R24,2
    0205 BB8B      OUT	0x1B,R24
(0066)   
(0067)   LCD_DATA_PORT&=0x0f; //清高四位 
    0206 B38B      IN	R24,0x1B
    0207 708F      ANDI	R24,0xF
    0208 BB8B      OUT	0x1B,R24
(0068)   LCD_DATA_PORT|=data&0xf0; //写高四位 
    0209 2F84      MOV	R24,R20
    020A 7F80      ANDI	R24,0xF0
    020B B22B      IN	R2,0x1B
    020C 2A28      OR	R2,R24
    020D BA2B      OUT	0x1B,R2
(0069)   LCD_en_write(); 
    020E DFE3      RCALL	_LCD_en_write
(0070)   data=data<<4; //低四位移到高四位 
    020F 2F84      MOV	R24,R20
    0210 708F      ANDI	R24,0xF
    0211 9582      SWAP	R24
    0212 2F48      MOV	R20,R24
(0071)   LCD_DATA_PORT&=0x0f; //清高四位 
    0213 B38B      IN	R24,0x1B
    0214 708F      ANDI	R24,0xF
    0215 BB8B      OUT	0x1B,R24
(0072)   LCD_DATA_PORT|=data&0xf0; //写低四位 
    0216 2F84      MOV	R24,R20
    0217 7F80      ANDI	R24,0xF0
    0218 B22B      IN	R2,0x1B
    0219 2A28      OR	R2,R24
    021A BA2B      OUT	0x1B,R2
(0073)   LCD_en_write(); 
    021B DFD6      RCALL	_LCD_en_write
    021C 940E0535  CALL	pop_gset2
    021E 9508      RET
(0074) } 
(0075) 
(0076) 
(0077) 
(0078) /*******************************清屏*****************************************/
(0079) void LCD_Clear(void)
(0080) {
(0081) LCD_Write_char(1,0x01);
_LCD_Clear:
    021F E021      LDI	R18,1
    0220 E001      LDI	R16,1
    0221 DFD6      RCALL	_LCD_Write_char
    0222 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    0223 940E0544  CALL	push_gset2
    0225 2F42      MOV	R20,R18
    0226 2F60      MOV	R22,R16
(0082) }
(0083) /****************************************************************************/
(0084) //函数名:    LCD_Cursor (char row, char column)
(0085) //功能:      设置液晶显示横,纵坐标
(0086) //输入:      row,column
(0087) //输出:      无
(0088) //备注:      
(0089) /****************************************************************************/
(0090) void LCD_set_xy (uchar x, uchar y)
(0091) {
(0092)   uchar address;
(0093)    {
(0094)      if(y==0)
    0227 2344      TST	R20
    0228 F419      BNE	0x022C
(0095) 	 address=0x80+x;
    0229 2F46      MOV	R20,R22
    022A 5840      SUBI	R20,0x80
    022B C002      RJMP	0x022E
(0096) 	 else
(0097) 	 address=0x90+x;
    022C 2F46      MOV	R20,R22
    022D 5740      SUBI	R20,0x70
(0098) 	 LCD_Write_char(1,address);
    022E 2F24      MOV	R18,R20
    022F E001      LDI	R16,1
    0230 DFC7      RCALL	_LCD_Write_char
(0099)    }
    0231 940E0535  CALL	pop_gset2
    0233 9508      RET
_LCD_DisplayCharacter:
  Char                 --> R20
    0234 940E0546  CALL	push_gset1
    0236 2F40      MOV	R20,R16
(0100) }
(0101) /****************************************************************************/
(0102) //函数名:    LCD_DisplayCharacter (char Char)
(0103) //功能:      显示一个字符
(0104) //输入:      Char
(0105) //输出:      无
(0106) //备注:      
(0107) /****************************************************************************/
(0108) void LCD_DisplayCharacter (uchar Char)
(0109) {
(0110)   LCD_Write_char (0,Char);
    0237 2F24      MOV	R18,R20
    0238 2700      CLR	R16
    0239 DFBE      RCALL	_LCD_Write_char
    023A 940E0549  CALL	pop_gset1
    023C 9508      RET
_LCD_DisplayString:
  string               --> R20
  y                    --> R10
  x                    --> R22
    023D 940E0542  CALL	push_gset3
    023F 2EA2      MOV	R10,R18
    0240 2F60      MOV	R22,R16
    0241 814E      LDD	R20,Y+6
    0242 815F      LDD	R21,Y+7
(0111) }
(0112) /****************************************************************************/
(0113) //函数名:    LCD_DisplayString() 
(0114) //功能:      显示一个字符串
(0115) //输入:      x,y,*string
(0116) //输出:      无
(0117) //备注:      
(0118) /****************************************************************************/
(0119) void LCD_DisplayString (uchar x, uchar y ,uchar *string)
(0120) {
(0121)  LCD_set_xy (x, y);
    0243 2D2A      MOV	R18,R10
    0244 2F06      MOV	R16,R22
    0245 DFDD      RCALL	_LCD_set_xy
    0246 C004      RJMP	0x024B
(0122)  while (*string)
(0123)   LCD_DisplayCharacter (*string++);
    0247 01FA      MOVW	R30,R20
    0248 9101      LD	R16,Z+

⌨️ 快捷键说明

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