📄 display.lst
字号:
021B 9508 RET
_writeByteDS18B20:
temp --> R20
i --> R22
wb --> R10
021C 940E0301 CALL push_gset3
021E 2EA0 MOV R10,R16
(0088) }
(0089)
(0090)
(0091) /**********************************************************************
(0092) functionName: BYTE readByteDS18B20(void)
(0093) description :写DS18B20一个字节
(0094) **********************************************************************/
(0095) void writeByteDS18B20(BYTE wb)
(0096) {
(0097) unsigned char i;
(0098) unsigned char temp;
(0099) RLS_DS18B20; //释放总线
021F 988E CBI 0x11,6
(0100) for(i=0;i<8;i++)
0220 2766 CLR R22
0221 C01A RJMP 0x023C
(0101) {
(0102) HLD_DS18B20; //Maga16控制总线
0222 9A8E SBI 0x11,6
(0103) CLR_DS18B20; //强制拉低
0223 9896 CBI 0x12,6
(0104) delayUs(16); //14.92us
0224 E100 LDI R16,0x10
0225 940E0190 CALL _delayUs
(0105) temp=wb>>i;
0227 2D0A MOV R16,R10
0228 2F16 MOV R17,R22
0229 940E031C CALL lsr8
022B 2F40 MOV R20,R16
(0106) temp&=0x01;
022C 7041 ANDI R20,1
(0107) if(temp)
022D F011 BEQ 0x0230
(0108) RLS_DS18B20; //释放总线
022E 988E CBI 0x11,6
022F C001 RJMP 0x0231
(0109) else
(0110) CLR_DS18B20; //强制拉低
0230 9896 CBI 0x12,6
(0111) delayUs(16); //14.92us
0231 E100 LDI R16,0x10
0232 940E0190 CALL _delayUs
(0112) delayUs(35); //30.38us
0234 E203 LDI R16,0x23
0235 940E0190 CALL _delayUs
(0113) RLS_DS18B20; //释放总线
0237 988E CBI 0x11,6
(0114) delayUs(1); //2.71us(大于1us就行了)
0238 E001 LDI R16,1
0239 940E0190 CALL _delayUs
023B 9563 INC R22
023C 3068 CPI R22,0x8
023D F320 BCS 0x0222
023E 940E02F7 CALL pop_gset3
0240 9508 RET
_readTempDS18B20:
x --> R20
tempH --> R20
tempL --> R22
0241 940E0303 CALL push_gset2
(0115) }
(0116) }
(0117)
(0118)
(0119)
(0120)
(0121)
(0122)
(0123) /**********************************************************************
(0124) functionName: unsigned int readTempDS18B20(void)
(0125) description :读DS18B20温度
(0126) **********************************************************************/
(0127) unsigned int readTempDS18B20(void)
(0128) {
(0129) unsigned char tempL,tempH;
(0130) unsigned int x;
(0131) resetDS18B20();
0243 DF7C RCALL _resetDS18B20
(0132) writeByteDS18B20(0xcc); //跳过ROM
0244 EC0C LDI R16,0xCC
0245 DFD6 RCALL _writeByteDS18B20
(0133) writeByteDS18B20(0x44); //启动温度转换
0246 E404 LDI R16,0x44
0247 DFD4 RCALL _writeByteDS18B20
(0134) delayUs(2);
0248 E002 LDI R16,2
0249 940E0190 CALL _delayUs
(0135) resetDS18B20();
024B DF74 RCALL _resetDS18B20
(0136) writeByteDS18B20(0xcc); //跳过ROM
024C EC0C LDI R16,0xCC
024D DFCE RCALL _writeByteDS18B20
(0137) writeByteDS18B20(0xbe); //读数据
024E EB0E LDI R16,0xBE
024F DFCC RCALL _writeByteDS18B20
(0138) tempL=readByteDS18B20();
0250 DF9E RCALL _readByteDS18B20
0251 2F60 MOV R22,R16
(0139) tempH=readByteDS18B20();
0252 DF9C RCALL _readByteDS18B20
0253 2F40 MOV R20,R16
(0140) x=(tempH<<8)|tempL;
0254 2F54 MOV R21,R20
0255 2F46 MOV R20,R22
(0141) return(x);
0256 018A MOVW R16,R20
0257 940E02F4 CALL pop_gset2
0259 9508 RET
FILE: F:\我的设计\delphi\uartdispy\mcu\lcd.c
(0001) /*********************************Copyright (c)*********************************
(0002) **
(0003) ** 文 件 名: LCD.c
(0004) ** 最后修改日期: 2005年06月8日
(0005) ** 描 述: 1602液晶驱动函数
(0006) ** 版 本: V1.0
(0007) ** 主 控 芯 片:M16 晶振频率:8 MHZ
(0008) *******************************************************************************/
(0009) #include <iom16v.h>
(0010) #include <macros.h>
(0011) #include "function.h"
(0012) #include "define.h"
(0013) #include "defineLCD.h"
(0014) /******************************************************************************
(0015)
(0016)
(0017) 函数定义
(0018)
(0019) ******************************************************************************/
(0020)
(0021) void LCD_init(void) //液晶初始化
(0022) {
(0023) delay_nms(15);
_LCD_init:
025A E00F LDI R16,0xF
025B E010 LDI R17,0
025C 940E01B1 CALL _delay_nms
(0024) LCD_write_char(0x28,0); //4位显示
025E 2722 CLR R18
025F 2733 CLR R19
0260 E208 LDI R16,0x28
0261 E010 LDI R17,0
0262 D03E RCALL _LCD_write_char
(0025) LCD_write_char(0x0c,0); //显示开
0263 2722 CLR R18
0264 2733 CLR R19
0265 E00C LDI R16,0xC
0266 E010 LDI R17,0
0267 D039 RCALL _LCD_write_char
(0026) LCD_write_char(0x01,0); //清屏
0268 2722 CLR R18
0269 2733 CLR R19
026A E001 LDI R16,1
026B E010 LDI R17,0
026C D034 RCALL _LCD_write_char
026D 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
026E 940E0301 CALL push_gset3
0270 2EA2 MOV R10,R18
0271 2F60 MOV R22,R16
0272 814E LDD R20,Y+6
0273 815F LDD R21,Y+7
(0027) }
(0028)
(0029)
(0030) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0031) {
(0032) LCD_set_xy( X, Y ); //写地址
0274 2D2A MOV R18,R10
0275 2F06 MOV R16,R22
0276 D010 RCALL _LCD_set_xy
0277 C008 RJMP 0x0280
(0033)
(0034) while (*s) // 写显示字符
(0035) {
(0036) LCD_write_char( 0, *s );
0278 01FA MOVW R30,R20
0279 8120 LDD R18,Z+0
027A 2733 CLR R19
027B 2700 CLR R16
027C 2711 CLR R17
027D D023 RCALL _LCD_write_char
(0037) s ++;
027E 5F4F SUBI R20,0xFF
027F 4F5F SBCI R21,0xFF
0280 01FA MOVW R30,R20
0281 8020 LDD R2,Z+0
0282 2022 TST R2
0283 F7A1 BNE 0x0278
0284 940E02F7 CALL pop_gset3
0286 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
0287 940E0303 CALL push_gset2
0289 2F42 MOV R20,R18
028A 2F60 MOV R22,R16
(0038) }
(0039) }
(0040)
(0041)
(0042) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0043) {
(0044) unsigned char address;
(0045) if (y == 0) address = 0x80 + x;
028B 2344 TST R20
028C F419 BNE 0x0290
028D 2F46 MOV R20,R22
028E 5840 SUBI R20,0x80
028F C002 RJMP 0x0292
(0046) else
(0047) address = 0xc0 + x;
0290 2F46 MOV R20,R22
0291 5440 SUBI R20,0x40
(0048) LCD_write_char( address, 0 );
0292 2722 CLR R18
0293 2733 CLR R19
0294 2F04 MOV R16,R20
0295 2711 CLR R17
0296 D00A RCALL _LCD_write_char
0297 940E02F4 CALL pop_gset2
0299 9508 RET
(0049) }
(0050)
(0051) void LCD_en_write(void) //液晶使能
(0052) {
(0053) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
029A 9AAF SBI 0x15,7
(0054) delay_nus(1);
029B E001 LDI R16,1
029C E010 LDI R17,0
029D 940E0198 CALL _delay_nus
(0055) LCD_EN_PORT&=~LCD_EN;
029F 98AF CBI 0x15,7
02A0 9508 RET
_LCD_write_char:
data_temp --> R22
command_temp --> R20
data --> R12
command --> R10
02A1 940E02FF CALL push_gset4
02A3 0169 MOVW R12,R18
02A4 0158 MOVW R10,R16
(0056) }
(0057)
(0058) void LCD_write_char(unsigned command,unsigned data) // 写数据
(0059) {
(0060) unsigned command_temp,data_temp;
(0061) command_temp=command;
02A5 01A5 MOVW R20,R10
(0062) data_temp=data;
02A6 01B6 MOVW R22,R12
(0063) delay_nus(16);
02A7 E100 LDI R16,0x10
02A8 E010 LDI R17,0
02A9 940E0198 CALL _delay_nus
(0064) if(command==0)
02AB 3040 CPI R20,0
02AC 0745 CPC R20,R21
02AD F511 BNE 0x02D0
(0065) {
(0066) LCD_RS_PORT|=LCD_RS; //RS=1
02AE 9AAE SBI 0x15,6
(0067) LCD_DATA_PORT&=0X0f;
02AF B38B IN R24,0x1B
02B0 708F ANDI R24,0xF
02B1 BB8B OUT 0x1B,R24
(0068) LCD_DATA_PORT|=data_temp&0xf0; //写高四位
02B2 01CB MOVW R24,R22
02B3 7F80 ANDI R24,0xF0
02B4 7090 ANDI R25,0
02B5 B22B IN R2,0x1B
02B6 2433 CLR R3
02B7 2A28 OR R2,R24
02B8 2A39 OR R3,R25
02B9 BA2B OUT 0x1B,R2
(0069) LCD_en_write();
02BA DFDF RCALL _LCD_en_write
(0070) data_temp=data_temp<<4;
02BB 0F66 LSL R22
02BC 1F77 ROL R23
02BD 0F66 LSL R22
02BE 1F77 ROL R23
02BF 0F66 LSL R22
02C0 1F77 ROL R23
02C1 0F66 LSL R22
02C2 1F77 ROL R23
(0071) LCD_DATA_PORT&=0X0f;
02C3 B38B IN R24,0x1B
02C4 708F ANDI R24,0xF
02C5 BB8B OUT 0x1B,R24
(0072) LCD_DATA_PORT|=data_temp&0xf0; //写低四位
02C6 01CB MOVW R24,R22
02C7 7F80 ANDI R24,0xF0
02C8 7090 ANDI R25,0
02C9 B22B IN R2,0x1B
02CA 2433 CLR R3
02CB 2A28 OR R2,R24
02CC 2A39 OR R3,R25
02CD BA2B OUT 0x1B,R2
(0073) LCD_en_write();
02CE DFCB RCALL _LCD_en_write
(0074) }
02CF C021 RJMP 0x02F1
(0075) else
(0076) {
(0077) LCD_RS_PORT&=~LCD_RS; //RS=0
02D0 98AE CBI 0x15,6
(0078) LCD_DATA_PORT&=0X0f;
02D1 B38B IN R24,0x1B
02D2 708F ANDI R24,0xF
02D3 BB8B OUT 0x1B,R24
(0079) LCD_DATA_PORT|=command_temp&0xf0; //写高四位
02D4 01CA MOVW R24,R20
02D5 7F80 ANDI R24,0xF0
02D6 7090 ANDI R25,0
02D7 B22B IN R2,0x1B
02D8 2433 CLR R3
02D9 2A28 OR R2,R24
02DA 2A39 OR R3,R25
02DB BA2B OUT 0x1B,R2
(0080) LCD_en_write();
02DC DFBD RCALL _LCD_en_write
(0081) command_temp=command_temp<<4;
02DD 0F44 LSL R20
02DE 1F55 ROL R21
02DF 0F44 LSL R20
02E0 1F55 ROL R21
02E1 0F44 LSL R20
02E2 1F55 ROL R21
02E3 0F44 LSL R20
02E4 1F55 ROL R21
(0082) LCD_DATA_PORT&=0x0f;
02E5 B38B IN R24,0x1B
02E6 708F ANDI R24,0xF
02E7 BB8B OUT 0x1B,R24
(0083) LCD_DATA_PORT|=command_temp&0xf0; //写低四位
02E8 01CA MOVW R24,R20
02E9 7F80 ANDI R24,0xF0
02EA 7090 ANDI R25,0
02EB B22B IN R2,0x1B
02EC 2433 CLR R3
02ED 2A28 OR R2,R24
02EE 2A39 OR R3,R25
02EF BA2B OUT 0x1B,R2
(0084) LCD_en_write();
02F0 DFA9 RCALL _LCD_en_write
(0085) }
FILE: <library>
02F1 940E02FA CALL pop_gset4
02F3 9508 RET
pop_gset2:
02F4 E0E2 LDI R30,2
02F5 940C0309 JMP pop
pop_gset3:
02F7 E0E4 LDI R30,4
02F8 940C0309 JMP pop
pop_gset4:
02FA E0E8 LDI R30,0x8
02FB 940C0309 JMP pop
push_gset5:
02FD 92FA ST R15,-Y
02FE 92EA ST R14,-Y
push_gset4:
02FF 92DA ST R13,-Y
0300 92CA ST R12,-Y
push_gset3:
0301 92BA ST R11,-Y
0302 92AA ST R10,-Y
push_gset2:
0303 937A ST R23,-Y
0304 936A ST R22,-Y
push_gset1:
0305 935A ST R21,-Y
0306 934A ST R20,-Y
0307 9508 RET
pop_gset1:
0308 E0E1 LDI R30,1
pop:
0309 9149 LD R20,Y+
030A 9159 LD R21,Y+
030B FDE0 SBRC R30,0
030C 9508 RET
030D 9169 LD R22,Y+
030E 9179 LD R23,Y+
030F FDE1 SBRC R30,1
0310 9508 RET
0311 90A9 LD R10,Y+
0312 90B9 LD R11,Y+
0313 FDE2 SBRC R30,2
0314 9508 RET
0315 90C9 LD R12,Y+
0316 90D9 LD R13,Y+
0317 FDE3 SBRC R30,3
0318 9508 RET
0319 90E9 LD R14,Y+
031A 90F9 LD R15,Y+
031B 9508 RET
lsr8:
031C 2311 TST R17
031D F019 BEQ 0x0321
031E 9506 LSR R16
031F 951A DEC R17
0320 CFFB RJMP lsr8
0321 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -