📄 ds1302_18b20_1602.lst
字号:
__text_start:
__start:
78 E5CF LDI R28,0x5F
79 E0D4 LDI R29,4
7A BFCD OUT 0x3D,R28
7B BFDE OUT 0x3E,R29
7C 51CE SUBI R28,0x1E
7D 40D0 SBCI R29,0
7E EA0A LDI R16,0xAA
7F 8308 STD Y+0,R16
80 2400 CLR R0
81 ECEA LDI R30,0xCA
82 E0F0 LDI R31,0
83 E010 LDI R17,0
84 3DE2 CPI R30,0xD2
85 07F1 CPC R31,R17
86 F011 BEQ 0x0089
87 9201 ST R0,Z+
88 CFFB RJMP 0x0084
89 8300 STD Z+0,R16
8A E8E5 LDI R30,0x85
8B E0F0 LDI R31,0
8C E6A0 LDI R26,0x60
8D E0B0 LDI R27,0
8E E010 LDI R17,0
8F E000 LDI R16,0
90 BF0B OUT 0x3B,R16
91 3EEF CPI R30,0xEF
92 07F1 CPC R31,R17
93 F021 BEQ 0x0098
94 95C8 LPM
95 9631 ADIW R30,1
96 920D ST R0,X+
97 CFF9 RJMP 0x0091
98 940E 02A0 CALL _main
_exit:
9A CFFF RJMP _exit
FILE: E:\MyDesign\ICCAVR\ATmega16_DEV\DS1302\LCD_1602_4wires.h
(0001) /*============================================================
(0002) 工程:字符型液晶通用六线驱动
(0003) 作者:朱海峰
(0004) 日期:2007.02.28
(0005) E_mail:ntzhf100@163.com
(0006) 液晶指令说明:
(0007) 0x08==============>关闭显示
(0008) 0x0c==============>开显示
(0009) 0x01==============>清除LCD的显示内容
(0010) 0x06==============>移动光标
(0011) 0x0c==============>显示开,光标关
(0012) 0x28==============>16*2显示,5*7点阵,4位数据
(0013) 0x1c==============>字符右移一格
(0014) 0x18==============>字符左移一格
(0015) 0x10==============>光标右移一格
(0016) 0x14==============>光标左移一格
(0017) 显示地址:
(0018) ===============================================================
(0019) =0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 ................ 0x27=
(0020) =0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 ................ 0x67=
(0021) ===============================================================
(0022) 每行可以显示40个字符,可以看到的只有16个字符,可以通过指令使字符
(0023) 整体移动来显示所有字符。
(0024) LCD_write_byte函数功能:当cmd=0时,向LCD写入数据,否则向LCD写
(0025) 入命令
(0026) 四线控制的方式:先送字节的高四位,在送低四位。
(0027) 值得注意的是当使用的I/O口为高四位时数据先给另一个变量,变量再将
(0028) 数据高四位送到I/O口,接着是将变量左移四位,再送到I/O口上去。
(0029) 当使用的I/O口为低四位时数据先给另一个变量,变量右移四位后送到I/O
(0030) 口上去,接着将数据给变量直接送入I/O口。
(0031) 使用时注意一下。
(0032) ============================================================*/
(0033) #include <iom16v.h>
(0034) #include <macros.h>
(0035) #include "def.h"
(0036) /*-----------------------------------------------------
(0037) Public function prototypes
(0038) -------------------------------------------------------*/
(0039) void LCD_init (void);
(0040) void LCD_write_byte (uint8_t cmd,uint8_t data);
(0041) void LCD_Write_half_byte (void);
(0042) void LCD_set_xy (uint8_t x, uint8_t y);
(0043) void LCD_write_string (uint8_t X,uint8_t Y,uint8_t *s);
(0044) void Move (uint8_t step,uint8_t dirction,uint16_t time);
(0045) void Flash_lcd (uint16_t delay_t,uint8_t times);
(0046) void Delay_nms (uint16_t ms);
(0047)
(0048) uint8_t data_temp;
(0049) //==================================================
(0050) void LCD_init(void)
(0051) {
(0052) Delay_nms(50);
_LCD_init:
9B E302 LDI R16,0x32
9C E010 LDI R17,0
9D D096 RCALL _Delay_nms
(0053) Delay_nms(1);
9E E001 LDI R16,1
9F E010 LDI R17,0
A0 D093 RCALL _Delay_nms
(0054) LCD_write_byte(1,0x28); //4bit test 显示模式设置(不检测忙信号)
A1 E228 LDI R18,0x28
A2 E001 LDI R16,1
A3 D01C RCALL _LCD_write_byte
(0055) Delay_nms(1);
A4 E001 LDI R16,1
A5 E010 LDI R17,0
A6 D08D RCALL _Delay_nms
(0056) LCD_write_byte(1,0x08); // 显示关闭
A7 E028 LDI R18,0x8
A8 E001 LDI R16,1
A9 D016 RCALL _LCD_write_byte
(0057) Delay_nms(1);
AA E001 LDI R16,1
AB E010 LDI R17,0
AC D087 RCALL _Delay_nms
(0058) LCD_write_byte(1,0x01); // 显示清屏
AD E021 LDI R18,1
AE E001 LDI R16,1
AF D010 RCALL _LCD_write_byte
(0059) Delay_nms(1);
B0 E001 LDI R16,1
B1 E010 LDI R17,0
B2 D081 RCALL _Delay_nms
(0060) LCD_write_byte(1,0x06); // 显示光标移动设置
B3 E026 LDI R18,6
B4 E001 LDI R16,1
B5 D00A RCALL _LCD_write_byte
(0061) Delay_nms(1);
B6 E001 LDI R16,1
B7 E010 LDI R17,0
B8 D07B RCALL _Delay_nms
(0062) LCD_write_byte(1,0x0C); // 显示开及光标设置
B9 E02C LDI R18,0xC
BA E001 LDI R16,1
BB D004 RCALL _LCD_write_byte
(0063) Delay_nms(10);
BC E00A LDI R16,0xA
BD E010 LDI R17,0
BE D075 RCALL _Delay_nms
BF 9508 RET
_LCD_write_byte:
data --> R10
cmd --> R20
C0 92AA ST R10,-Y
C1 934A ST R20,-Y
C2 2EA2 MOV R10,R18
C3 2F40 MOV R20,R16
(0064) }
(0065) /*--------------------------------------------------
(0066) LCD_write_byte : 英文字符显示函数
(0067) 输入参数:*s :英文字符串指针;
(0068) X、Y : 显示字符串的位置,X:1-16,Y:1-2
(0069) ---------------------------------------------------*/
(0070) void LCD_write_byte(uint8_t cmd,uint8_t data)
(0071) {
(0072) if (cmd==1)
C4 3041 CPI R20,1
C5 F409 BNE 0x00C7
(0073) {
(0074) CLR_RS();
C6 98DA CBI 0x1B,2
(0075) }
(0076) if (cmd==0)
C7 2344 TST R20
C8 F409 BNE 0x00CA
(0077) {
(0078) SET_RS();
C9 9ADA SBI 0x1B,2
(0079) }
(0080) data_temp=data;
CA 92A0 00D1 STS data_temp,R10
(0081) data_temp=data_temp>>4;
CC 2D8A MOV R24,R10
CD 9582 SWAP R24
CE 708F ANDI R24,0xF
CF 9380 00D1 STS data_temp,R24
(0082) LCD_Write_half_byte();
D1 D009 RCALL _LCD_Write_half_byte
(0083) data_temp=data;
D2 92A0 00D1 STS data_temp,R10
(0084) LCD_Write_half_byte();
D4 D006 RCALL _LCD_Write_half_byte
(0085) Delay_nms(1);
D5 E001 LDI R16,1
D6 E010 LDI R17,0
D7 D05C RCALL _Delay_nms
D8 9149 LD R20,Y+
D9 90A9 LD R10,Y+
DA 9508 RET
(0086) }
(0087) /*----------------写高4bit到LCD------------------------*/
(0088) void LCD_Write_half_byte(void)
(0089) {
(0090) LCD_DATA_PORT&=0xf0; //pc0~pc3=0
_LCD_Write_half_byte:
DB B388 IN R24,0x18
DC 7F80 ANDI R24,0xF0
DD BB88 OUT 0x18,R24
(0091) LCD_DATA_PORT=data_temp;//send high 4bit
DE 9020 00D1 LDS R2,data_temp
E0 BA28 OUT 0x18,R2
(0092) SET_EN();
E1 9ADB SBI 0x1B,3
(0093) NOP();
E2 0000 NOP
(0094) CLR_EN();
E3 98DB CBI 0x1B,3
(0095) NOP();
E4 0000 NOP
E5 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
E6 940E 045B CALL push_xgsetF000
E8 2F42 MOV R20,R18
E9 2F60 MOV R22,R16
(0096) }
(0097)
(0098) /*----------------------------------------------------
(0099) LCD_set_xy : 设置LCD显示的起始位置
(0100) 输入参数:x、y : 显示字符串的位置,X:1-16,Y:1-2
(0101) -----------------------------------------------------*/
(0102) void LCD_set_xy( uint8_t x, uint8_t y )
(0103) {
(0104) unsigned char address;
(0105) if (y==1)
EA 3041 CPI R20,1
EB F419 BNE 0x00EF
(0106) {
(0107) address=0x80-1+x;
EC 2F46 MOV R20,R22
ED 5841 SUBI R20,0x81
(0108) }
EE C002 RJMP 0x00F1
(0109) else
(0110) {
(0111) address=0xc0-1+x;
EF 2F46 MOV R20,R22
F0 5441 SUBI R20,0x41
(0112) }
(0113) LCD_write_byte(1,address);
F1 2F24 MOV R18,R20
F2 E001 LDI R16,1
F3 DFCC RCALL _LCD_write_byte
F4 940C 0460 JMP pop_xgsetF000
_LCD_write_string:
s --> R20
Y --> R12
X --> R10
F6 940E 0473 CALL push_xgset303C
F8 2EC2 MOV R12,R18
F9 2EA0 MOV R10,R16
FA 814E LDD R20,Y+6
FB 815F LDD R21,Y+7
(0114) }
(0115) /*---------------------------------------------------
(0116) LCD_write_string : 英文字符串显示函数
(0117) 输入参数:*s :英文字符串指针;
(0118) X、Y : 显示字符串的位置
(0119) ---------------------------------------------------*/
(0120) void LCD_write_string(uint8_t X,uint8_t Y,uint8_t *s)
(0121) {
(0122) LCD_set_xy( X, Y );
FC 2D2C MOV R18,R12
FD 2D0A MOV R16,R10
FE DFE7 RCALL _LCD_set_xy
FF C006 RJMP 0x0106
(0123) while (*s)
(0124) {
(0125) LCD_write_byte(0,*s);
100 01FA MOVW R30,R20
101 8120 LDD R18,Z+0
102 2700 CLR R16
103 DFBC RCALL _LCD_write_byte
(0126) s++;
104 5F4F SUBI R20,0xFF
105 4F5F SBCI R21,0xFF
106 01FA MOVW R30,R20
107 8020 LDD R2,Z+0
108 2022 TST R2
109 F7B1 BNE 0x0100
10A 940C 047A JMP pop_xgset303C
_Move:
i --> R10
time --> Y,+6
dirction --> R12
step --> R20
10C 940E 0473 CALL push_xgset303C
10E 2EC2 MOV R12,R18
10F 2F40 MOV R20,R16
(0127) }
(0128) }
(0129) //=======================================================
(0130) void Move(uint8_t step,uint8_t dirction,uint16_t time)
(0131) {
(0132) uint8_t i;
(0133) for(i=0;i<step-1;i++)
110 24AA CLR R10
111 C007 RJMP 0x0119
(0134) {
(0135) LCD_write_byte(1,dirction); //字符移动方向
112 2D2C MOV R18,R12
113 E001 LDI R16,1
114 DFAB RCALL _LCD_write_byte
(0136) Delay_nms(time); //控制移动时间
115 810E LDD R16,Y+6
116 811F LDD R17,Y+7
117 D01C RCALL _Delay_nms
118 94A3 INC R10
119 2F84 MOV R24,R20
11A 5081 SUBI R24,1
11B 16A8 CP R10,R24
11C F3A8 BCS 0x0112
11D 940C 047A JMP pop_xgset303C
_Flash_lcd:
j --> R10
times --> R14
delay_t --> R12
11F 940E 0454 CALL push_xgset00FC
121 2EE2 MOV R14,R18
122 0168 MOVW R12,R16
(0137) }
(0138) }
(0139) //=========================================================
(0140) void Flash_lcd(uint16_t delay_t,uint8_t times)
(0141) {
(0142) uint8_t j;
(0143) for(j=0;j<times;j++)
123 24AA CLR R10
124 C00B RJMP 0x0130
(0144) {
(0145) LCD_write_byte(1,0x08);
125 E028 LDI R18,0x8
126 E001 LDI R16,1
127 DF98 RCALL _LCD_write_byte
(0146) Delay_nms(delay_t);
128 0186 MOVW R16,R12
129 D00A RCALL _Delay_nms
(0147) LCD_write_byte(1,0x0c);
12A E02C LDI R18,0xC
12B E001 LDI R16,1
12C DF93 RCALL _LCD_write_byte
(0148) Delay_nms(delay_t);
12D 0186 MOVW R16,R12
12E D005 RCALL _Delay_nms
12F 94A3 INC R10
130 14AE CP R10,R14
131 F398 BCS 0x0125
132 940C 0435 JMP pop_xgset00FC
_Delay_nms:
i --> R20
ms --> R16
134 934A ST R20,-Y
135 935A ST R21,-Y
(0149) }
(0150) }
(0151) //========================================================
(0152) void Delay_nms(uint16_t ms)
(0153) {
136 C00A RJMP 0x0141
(0154) uint16_t i;
(0155) while(ms--)
(0156) {
(0157) for(i=1;i<(uint16_t)(xtal*143-2);i++)
137 E041 LDI R20,1
138 E050 LDI R21,0
139 C002 RJMP 0x013C
13A 5F4F SUBI R20,0xFF
13B 4F5F SBCI R21,0xFF
13C E786 LDI R24,0x76
13D E094 LDI R25,4
13E 1748 CP R20,R24
13F 0759 CPC R21,R25
140 F3C8 BCS 0x013A
141 0118 MOVW R2,R16
142 5001 SUBI R16,1
143 4010 SBCI R17,0
144 2022 TST R2
145 F789 BNE 0x0137
146 2033 TST R3
147 F779 BNE 0x0137
148 9159 LD R21,Y+
149 9149 LD R20,Y+
14A 9508 RET
_Temp_display:
temp_decimal --> R20
temp_num --> R12
temp_l --> R22
temp_h --> R10
Th --> R22
Tl --> R12
14B 940E 0481 CALL push_xgsetF03C
14D 2F62 MOV R22,R18
14E 2EC0 MOV R12,R16
14F 9722 SBIW R28,2
FILE: E:\MyDesign\ICCAVR\ATmega16_DEV\DS1302\DS18B20.h
(0001) /**************************************************
(0002) *Progect: Temperature measure with DS18B20
(0003) */
(0004) #include <iom16v.h>
(0005) #include <macros.h>
(0006) #include "def.h"
(0007)
(0008) void Delay_us(uint16_t us);
(0009) uint8_t Init_18b20(void);
(0010) uint8_t Read_1_byte(void);
(0011) void Write_1_byte(uint8_t cmd);
(0012) void Write_1(void);
(0013) void Write_0(void);
(0014) void Temperature(uint8_t Th,uint8_t Tl);
(0015) void Temp_display(uint8_t Tl,uint8_t Th);
(0016) /*************************************************/
(0017) void Temp_display(uint8_t Tl,uint8_t Th)
(0018) {
(0019) uint8_t temp_h,temp_l,temp_num,temp_decimal;
(0020) temp_decimal=Tl;
150 2D4C MOV R20,R12
(0021) temp_h=Th<<4;
151 2F86 MOV R24,R22
152 708F ANDI R24,0xF
153 9582 SWAP R24
(0022) temp_l=Tl>>4;
154 2D6C MOV R22,R12
155 9562 SWAP R22
156 706F ANDI R22,0xF
(0023) temp_num=(temp_h|temp_l);
157 2EC8 MOV R12,R24
158 2AC6 OR R12,R22
(0024) temp_decimal&=0x0f;
159 704F ANDI R20,0xF
(0025) temp_h=(temp_num/10);
15A E01A LDI R17,0xA
15B 2D0C MOV R16,R12
15C 940E 041F CALL div8u
15E 2EA0 MOV R10,R16
(0026) temp_l=(temp_num%10);
15F E01A LDI R17,0xA
160 2D0C MOV R16,R12
161 940E 041D CALL mod8u
163 2F60 MOV R22,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -