📄 echo.lst
字号:
(0048) {
(0049) unsigned char i;
(0050) unsigned char retVal=0;
0182 2744 CLR R20
(0051) RLS_DS18B20; //释放总线
0183 98A1 CBI 0x14,1
(0052) for(i=8;i>0;i--)
0184 E068 LDI R22,0x8
0185 C00F RJMP 0x0195
(0053) {
(0054) retVal>>=1;
0186 9546 LSR R20
(0055) HLD_DS18B20; //Maga16控制总线
0187 9AA1 SBI 0x14,1
(0056) CLR_DS18B20; //强制拉低
0188 98A9 CBI 0x15,1
(0057) ds_delay(2); //延时大于1us
0189 E002 LDI R16,2
018A DFA3 RCALL _ds_delay
(0058) SET_DS18B20; //释放总线,DS18B20会将总线强制拉低
018B 9AA9 SBI 0x15,1
(0059) //delay_nus(8);
(0060) RLS_DS18B20; //释放总线
018C 98A1 CBI 0x14,1
(0061) if(STU_DS18B20)
018D 9B99 SBIS 0x13,1
018E C001 RJMP 0x0190
(0062) retVal|=0x80;
018F 6840 ORI R20,0x80
(0063) ds_delay(50); //31us
0190 E302 LDI R16,0x32
0191 DF9C RCALL _ds_delay
(0064) HLD_DS18B20; //释放总线
0192 9AA1 SBI 0x14,1
(0065) SET_DS18B20; //释放总线,DS18B20会将总线强制拉低
0193 9AA9 SBI 0x15,1
0194 956A DEC R22
0195 2422 CLR R2
0196 1626 CP R2,R22
0197 F370 BCS 0x0186
(0066) //delay_nus(30); //30.38us
(0067) }
(0068) ds_delay(5); //2.71us(大于1us就行了)
0198 E005 LDI R16,5
0199 DF94 RCALL _ds_delay
(0069) return(retVal);
019A 2F04 MOV R16,R20
019B D279 RCALL pop_gset2
019C 9508 RET
_writeByteDS18B20:
temp --> R20
i --> R22
wb --> R10
019D D295 RCALL push_gset3
019E 2EA0 MOV R10,R16
(0070) }
(0071)
(0072) /**********************************************************************
(0073) functionName: unsigned char readByteDS18B20(void)
(0074) description :写DS18B20一个字节
(0075) **********************************************************************/
(0076) void writeByteDS18B20(unsigned char wb)
(0077) {
(0078) unsigned char i;
(0079) unsigned char temp;
(0080) RLS_DS18B20; //释放总线
019F 98A1 CBI 0x14,1
(0081) for(i=0;i<8;i++)
01A0 2766 CLR R22
01A1 C013 RJMP 0x01B5
(0082) {
(0083) HLD_DS18B20; //Maga16控制总线
01A2 9AA1 SBI 0x14,1
(0084) CLR_DS18B20; //强制拉低
01A3 98A9 CBI 0x15,1
(0085) ds_delay(6); //14.92us
01A4 E006 LDI R16,6
01A5 DF88 RCALL _ds_delay
(0086) //SET_DS18B20; //释放总线
(0087) //delay_nus(16); //14.92us
(0088) temp=wb>>i;
01A6 2D0A MOV R16,R10
01A7 2F16 MOV R17,R22
01A8 D2BB RCALL lsr8
01A9 2F40 MOV R20,R16
(0089) temp&=0x01;
01AA 7041 ANDI R20,1
(0090) if(temp)
01AB F011 BEQ 0x01AE
(0091) SET_DS18B20; //释放总线
01AC 9AA9 SBI 0x15,1
01AD C001 RJMP 0x01AF
(0092) else
(0093) CLR_DS18B20; //强制拉低
01AE 98A9 CBI 0x15,1
(0094) ds_delay(50); //30.38us
01AF E302 LDI R16,0x32
01B0 DF7D RCALL _ds_delay
(0095) //RLS_DS18B20; //释放总线
(0096) SET_DS18B20; //释放总线
01B1 9AA9 SBI 0x15,1
(0097) ds_delay(5); //2.71us(大于1us就行了)
01B2 E005 LDI R16,5
01B3 DF7A RCALL _ds_delay
01B4 9563 INC R22
01B5 3068 CPI R22,0x8
01B6 F358 BCS 0x01A2
(0098) }
(0099) }
01B7 D25F RCALL pop_gset3
01B8 9508 RET
_readTempDS18B20:
x --> R20
tempH --> R20
tempL --> R22
01B9 D276 RCALL push_gset2
(0100)
(0101) /**********************************************************************
(0102) functionName: unsigned int readTempDS18B20(void)
(0103) description :读DS18B20温度
(0104) **********************************************************************/
(0105) unsigned int readTempDS18B20(void)
(0106) {
(0107) unsigned char tempL,tempH;
(0108) unsigned int x;
(0109) //resetDS18B20();
(0110) //writeByteDS18B20(0xcc); //跳过ROM
(0111) //writeByteDS18B20(0x44); //启动温度转换
(0112) delay_nms(1); //等待1ms
01BA E001 LDI R16,1
01BB E010 LDI R17,0
01BC DF8F RCALL _delay_nms
(0113) resetDS18B20();
01BD DF9B RCALL _resetDS18B20
(0114) writeByteDS18B20(0xcc); //跳过ROM
01BE EC0C LDI R16,0xCC
01BF DFDD RCALL _writeByteDS18B20
(0115) writeByteDS18B20(0xbe); //读数据
01C0 EB0E LDI R16,0xBE
01C1 DFDB RCALL _writeByteDS18B20
(0116) tempL=readByteDS18B20();
01C2 DFBE RCALL _readByteDS18B20
01C3 2F60 MOV R22,R16
(0117) tempH=readByteDS18B20();
01C4 DFBC RCALL _readByteDS18B20
01C5 2F40 MOV R20,R16
(0118) x=(tempH<<8)|tempL;
01C6 2F54 MOV R21,R20
01C7 2F46 MOV R20,R22
(0119) resetDS18B20();
01C8 DF90 RCALL _resetDS18B20
(0120) writeByteDS18B20(0xcc); //跳过ROM
01C9 EC0C LDI R16,0xCC
01CA DFD2 RCALL _writeByteDS18B20
(0121) writeByteDS18B20(0x44); //启动温度转换
01CB E404 LDI R16,0x44
01CC DFD0 RCALL _writeByteDS18B20
(0122) return(x);
01CD 018A MOVW R16,R20
01CE D246 RCALL pop_gset2
01CF 9508 RET
_BCDtoASCII:
j --> R20
i --> R22
pstr --> R18
cBCD --> R16
01D0 D25F RCALL push_gset2
(0123) }
(0124) //压缩BCD码转换成ASCII码
(0125) void BCDtoASCII(unsigned char cBCD,unsigned char *pstr)
(0126) {
(0127) unsigned char i,j;
(0128) i=cBCD>>4;
01D1 2F60 MOV R22,R16
01D2 9562 SWAP R22
01D3 706F ANDI R22,0xF
(0129) j=cBCD&0x0F;
01D4 2F40 MOV R20,R16
01D5 704F ANDI R20,0xF
(0130) *pstr++=i+0x30;
01D6 2F86 MOV R24,R22
01D7 5D80 SUBI R24,0xD0
01D8 01F9 MOVW R30,R18
01D9 9381 ST R24,Z+
01DA 019F MOVW R18,R30
(0131) *pstr=j+0x30;
01DB 2F84 MOV R24,R20
01DC 5D80 SUBI R24,0xD0
01DD 8380 STD Z+0,R24
(0132) }
01DE D236 RCALL pop_gset2
01DF 9508 RET
_Read_Temp:
temp --> R20
01E0 D238 RCALL push_gset1
(0133) //读取当前温度并解释
(0134) void Read_Temp(void)
(0135) {
(0136) unsigned int temp=0;
01E1 2744 CLR R20
01E2 2755 CLR R21
(0137) temp=readTempDS18B20();
01E3 DFD5 RCALL _readTempDS18B20
01E4 01A8 MOVW R20,R16
(0138) BCDtoASCII((temp>>8)&0x0F,&temp_buf[0]);
01E5 EB25 LDI R18,0xB5
01E6 E030 LDI R19,0
01E7 940E04C1 CALL 0x4C1
01E9 DFE6 RCALL _BCDtoASCII
(0139) BCDtoASCII((temp>>8)&0x0F,&temp_buf[1]);
01EA EB26 LDI R18,0xB6
01EB E030 LDI R19,0
01EC 018A MOVW R16,R20
01ED 940E04C1 CALL 0x4C1
01EF DFE0 RCALL _BCDtoASCII
(0140) BCDtoASCII((temp>>4)&0x0F,&temp_buf[2]);
01F0 EB27 LDI R18,0xB7
01F1 E030 LDI R19,0
01F2 018A MOVW R16,R20
01F3 9516 LSR R17
01F4 9507 ROR R16
01F5 9516 LSR R17
01F6 9507 ROR R16
01F7 9516 LSR R17
01F8 9507 ROR R16
01F9 9516 LSR R17
01FA 9507 ROR R16
01FB 700F ANDI R16,0xF
01FC 7010 ANDI R17,0
01FD DFD2 RCALL _BCDtoASCII
(0141) BCDtoASCII(temp&0x0F,&temp_buf[3]);
01FE EB28 LDI R18,0xB8
01FF E030 LDI R19,0
0200 2F04 MOV R16,R20
0201 700F ANDI R16,0xF
0202 7010 ANDI R17,0
0203 DFCC RCALL _BCDtoASCII
(0142) }
0204 D217 RCALL pop_gset1
0205 9508 RET
FILE: D:\NEW\ECHO\LCD.c
(0001) // ************************************************
(0002) // *** 采用4位数据线的1602液晶驱动程序 ***
(0003) // *** LCD.C ***
(0004) // ************************************************
(0005) #define ENABLE_BIT_DEFINITIONS
(0006) #define LCD_C
(0007) #include "includes.h"
(0008) // ***** Define I/O pins ***** //
(0009) #define BIT7 0x80
(0010) #define BIT6 0x40
(0011) #define BIT5 0x20
(0012) #define BIT4 0x10
(0013) #define BIT3 0x08
(0014) #define BIT2 0x04
(0015) #define BIT1 0x02
(0016) #define BIT0 0x01
(0017)
(0018)
(0019) #define LCD_EN (1 << 2) //引脚定义
(0020) #define LCD_RS (1 << 0)
(0021) #define LCD_RW (1 << 1)
(0022)
(0023) #define lcd_set_e() (LCD_OP_PORT |= LCD_EN) //置位与清零
(0024) #define lcd_set_rs() (LCD_OP_PORT |= LCD_RS)
(0025) #define lcd_set_rw() (LCD_OP_PORT |= LCD_RW)
(0026) #define lcd_clear_e() (LCD_OP_PORT &= ~LCD_EN)
(0027) #define lcd_clear_rs() (LCD_OP_PORT &= ~LCD_RS)
(0028) #define lcd_clear_rw() (LCD_OP_PORT &= ~LCD_RW)
(0029) /****************************************************************/
(0030)
(0031) #define LCD_ON 0x0C
(0032) #define LCD_CURS_ON 0x0D
(0033) #define LCD_OFF 0x08
(0034) #define LCD_HOME 0x02
(0035) #define LCD_CLEAR 0x01
(0036) #define LCD_NEW_LINE 0xC0
(0037) #define LCD_FUNCTION_SET 0x28
(0038) #define LCD_MODE_SET 0x06
(0039)
(0040)
(0041) void LCD_INIT(void)
(0042) {
(0043) LCD_DIR_PORT = 0xff; // LCD port output
_LCD_INIT:
0206 EF8F LDI R24,0xFF
0207 BB8A OUT 0x1A,R24
(0044) LCD_OP_PORT = 0x30; // Load high-data to port
0208 E380 LDI R24,0x30
0209 BB8B OUT 0x1B,R24
(0045) lcd_clear_rw(); // Set LCD to write
020A 98D9 CBI 0x1B,1
(0046) lcd_clear_rs(); // Set LCD to command
020B 98D8 CBI 0x1B,0
020C 940E0471 CALL 0x471
(0047) lcd_set_e(); // Write data to LCD
(0048) asm("nop");
(0049) asm("nop");
(0050) lcd_clear_e(); // Disable LCD
(0051) delay_nus(40);
020E E208 LDI R16,0x28
020F E010 LDI R17,0
0210 DF24 RCALL _delay_nus
(0052) lcd_clear_rw() ; // Set LCD to write
0211 98D9 CBI 0x1B,1
(0053) lcd_clear_rs(); // Set LCD to command
0212 98D8 CBI 0x1B,0
0213 940E0471 CALL 0x471
(0054) lcd_set_e(); // Write data to LCD
(0055) asm("nop");
(0056) asm("nop");
(0057) lcd_clear_e(); // Disable LCD
(0058) delay_nus(40);
0215 E208 LDI R16,0x28
0216 E010 LDI R17,0
0217 DF1D RCALL _delay_nus
0218 940E0471 CALL 0x471
(0059) lcd_set_e(); // Write data to LCD
(0060) asm("nop");
(0061) asm("nop");
(0062) lcd_clear_e(); // Disable LCD
(0063) delay_nus(40);
021A E208 LDI R16,0x28
021B E010 LDI R17,0
021C DF18 RCALL _delay_nus
(0064) LCD_OP_PORT = 0x20;
021D E280 LDI R24,0x20
021E BB8B OUT 0x1B,R24
021F 940E0471 CALL 0x471
(0065) lcd_set_e(); // Write data to LCD
(0066) asm("nop");
(0067) asm("nop");
(0068) lcd_clear_e(); // Disable LCD
(0069) delay_nus(40);
0221 E208 LDI R16,0x28
0222 E010 LDI R17,0
(0070) }
0223 CF11 RJMP _delay_nus
_LCD_Busy:
low --> R20
high --> R22
temp --> R10
0224 D20E RCALL push_gset3
(0071) //*****************************************************//
(0072) // This routine will return the busy flag from the LCD //
(0073) //*****************************************************//
(0074) void LCD_Busy ( void )
(0075) {
(0076) unsigned char temp,high;
(0077) unsigned char low;
(0078) LCD_DIR_PORT = 0x0f; // Make I/O Port input
0225 E08F LDI R24,0xF
0226 BB8A OUT 0x1A,R24
(0079) do
(0080) {
(0081) temp=LCD_OP_PORT;
0227 B2AB IN R10,0x1B
(0082) temp=temp&BIT3;
0228 2D8A MOV R24,R10
0229 7088 ANDI R24,0x8
022A 2EA8 MOV R10,R24
(0083) LCD_OP_PORT=temp;
022B BB8B OUT 0x1B,R24
(0084) lcd_set_rw(); // Set LCD to READ
022C 9AD9 SBI 0x1B,1
(0085) lcd_clear_rs();
022D 98D8 CBI 0x1B,0
(0086) lcd_set_e();
022E 9ADA SBI 0x1B,2
(0087) delay_nus(3);
022F E003 LDI R16,3
0230 E010 LDI R17,0
0231 DF03 RCALL _delay_nus
(0088) high = LCD_IP_PORT; // read the high nibble.
0232 B369 IN R22,0x19
(0089) lcd_clear_e(); // Disable LCD
0233 98DA CBI 0x1B,2
(0090) lcd_set_e();
0234 9ADA SBI 0x1B,2
(0091) asm("nop");
0235 0000 NOP
(0092) asm("nop");
0236 0000 NOP
(0093) low = LCD_IP_PORT; // read the low nibble.
0237 B349 IN R20,0x19
(0094) lcd_clear_e(); // Disable LCD
0238 98DA CBI 0x1B,2
(0095) } while(high & 0x80);
0239 FD67 SBRC R22,7
023A CFEC RJMP 0x0227
(0096) delay_nus(20);
023B E104 LDI R16,0x14
023C E010 LDI R17,0
023D DEF7 RCALL _delay_nus
(0097) }
023E D1D8 RCALL pop_gset3
023F 9508 RET
_LCD_WriteControl:
temp --> R20
CMD --> R22
0240 D1EF RCALL push_gset2
0241 2F60 MOV R22,R16
(0098) // ********************************************** //
(0099) // *** Write a control instruction to the LCD *** //
(0100) // ********************************************** //
(0101) void LCD_WriteControl (unsigned char CMD)
(0102) {
(0103) char temp;
(0104) LCD_Busy(); // Test if LCD busy
0242 DFE1 RCALL _LCD_Busy
0243 940E0489 CALL 0x489
(0105) LCD_DIR_PORT = 0xff; // LCD port output
(0106) temp=LCD_OP_PORT;
(0107) temp=temp&BIT3;
(0108) LCD_OP_PORT =(CMD & 0xf0)|temp; // Load high-data to port
(0109) lcd_clear_rw(); // Set LCD to write
(0110) lcd_clear_rs(); // Set LCD to command
0245 98D8 CBI 0x1B,0
0246 940E0471 CALL 0x471
0248 940E04BA CALL 0x4BA
(0111) lcd_set_e(); // Write data to LCD
(0112) asm("nop");
(0113) asm("nop");
(0114) lcd_clear_e(); // Disable LCD
(0115) LCD_OP_PORT =(CMD<<4)|temp; // Load low-data to port
(0116) lcd_clear_rw(); // Set LCD to write
(0117) lcd_clear_rs(); // Set LCD to command
024A 98D8 CBI 0x1B,0
024B 940E0471 CALL 0x471
(0118) lcd_set_e(); // Write data to LCD
(0119) asm("nop");
(0120) asm("nop");
(0121) lcd_clear_e(); // Disable LCD
(0122) }
024D D1C7 RCALL pop_gset2
024E 9508 RET
_LCD_WriteData:
temp --> R20
Data --> R22
024F D1E0 RCALL push_gset2
0250 2F60 MOV R22,R16
(0123) // ***************************************** //
(0124) // *** Write one byte of data to the LCD *** //
(0125) // ***************************************** //
(0126) void LCD_WriteData (unsigned char Data)
(0127) {
(0128) char temp;
(0129) LCD_Busy(); // Test if LCD Busy
0251 DFD2 RCALL _LCD_Busy
0252 940E0489 CALL 0x489
(0130) LCD_DIR_PORT = 0xFF; // LCD port output
(0131) temp=LCD_OP_PORT;
(0132) temp=temp&BIT3;
(0133) LCD_OP_PORT =(Data & 0xf0)|temp; // Load high-data to port
(0134) lcd_clear_rw() ; // Set LCD to write
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -