📄 main.ls
字号:
3533 011c 88 push a
3534 011d 88 push a
3535 00000001 OFST: set 1
3538 ; 145 PG_DDR=0x02;
3540 011e 35025020 mov _PG_DDR,#2
3541 ; 146 PG_CR1=0x02; //设置IO口为推挽输出
3543 0122 35025021 mov _PG_CR1,#2
3544 ; 147 PG_CR2=0x00;
3546 0126 725f5022 clr _PG_CR2
3547 ; 149 delay_1ms(2);
3549 012a ae0002 ldw x,#2
3550 012d ada2 call _delay_1ms
3552 ; 150 for(i=0;i<8;i++) //请参考18B20时序图
3554 012f 0f01 clr (OFST+0,sp)
3555 0131 L1322:
3556 ; 152 DQ=0;
3558 0131 7213501e bres _DQ
3559 ; 153 delay(1);
3561 0135 a601 ld a,#1
3562 0137 ad8e call _delay
3564 ; 154 DQ=date&0x01;
3566 0139 7b02 ld a,(OFST+1,sp)
3567 013b a501 bcp a,#1
3568 013d 2602 jrne L43
3569 013f 2006 jp L03
3570 0141 L43:
3571 0141 7212501e bset _DQ
3572 0145 2004 jra L23
3573 0147 L03:
3574 0147 7213501e bres _DQ
3575 014b L23:
3576 ; 155 delay(10);
3578 014b a60a ld a,#10
3579 014d cd00c7 call _delay
3581 ; 156 DQ=1;
3583 0150 7212501e bset _DQ
3584 ; 157 date>>=1;
3586 0154 0402 srl (OFST+1,sp)
3587 ; 150 for(i=0;i<8;i++) //请参考18B20时序图
3589 0156 0c01 inc (OFST+0,sp)
3592 0158 7b01 ld a,(OFST+0,sp)
3593 015a a108 cp a,#8
3594 015c 25d3 jrult L1322
3595 ; 159 delay(4);
3597 015e a604 ld a,#4
3598 0160 cd00c7 call _delay
3600 ; 160 }
3603 0163 85 popw x
3604 0164 81 ret
3654 ; 162 uchar read_byte(void)
3654 ; 163 {
3655 switch .text
3656 0165 _read_byte:
3658 0165 89 pushw x
3659 00000002 OFST: set 2
3662 ; 165 delay_1ms(2);
3664 0166 ae0002 ldw x,#2
3665 0169 cd00d1 call _delay_1ms
3667 ; 166 for(i=0;i<8;i++)
3669 016c 0f01 clr (OFST-1,sp)
3670 016e L1622:
3671 ; 168 PG_DDR=0x02;
3673 016e 35025020 mov _PG_DDR,#2
3674 ; 169 PG_CR1=0x02; //设置IO口为推挽输出
3676 0172 35025021 mov _PG_CR1,#2
3677 ; 170 PG_CR2=0x00;
3679 0176 725f5022 clr _PG_CR2
3680 ; 172 DQ=0;
3682 017a 7213501e bres _DQ
3683 ; 173 value>>=1; //先读地位,因此没读一次数向左移动 一位
3685 017e 0402 srl (OFST+0,sp)
3686 ; 174 DQ=1;
3688 0180 7212501e bset _DQ
3689 ; 176 PG_DDR=0x00;
3691 0184 725f5020 clr _PG_DDR
3692 ; 177 PG_CR1=0x02; //读数据时设置IO口为上拉输入
3694 0188 35025021 mov _PG_CR1,#2
3695 ; 178 PG_CR2=0x00;
3697 018c 725f5022 clr _PG_CR2
3698 ; 180 if((PG_IDR&0x02)==0x02) //如果IO口电压为高,则value中对应的位为1,否则为0
3700 0190 c6501f ld a,_PG_IDR
3701 0193 a402 and a,#2
3702 0195 a102 cp a,#2
3703 0197 2606 jrne L7622
3704 ; 181 value|=0x80;
3706 0199 7b02 ld a,(OFST+0,sp)
3707 019b aa80 or a,#128
3708 019d 6b02 ld (OFST+0,sp),a
3709 019f L7622:
3710 ; 182 delay(4);
3712 019f a604 ld a,#4
3713 01a1 cd00c7 call _delay
3715 ; 166 for(i=0;i<8;i++)
3717 01a4 0c01 inc (OFST-1,sp)
3720 01a6 7b01 ld a,(OFST-1,sp)
3721 01a8 a108 cp a,#8
3722 01aa 25c2 jrult L1622
3723 ; 184 return value; //将读的数返回
3725 01ac 7b02 ld a,(OFST+0,sp)
3728 01ae 85 popw x
3729 01af 81 ret
3788 ; 187 void readtemperature(void)
3788 ; 188 {
3789 switch .text
3790 01b0 _readtemperature:
3792 01b0 5204 subw sp,#4
3793 00000004 OFST: set 4
3796 ; 190 init_Ds18B20(); //初始化18B20
3798 01b2 cd00f1 call _init_Ds18B20
3800 ; 191 write_byte(0xcc); //逃过ROM,一个IO口有多个 18B20时需 要读ROM
3802 01b5 a6cc ld a,#204
3803 01b7 cd011c call _write_byte
3805 ; 192 write_byte(0x44); //启动温度检测
3807 01ba a644 ld a,#68
3808 01bc cd011c call _write_byte
3810 ; 193 DQ=1;
3812 01bf 7212501e bset _DQ
3813 ; 194 delay(200); //延时,等待温度检测完成
3815 01c3 a6c8 ld a,#200
3816 01c5 cd00c7 call _delay
3818 ; 195 init_Ds18B20(); //每次操作前要初始化18B20
3820 01c8 cd00f1 call _init_Ds18B20
3822 ; 196 write_byte(0xcc); //跳过ROM
3824 01cb a6cc ld a,#204
3825 01cd cd011c call _write_byte
3827 ; 197 write_byte(0xbe); //从储存器读数据
3829 01d0 a6be ld a,#190
3830 01d2 cd011c call _write_byte
3832 ; 198 a=read_byte(); //读地位温度数据
3834 01d5 ad8e call _read_byte
3836 01d7 6b02 ld (OFST-2,sp),a
3837 ; 199 b=read_byte(); //读高位温度数据
3839 01d9 ad8a call _read_byte
3841 01db 6b04 ld (OFST+0,sp),a
3842 ; 200 if(b>0x07) //如果温度为负数,b会大于0x07,故当b大于0x07时,让1602在温度前面显示“-”
3844 01dd 7b04 ld a,(OFST+0,sp)
3845 01df a108 cp a,#8
3846 01e1 2504 jrult L7132
3847 ; 201 q=1;
3849 01e3 35010009 mov _q,#1
3850 01e7 L7132:
3851 ; 202 p=(a&0x0f)*625/100; //小数部分数据处理,由于小数部分有 四位,故分辨率为1/16,16×625刚好为10000,这里再除于100是精确到小数点后两位
3853 01e7 7b02 ld a,(OFST-2,sp)
3854 01e9 a40f and a,#15
3855 01eb 5f clrw x
3856 01ec 97 ld xl,a
3857 01ed 90ae0271 ldw y,#625
3858 01f1 cd0000 call c_imul
3860 01f4 a664 ld a,#100
3861 01f6 cd0000 call c_sdivx
3863 01f9 01 rrwa x,a
3864 01fa 6b03 ld (OFST-1,sp),a
3865 01fc 02 rlwa x,a
3866 ; 204 b=(b<<4)+(a>>4); //将低位温度数据的高四位和高位温度 数据的 低四位拼成温度数据的整数部分
3868 01fd 7b02 ld a,(OFST-2,sp)
3869 01ff 4e swap a
3870 0200 a40f and a,#15
3871 0202 6b01 ld (OFST-3,sp),a
3872 0204 7b04 ld a,(OFST+0,sp)
3873 0206 97 ld xl,a
3874 0207 a610 ld a,#16
3875 0209 42 mul x,a
3876 020a 9f ld a,xl
3877 020b 1b01 add a,(OFST-3,sp)
3878 020d 6b04 ld (OFST+0,sp),a
3879 ; 206 table2[7]=0x43; //摄氏度中“C” 的代码
3881 020f 35430008 mov _table2+7,#67
3882 ; 207 table2[6]=0xdf; //摄氏度中“。“ 的代码
3884 0213 35df0007 mov _table2+6,#223
3885 ; 208 table2[5]=p%10+0x30; //小数点后第二位数据,加上30是为了和1602中字符代码一致
3887 0217 7b03 ld a,(OFST-1,sp)
3888 0219 5f clrw x
3889 021a 97 ld xl,a
3890 021b a60a ld a,#10
3891 021d cd0000 call c_smodx
3893 0220 1c0030 addw x,#48
3894 0223 01 rrwa x,a
3895 0224 b706 ld _table2+5,a
3896 0226 02 rlwa x,a
3897 ; 209 table2[4]=p/10+0x30;
3899 0227 7b03 ld a,(OFST-1,sp)
3900 0229 5f clrw x
3901 022a 97 ld xl,a
3902 022b a60a ld a,#10
3903 022d cd0000 call c_sdivx
3905 0230 1c0030 addw x,#48
3906 0233 01 rrwa x,a
3907 0234 b705 ld _table2+4,a
3908 0236 02 rlwa x,a
3909 ; 210 table2[3]=0x2e; //小数点代码
3911 0237 352e0004 mov _table2+3,#46
3912 ; 211 table2[2]=b%10+0x30;
3914 023b 7b04 ld a,(OFST+0,sp)
3915 023d 5f clrw x
3916 023e 97 ld xl,a
3917 023f a60a ld a,#10
3918 0241 cd0000 call c_smodx
3920 0244 1c0030 addw x,#48
3921 0247 01 rrwa x,a
3922 0248 b703 ld _table2+2,a
3923 024a 02 rlwa x,a
3924 ; 212 table2[1]=b/10+0x30; //整数部分
3926 024b 7b04 ld a,(OFST+0,sp)
3927 024d 5f clrw x
3928 024e 97 ld xl,a
3929 024f a60a ld a,#10
3930 0251 cd0000 call c_sdivx
3932 0254 1c0030 addw x,#48
3933 0257 01 rrwa x,a
3934 0258 b702 ld _table2+1,a
3935 025a 02 rlwa x,a
3936 ; 213 table2[0]=0x80; //空字符代码,就是不显示任何字符
3938 025b 35800001 mov _table2,#128
3939 ; 214 if(q==1)
3941 025f b609 ld a,_q
3942 0261 a101 cp a,#1
3943 0263 2604 jrne L1232
3944 ; 215 table2[0]=0x2d; //”-“代码,若温度为-,则显示
3946 0265 352d0001 mov _table2,#45
3947 0269 L1232:
3948 ; 216 }
3951 0269 5b04 addw sp,#4
3952 026b 81 ret
4074 xdef _main
4075 xdef _display
4076 xdef _init
4077 xdef _write_data
4078 xdef _write_com
4079 xdef _init_stm8
4080 switch .ubsct
4081 0000 _i:
4082 0000 00 ds.b 1
4083 xdef _i
4084 0001 _table2:
4085 0001 000000000000 ds.b 8
4086 xdef _table2
4087 xdef _table1
4088 xdef _table0
4089 xdef _readtemperature
4090 xdef _read_byte
4091 xdef _write_byte
4092 xdef _delay_1ms
4093 xdef _delay
4094 xdef _init_Ds18B20
4095 xdef _a
4096 0009 _q:
4097 0009 00 ds.b 1
4098 xdef _q
4099 000a _temp:
4100 000a 00 ds.b 1
4101 xdef _temp
4102 xref.b c_x
4122 xref c_smodx
4123 xref c_sdivx
4124 xref c_imul
4125 end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -