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