📄 18b20_1602.lst
字号:
(0100) if(temp)
00E9 F011 BEQ 0x00EC
(0101) RLS_DS18B20; //释放总线
00EA 988D CBI 0x11,5
00EB C001 RJMP 0x00ED
(0102) else
(0103) CLR_DS18B20; //强制拉低
00EC 9895 CBI 0x12,5
(0104) delay_us(16); //14.92us
00ED E100 LDI R16,0x10
00EE E010 LDI R17,0
00EF 940E004B CALL _delay_us
(0105) delay_us(35); //30.38us
00F1 E203 LDI R16,0x23
00F2 E010 LDI R17,0
00F3 940E004B CALL _delay_us
(0106) RLS_DS18B20; //释放总线
00F5 988D CBI 0x11,5
(0107) delay_us(2); //2.71us(大于1us就行了)
00F6 E002 LDI R16,2
00F7 E010 LDI R17,0
00F8 940E004B CALL _delay_us
00FA 9563 INC R22
00FB 3068 CPI R22,0x8
00FC F300 BCS 0x00DD
00FD 940E029E CALL pop_gset3
00FF 9508 RET
_read_Temp:
x --> R20
tempH --> R20
tempL --> R22
0100 940E02A7 CALL push_gset2
(0108) }
(0109) }
(0110)
(0111) /****************************************
(0112) * 函数名称: uint read_Temp(void) *
(0113) * 函数功能:读DS18B20温度 *
(0114) * 入 口:无 *
(0115) * 返 回:读出的数据字节 *
(0116) ****************************************/
(0117) uint read_Temp(void)
(0118) {
(0119) uchar tempL,tempH;
(0120) uint x;
(0121) rst_DS18B20();
0102 DF72 RCALL _rst_DS18B20
(0122) write_DS18B20(0xcc); //跳过ROM
0103 EC0C LDI R16,0xCC
0104 DFD2 RCALL _write_DS18B20
(0123) write_DS18B20(0x44); //启动温度转换
0105 E404 LDI R16,0x44
0106 DFD0 RCALL _write_DS18B20
(0124) delay_us(1);
0107 E001 LDI R16,1
0108 E010 LDI R17,0
0109 940E004B CALL _delay_us
(0125) rst_DS18B20();
010B DF69 RCALL _rst_DS18B20
(0126) write_DS18B20(0xcc); //跳过ROM
010C EC0C LDI R16,0xCC
010D DFC9 RCALL _write_DS18B20
(0127) write_DS18B20(0xbe); //读数据
010E EB0E LDI R16,0xBE
010F DFC7 RCALL _write_DS18B20
(0128) tempL=read_DS18B20();
0110 DF98 RCALL _read_DS18B20
0111 2F60 MOV R22,R16
(0129) tempH=read_DS18B20();
0112 DF96 RCALL _read_DS18B20
0113 2F40 MOV R20,R16
(0130) x=(tempH<<8)|tempL;
0114 2F54 MOV R21,R20
0115 2F46 MOV R20,R22
(0131) return(x);
0116 018A MOVW R16,R20
0117 940E029B CALL pop_gset2
0119 9508 RET
_lcd_da:
a --> R20
data --> R22
011A 940E02A7 CALL push_gset2
011C 2F60 MOV R22,R16
FILE: E:\DS18B20\lcd1602_4h.h
(0001) /*******************************************
(0002) * 机柜控制器22版LCD1602联接库函数 *
(0003) * LCD1602操作库函数,4位数据联接关系: *
(0004) * LCD1602:DB4-DB7 __ M16:PA4-PA7 *
(0005) * LCD1602:RS _______ M16:PA2 *
(0006) * LCD1602:E ________ M16:PA3 *
(0007) * LCD1602:R/W ______ GND *
(0008) * 时钟频率:外部7.3728M晶体 *
(0009) * 作 者:tonghe *
(0010) * 日 期:2007年3月31日 *
(0011) *******************************************/
(0012) #include <iom16v.h>
(0013) #include <macros.h>
(0014)
(0015) //LCD相关端口定义
(0016) #define RS1602 PA2 //RS接在PORTA.2上
(0017) #define E1602 PA3 //E接在PORTA.3上
(0018) #define LCD_CON PORTA //控制接在PA口
(0019) #define CLR_RS LCD_CON&=~(1<<RS1602)//RS清0
(0020) #define SET_RS LCD_CON|=1<<RS1602 //RS置1
(0021) #define CLR_E LCD_CON&=~(1<<E1602) //E清0
(0022) #define SET_E LCD_CON|=1<<E1602 //E置1
(0023) #define LCD_DATA PORTA //数据接在PA口
(0024) //简化宏定义
(0025) #define uchar unsigned char
(0026) #define uint unsigned int
(0027)
(0028) //延时函数1:入口i,需要定时的时长
(0029) /*void delay_ms(uint i) //在7.3728M时钟下为i ms
(0030) {
(0031) uint j;
(0032) for(;i;i--)
(0033) {
(0034) for(j=1220;j;j--)
(0035) {;}
(0036) }
(0037) }
(0038)
(0039) //延时函数2:入口i,需要定时的时长
(0040) void delay_us(uint i) //在7.3728M时钟下为i us
(0041) {
(0042) uint j=i*4;
(0043) for(;j;j--)
(0044) {
(0045) ;
(0046) }
(0047) }
(0048) */
(0049) /*************************************
(0050) * LCD1602操作函数组 *
(0051) *************************************/
(0052) //写数据到LCD的函数:入口data,需写入的显示数据
(0053) void lcd_da(uchar data)
(0054) {
(0055) uchar a;
(0056) SET_RS; //RS置高,写数据
011D 9ADA SBI 0x1B,2
(0057) delay_ms(1);
011E E001 LDI R16,1
011F E010 LDI R17,0
0120 940E0053 CALL _delay_ms
(0058) SET_E;
0122 9ADB SBI 0x1B,3
(0059) a=data|0x0F; //将低四位置1,保留高4位
0123 2F46 MOV R20,R22
0124 604F ORI R20,0xF
(0060) LCD_DATA=((LCD_DATA|0xF0)&a); //数据高4位送端口
0125 B38B IN R24,0x1B
0126 6F80 ORI R24,0xF0
0127 2384 AND R24,R20
0128 BB8B OUT 0x1B,R24
(0061) delay_us(50);
0129 E302 LDI R16,0x32
012A E010 LDI R17,0
012B 940E004B CALL _delay_us
(0062) CLR_E; //E下降沿写入数据
012D 98DB CBI 0x1B,3
(0063) delay_us(50); //延时50uS
012E E302 LDI R16,0x32
012F E010 LDI R17,0
0130 940E004B CALL _delay_us
(0064)
(0065) SET_E;
0132 9ADB SBI 0x1B,3
(0066) a=((data<<4)|0x0F); //将低四位移到高四位并保留
0133 2F46 MOV R20,R22
0134 704F ANDI R20,0xF
0135 9542 SWAP R20
0136 604F ORI R20,0xF
(0067) LCD_DATA=((LCD_DATA|0xF0)&a); //数据低4位送端口
0137 B38B IN R24,0x1B
0138 6F80 ORI R24,0xF0
0139 2384 AND R24,R20
013A BB8B OUT 0x1B,R24
(0068) delay_us(50);
013B E302 LDI R16,0x32
013C E010 LDI R17,0
013D 940E004B CALL _delay_us
(0069) CLR_E; //E下降沿写入数据
013F 98DB CBI 0x1B,3
(0070) delay_us(50); //延时50uS
0140 E302 LDI R16,0x32
0141 E010 LDI R17,0
0142 940E004B CALL _delay_us
0144 940E029B CALL pop_gset2
0146 9508 RET
_lcd_comm:
a --> R20
data --> R22
0147 940E02A7 CALL push_gset2
0149 2F60 MOV R22,R16
(0071) }
(0072)
(0073) //写指令到LCD的函数:入口data,需写入的控制指令
(0074) void lcd_comm(uchar data)
(0075) {
(0076) uchar a;
(0077) CLR_RS; //RS清0,写指令
014A 98DA CBI 0x1B,2
(0078) delay_us(50); //延时50uS
014B E302 LDI R16,0x32
014C E010 LDI R17,0
014D 940E004B CALL _delay_us
(0079) SET_E;
014F 9ADB SBI 0x1B,3
(0080) a=data|0x0F; //将低四位置1,保留高4位
0150 2F46 MOV R20,R22
0151 604F ORI R20,0xF
(0081) LCD_DATA=((LCD_DATA|0xF0)&a); //指令高4位送端口
0152 B38B IN R24,0x1B
0153 6F80 ORI R24,0xF0
0154 2384 AND R24,R20
0155 BB8B OUT 0x1B,R24
(0082) delay_us(50);
0156 E302 LDI R16,0x32
0157 E010 LDI R17,0
0158 940E004B CALL _delay_us
(0083) CLR_E; //E下降沿写入指令
015A 98DB CBI 0x1B,3
(0084) delay_us(50); //延时50uS
015B E302 LDI R16,0x32
015C E010 LDI R17,0
015D 940E004B CALL _delay_us
(0085)
(0086) SET_E;
015F 9ADB SBI 0x1B,3
(0087) a=((data<<4)|0x0F); //将低四位移到高四位并保留
0160 2F46 MOV R20,R22
0161 704F ANDI R20,0xF
0162 9542 SWAP R20
0163 604F ORI R20,0xF
(0088) LCD_DATA=((LCD_DATA|0xF0)&a); //指令低4位送端口
0164 B38B IN R24,0x1B
0165 6F80 ORI R24,0xF0
0166 2384 AND R24,R20
0167 BB8B OUT 0x1B,R24
(0089) delay_us(50);
0168 E302 LDI R16,0x32
0169 E010 LDI R17,0
016A 940E004B CALL _delay_us
(0090) CLR_E; //E下降沿写入指令
016C 98DB CBI 0x1B,3
(0091) delay_us(50); //延时50uS
016D E302 LDI R16,0x32
016E E010 LDI R17,0
016F 940E004B CALL _delay_us
0171 940E029B CALL pop_gset2
0173 9508 RET
(0092) }
(0093) //数据在LCD上显示
(0094) void xs_lcd(void)
(0095) {
(0096) lcd_comm(0x80); //写指令:第1行地址
_xs_lcd:
0174 E800 LDI R16,0x80
0175 DFD1 RCALL _lcd_comm
(0097) lcd_da(0x32); //留3个空格,使显示数据居中
0176 E302 LDI R16,0x32
0177 DFA2 RCALL _lcd_da
(0098) lcd_da(0x33);
0178 E303 LDI R16,0x33
0179 DFA0 RCALL _lcd_da
(0099) lcd_da(0x31);
017A E301 LDI R16,0x31
017B DF9E RCALL _lcd_da
(0100) lcd_da(0x32); //显示世纪位:2
017C E302 LDI R16,0x32
017D DF9C RCALL _lcd_da
(0101) lcd_da(0x38); //0
017E E308 LDI R16,0x38
017F DF9A RCALL _lcd_da
(0102)
(0103) lcd_comm(0xC0); //写指令:第2行地址
0180 EC00 LDI R16,0xC0
0181 DFC5 RCALL _lcd_comm
(0104) lcd_da(39); //留1个空格
0182 E207 LDI R16,0x27
0183 DF96 RCALL _lcd_da
(0105)
(0106) lcd_da(20); //时间与星期间留1空格
0184 E104 LDI R16,0x14
0185 DF94 RCALL _lcd_da
(0107) lcd_da('W'); //星期的前导字
0186 E507 LDI R16,0x57
0187 DF92 RCALL _lcd_da
(0108) lcd_da('e');
0188 E605 LDI R16,0x65
0189 DF90 RCALL _lcd_da
(0109) lcd_da('e');
018A E605 LDI R16,0x65
018B DF8E RCALL _lcd_da
(0110) lcd_da('k');
018C E60B LDI R16,0x6B
018D DF8C RCALL _lcd_da
018E 9508 RET
(0111) }
(0112)
(0113) //LCD1602初始化函数
(0114) void lcd_init(void)
(0115) {
(0116) lcd_comm(0x20); //写指令:4位数据
_lcd_init:
018F E200 LDI R16,0x20
0190 DFB6 RCALL _lcd_comm
(0117) // delay_us(80);
(0118) lcd_comm(0x28); //写指令:4位数据、2行显示、5*8点阵
0191 E208 LDI R16,0x28
0192 DFB4 RCALL _lcd_comm
(0119) delay_us(80);
0193 E500 LDI R16,0x50
0194 E010 LDI R17,0
0195 940E004B CALL _delay_us
(0120) lcd_comm(0x0C); //写指令:显示开
0197 E00C LDI R16,0xC
0198 DFAE RCALL _lcd_comm
(0121) delay_us(80);
0199 E500 LDI R16,0x50
019A E010 LDI R17,0
019B 940E004B CALL _delay_us
(0122) lcd_comm(0x06); //写指令:自左向右显示
019D E006 LDI R16,6
019E DFA8 RCALL _lcd_comm
(0123) delay_us(80);
019F E500 LDI R16,0x50
01A0 E010 LDI R17,0
01A1 940E004B CALL _delay_us
(0124) // lcd_comm(0x14); //写指令:移动
(0125) delay_us(80);
01A3 E500 LDI R16,0x50
01A4 E010 LDI R17,0
01A5 940E004B CALL _delay_us
(0126) // delay_ms(10);
(0127) // lcd_comm(0x80); //写指令:第1行地址
(0128) // delay_ms(5);
(0129) lcd_comm(0x01); //写指令:CLS
01A7 E001 LDI R16,1
01A8 DF9E RCALL _lcd_comm
(0130) delay_ms(5);
01A9 E005 LDI R16,5
01AA E010 LDI R17,0
01AB 940E0053 CALL _delay_ms
01AD 9508 RET
(0131) }
(0132)
(0133) //清屏指令函数
(0134) void cls(void)
(0135) {
(0136) lcd_comm(0x01);
_cls:
01AE E001 LDI R16,1
01AF DF97 RCALL _lcd_comm
(0137) delay_ms(5);
01B0 E005 LDI R16,5
01B1 E010 LDI R17,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -