?? lcm1602.lst
字號:
1 .file "lcm1602.c"
2 .arch atmega16
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
74 .global LCM1602Init
76 LCM1602Init:
1:lcm1602.c **** #include <avr/io.h>
2:lcm1602.c **** #include <util/delay.h>
3:lcm1602.c **** #include "lcm1602.h"
4:lcm1602.c **** #include "type.h"
5:lcm1602.c ****
6:lcm1602.c **** //1602液晶端口宏定義
7:lcm1602.c **** #define RS_PIN PD4 //數據/命令選擇端,低時是命令,高時是數據
8:lcm1602.c **** #define RS_DDR DDRD
9:lcm1602.c **** #define RS_PORT PORTD
10:lcm1602.c ****
11:lcm1602.c **** #define RW_PIN PD5 //讀/寫選擇端,低時是寫,高時是讀
12:lcm1602.c **** #define RW_DDR DDRD
13:lcm1602.c **** #define RW_PORT PORTD
14:lcm1602.c ****
15:lcm1602.c **** #define E_PIN PD7 //使能信號(高脈沖使能)
16:lcm1602.c **** #define E_DDR DDRD
17:lcm1602.c **** #define E_PORT PORTD
18:lcm1602.c **** //數據端口宏定義
19:lcm1602.c **** #define DB_PORT PORTB
20:lcm1602.c **** #define DB_DDR DDRB
21:lcm1602.c **** #define DB_PIN PINB
22:lcm1602.c ****
23:lcm1602.c **** //no need to be modify
24:lcm1602.c **** #define RS_CLR (RS_PORT&=~(1<<RS_PIN))
25:lcm1602.c **** #define RS_SET (RS_PORT|=(1<<RS_PIN))
26:lcm1602.c ****
27:lcm1602.c **** #define RW_CLR (RW_PORT&=~(1<<RW_PIN))
28:lcm1602.c **** #define RW_SET (RW_PORT|=(1<<RW_PIN))
29:lcm1602.c ****
30:lcm1602.c **** #define E_CLR (E_PORT&=~(1<<E_PIN))
31:lcm1602.c **** #define E_SET (E_PORT|=(1<<E_PIN))
32:lcm1602.c ****
33:lcm1602.c **** #define DB_IN (DB_DDR=0)
34:lcm1602.c **** #define DB_OUT (DB_DDR=0xff)
35:lcm1602.c **** #define DB_READ (DB_PIN)
36:lcm1602.c ****
37:lcm1602.c **** //1602液晶的坐標
38:lcm1602.c **** #define XSIZE 16
39:lcm1602.c **** #define YSIZE 2
40:lcm1602.c ****
41:lcm1602.c **** #ifndef NULL
42:lcm1602.c **** #define NULL 0
43:lcm1602.c **** #endif
44:lcm1602.c ****
45:lcm1602.c ****
46:lcm1602.c **** /*----------------------------------------------------------------------------------------------
47:lcm1602.c **** ------------------------------------------------------------------------------------------------
48:lcm1602.c **** 帶背光的液晶模塊TC1602A采用標準的16腳接口,其引腳功能如下:
49:lcm1602.c **** 第1腳:VSS為電源地,接GND。
50:lcm1602.c **** 第2腳:VDD接5V正電源。
51:lcm1602.c **** 第3腳:VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產
52:lcm1602.c **** 使用時可以通過一個10K的電位器調整對比度。
53:lcm1602.c **** 第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。
54:lcm1602.c **** 第5腳:RW為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。
55:lcm1602.c **** 當RS和RW共同為低電平時可以寫入指令或者顯示地址,當RS為低電平RW為高電平時可以讀忙信號,當
56:lcm1602.c **** 第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。
57:lcm1602.c **** 第7~14腳:D0~D7為8位雙向數據線。
58:lcm1602.c **** 第15腳:BLA背光電源正極(+5V)輸入引腳。
59:lcm1602.c **** 第16腳:BLK背光電源負極,接GND。
60:lcm1602.c **** ----------------------------------------------------------------------------------------------
61:lcm1602.c **** ------------------------------------------------------------------------------------------ */
62:lcm1602.c ****
63:lcm1602.c **** //1602液晶初始化
64:lcm1602.c **** void LCM1602Init(void )
65:lcm1602.c **** {
78 .LM1:
79 /* prologue: frame size=12 */
80 0000 CF93 push r28
81 0002 DF93 push r29
82 0004 CDB7 in r28,__SP_L__
83 0006 DEB7 in r29,__SP_H__
84 0008 2C97 sbiw r28,12
85 000a 0FB6 in __tmp_reg__,__SREG__
86 000c F894 cli
87 000e DEBF out __SP_H__,r29
88 0010 0FBE out __SREG__,__tmp_reg__
89 0012 CDBF out __SP_L__,r28
90 /* prologue end (size=10) */
66:lcm1602.c **** RS_DDR|=(1<<RS_PIN);
92 .LM2:
93 0014 8091 3100 lds r24,49
94 0018 8061 ori r24,lo8(16)
95 001a 8093 3100 sts 49,r24
67:lcm1602.c **** RW_DDR|=(1<<RW_PIN);
97 .LM3:
98 001e 8091 3100 lds r24,49
99 0022 8062 ori r24,lo8(32)
100 0024 8093 3100 sts 49,r24
68:lcm1602.c **** E_DDR|=(1<<E_PIN);
102 .LM4:
103 0028 8091 3100 lds r24,49
104 002c 8068 ori r24,lo8(-128)
105 002e 8093 3100 sts 49,r24
69:lcm1602.c **** DB_OUT; //PB設為輸出
107 .LM5:
108 0032 8FEF ldi r24,lo8(-1)
109 0034 8093 3700 sts 55,r24
70:lcm1602.c **** DB_PORT = 0x00;
111 .LM6:
112 0038 1092 3800 sts 56,__zero_reg__
113 .LBB2:
115 .Ltext1:
1:C:/WinAVR/avr/include/util/delay.h **** /* Copyright (c) 2002, Marek Michalkiewicz
2:C:/WinAVR/avr/include/util/delay.h **** Copyright (c) 2004,2005 Joerg Wunsch
3:C:/WinAVR/avr/include/util/delay.h **** All rights reserved.
4:C:/WinAVR/avr/include/util/delay.h ****
5:C:/WinAVR/avr/include/util/delay.h **** Redistribution and use in source and binary forms, with or without
6:C:/WinAVR/avr/include/util/delay.h **** modification, are permitted provided that the following conditions are met:
7:C:/WinAVR/avr/include/util/delay.h ****
8:C:/WinAVR/avr/include/util/delay.h **** * Redistributions of source code must retain the above copyright
9:C:/WinAVR/avr/include/util/delay.h **** notice, this list of conditions and the following disclaimer.
10:C:/WinAVR/avr/include/util/delay.h ****
11:C:/WinAVR/avr/include/util/delay.h **** * Redistributions in binary form must reproduce the above copyright
12:C:/WinAVR/avr/include/util/delay.h **** notice, this list of conditions and the following disclaimer in
13:C:/WinAVR/avr/include/util/delay.h **** the documentation and/or other materials provided with the
14:C:/WinAVR/avr/include/util/delay.h **** distribution.
15:C:/WinAVR/avr/include/util/delay.h ****
16:C:/WinAVR/avr/include/util/delay.h **** * Neither the name of the copyright holders nor the names of
17:C:/WinAVR/avr/include/util/delay.h **** contributors may be used to endorse or promote products derived
18:C:/WinAVR/avr/include/util/delay.h **** from this software without specific prior written permission.
19:C:/WinAVR/avr/include/util/delay.h ****
20:C:/WinAVR/avr/include/util/delay.h **** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21:C:/WinAVR/avr/include/util/delay.h **** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22:C:/WinAVR/avr/include/util/delay.h **** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23:C:/WinAVR/avr/include/util/delay.h **** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24:C:/WinAVR/avr/include/util/delay.h **** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25:C:/WinAVR/avr/include/util/delay.h **** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26:C:/WinAVR/avr/include/util/delay.h **** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27:C:/WinAVR/avr/include/util/delay.h **** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28:C:/WinAVR/avr/include/util/delay.h **** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29:C:/WinAVR/avr/include/util/delay.h **** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30:C:/WinAVR/avr/include/util/delay.h **** POSSIBILITY OF SUCH DAMAGE. */
31:C:/WinAVR/avr/include/util/delay.h ****
32:C:/WinAVR/avr/include/util/delay.h **** /* $Id: delay.h,v 1.1.2.1 2005/12/12 23:19:49 joerg_wunsch Exp $ */
33:C:/WinAVR/avr/include/util/delay.h ****
34:C:/WinAVR/avr/include/util/delay.h **** #ifndef _UTIL_DELAY_H_
35:C:/WinAVR/avr/include/util/delay.h **** #define _UTIL_DELAY_H_ 1
36:C:/WinAVR/avr/include/util/delay.h ****
37:C:/WinAVR/avr/include/util/delay.h **** #include <inttypes.h>
38:C:/WinAVR/avr/include/util/delay.h ****
39:C:/WinAVR/avr/include/util/delay.h **** /** \defgroup util_delay <util/delay.h>: Busy-wait delay loops
40:C:/WinAVR/avr/include/util/delay.h **** \code
41:C:/WinAVR/avr/include/util/delay.h **** #define F_CPU 1000000UL // 1 MHz
42:C:/WinAVR/avr/include/util/delay.h **** //#define F_CPU 14.7456E6
43:C:/WinAVR/avr/include/util/delay.h **** #include <util/delay.h>
44:C:/WinAVR/avr/include/util/delay.h **** \endcode
45:C:/WinAVR/avr/include/util/delay.h ****
46:C:/WinAVR/avr/include/util/delay.h **** \note As an alternative method, it is possible to pass the
47:C:/WinAVR/avr/include/util/delay.h **** F_CPU macro down to the compiler from the Makefile.
48:C:/WinAVR/avr/include/util/delay.h **** Obviously, in that case, no \c \#define statement should be
49:C:/WinAVR/avr/include/util/delay.h **** used.
50:C:/WinAVR/avr/include/util/delay.h ****
51:C:/WinAVR/avr/include/util/delay.h **** The functions in this header file implement simple delay loops
52:C:/WinAVR/avr/include/util/delay.h **** that perform a busy-waiting. They are typically used to
53:C:/WinAVR/avr/include/util/delay.h **** facilitate short delays in the program execution. They are
54:C:/WinAVR/avr/include/util/delay.h **** implemented as count-down loops with a well-known CPU cycle
55:C:/WinAVR/avr/include/util/delay.h **** count per loop iteration. As such, no other processing can
56:C:/WinAVR/avr/include/util/delay.h **** occur simultaneously. It should be kept in mind that the
57:C:/WinAVR/avr/include/util/delay.h **** functions described here do not disable interrupts.
58:C:/WinAVR/avr/include/util/delay.h ****
59:C:/WinAVR/avr/include/util/delay.h **** In general, for long delays, the use of hardware timers is
60:C:/WinAVR/avr/include/util/delay.h **** much preferrable, as they free the CPU, and allow for
61:C:/WinAVR/avr/include/util/delay.h **** concurrent processing of other events while the timer is
62:C:/WinAVR/avr/include/util/delay.h **** running. However, in particular for very short delays, the
63:C:/WinAVR/avr/include/util/delay.h **** overhead of setting up a hardware timer is too much compared
64:C:/WinAVR/avr/include/util/delay.h **** to the overall delay time.
65:C:/WinAVR/avr/include/util/delay.h ****
66:C:/WinAVR/avr/include/util/delay.h **** Two inline functions are provided for the actual delay algorithms.
67:C:/WinAVR/avr/include/util/delay.h ****
68:C:/WinAVR/avr/include/util/delay.h **** Two wrapper functions allow the specification of microsecond, and
69:C:/WinAVR/avr/include/util/delay.h **** millisecond delays directly, using the application-supplied macro
70:C:/WinAVR/avr/include/util/delay.h **** F_CPU as the CPU clock frequency (in Hertz). These functions
71:C:/WinAVR/avr/include/util/delay.h **** operate on double typed arguments, however when optimization is
72:C:/WinAVR/avr/include/util/delay.h **** turned on, the entire floating-point calculation will be done at
73:C:/WinAVR/avr/include/util/delay.h **** compile-time.
74:C:/WinAVR/avr/include/util/delay.h ****
75:C:/WinAVR/avr/include/util/delay.h **** \note When using _delay_us() and _delay_ms(), the expressions
76:C:/WinAVR/avr/include/util/delay.h **** passed as arguments to these functions shall be compile-time
77:C:/WinAVR/avr/include/util/delay.h **** constants, otherwise the floating-point calculations to setup the
78:C:/WinAVR/avr/include/util/delay.h **** loops will be done at run-time, thereby drastically increasing
79:C:/WinAVR/avr/include/util/delay.h **** both the resulting code size, as well as the time required to
80:C:/WinAVR/avr/include/util/delay.h **** setup the loops.
81:C:/WinAVR/avr/include/util/delay.h **** */
82:C:/WinAVR/avr/include/util/delay.h ****
83:C:/WinAVR/avr/include/util/delay.h **** #if !defined(__DOXYGEN__)
84:C:/WinAVR/avr/include/util/delay.h **** static inline void _delay_loop_1(uint8_t __count) __attribute__((always_inline));
85:C:/WinAVR/avr/include/util/delay.h **** static inline void _delay_loop_2(uint16_t __count) __attribute__((always_inline));
86:C:/WinAVR/avr/include/util/delay.h **** static inline void _delay_us(double __us) __attribute__((always_inline));
87:C:/WinAVR/avr/include/util/delay.h **** static inline void _delay_ms(double __ms) __attribute__((always_inline));
88:C:/WinAVR/avr/include/util/delay.h **** #endif
89:C:/WinAVR/avr/include/util/delay.h ****
90:C:/WinAVR/avr/include/util/delay.h **** /** \ingroup util_delay
91:C:/WinAVR/avr/include/util/delay.h ****
92:C:/WinAVR/avr/include/util/delay.h **** Delay loop using an 8-bit counter \c __count, so up to 256
93:C:/WinAVR/avr/include/util/delay.h **** iterations are possible. (The value 256 would have to be passed
94:C:/WinAVR/avr/include/util/delay.h **** as 0.) The loop executes three CPU cycles per iteration, not
95:C:/WinAVR/avr/include/util/delay.h **** including the overhead the compiler needs to setup the counter
96:C:/WinAVR/avr/include/util/delay.h **** register.
97:C:/WinAVR/avr/include/util/delay.h ****
98:C:/WinAVR/avr/include/util/delay.h **** Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds
99:C:/WinAVR/avr/include/util/delay.h **** can be achieved.
100:C:/WinAVR/avr/include/util/delay.h **** */
101:C:/WinAVR/avr/include/util/delay.h **** void
102:C:/WinAVR/avr/include/util/delay.h **** _delay_loop_1(uint8_t __count)
103:C:/WinAVR/avr/include/util/delay.h **** {
104:C:/WinAVR/avr/include/util/delay.h **** __asm__ volatile (
105:C:/WinAVR/avr/include/util/delay.h **** "1: dec %0" "\n\t"
106:C:/WinAVR/avr/include/util/delay.h **** "brne 1b"
107:C:/WinAVR/avr/include/util/delay.h **** : "=r" (__count)
108:C:/WinAVR/avr/include/util/delay.h **** : "0" (__count)
109:C:/WinAVR/avr/include/util/delay.h **** );
110:C:/WinAVR/avr/include/util/delay.h **** }
111:C:/WinAVR/avr/include/util/delay.h ****
112:C:/WinAVR/avr/include/util/delay.h **** /** \ingroup util_delay
113:C:/WinAVR/avr/include/util/delay.h ****
114:C:/WinAVR/avr/include/util/delay.h **** Delay loop using a 16-bit counter \c __count, so up to 65536
115:C:/WinAVR/avr/include/util/delay.h **** iterations are possible. (The value 65536 would have to be
116:C:/WinAVR/avr/include/util/delay.h **** passed as 0.) The loop executes four CPU cycles per iteration,
117:C:/WinAVR/avr/include/util/delay.h **** not including the overhead the compiler requires to setup the
118:C:/WinAVR/avr/include/util/delay.h **** counter register pair.
119:C:/WinAVR/avr/include/util/delay.h ****
120:C:/WinAVR/avr/include/util/delay.h **** Thus, at a CPU speed of 1 MHz, delays of up to about 262.1
121:C:/WinAVR/avr/include/util/delay.h **** milliseconds can be achieved.
122:C:/WinAVR/avr/include/util/delay.h **** */
123:C:/WinAVR/avr/include/util/delay.h **** void
124:C:/WinAVR/avr/include/util/delay.h **** _delay_loop_2(uint16_t __count)
125:C:/WinAVR/avr/include/util/delay.h **** {
126:C:/WinAVR/avr/include/util/delay.h **** __asm__ volatile (
127:C:/WinAVR/avr/include/util/delay.h **** "1: sbiw %0,1" "\n\t"
128:C:/WinAVR/avr/include/util/delay.h **** "brne 1b"
129:C:/WinAVR/avr/include/util/delay.h **** : "=w" (__count)
130:C:/WinAVR/avr/include/util/delay.h **** : "0" (__count)
131:C:/WinAVR/avr/include/util/delay.h **** );
132:C:/WinAVR/avr/include/util/delay.h **** }
133:C:/WinAVR/avr/include/util/delay.h ****
134:C:/WinAVR/avr/include/util/delay.h **** #ifndef F_CPU
135:C:/WinAVR/avr/include/util/delay.h **** /* prevent compiler error by supplying a default */
136:C:/WinAVR/avr/include/util/delay.h **** # warning "F_CPU not defined for <util/delay.h>"
137:C:/WinAVR/avr/include/util/delay.h **** # define F_CPU 1000000UL
138:C:/WinAVR/avr/include/util/delay.h **** #endif
139:C:/WinAVR/avr/include/util/delay.h ****
140:C:/WinAVR/avr/include/util/delay.h **** /**
141:C:/WinAVR/avr/include/util/delay.h **** \ingroup util_delay
142:C:/WinAVR/avr/include/util/delay.h ****
143:C:/WinAVR/avr/include/util/delay.h **** Perform a delay of \c __us microseconds, using _delay_loop_1().
144:C:/WinAVR/avr/include/util/delay.h ****
145:C:/WinAVR/avr/include/util/delay.h **** The macro F_CPU is supposed to be defined to a
146:C:/WinAVR/avr/include/util/delay.h **** constant defining the CPU clock frequency (in Hertz).
147:C:/WinAVR/avr/include/util/delay.h ****
148:C:/WinAVR/avr/include/util/delay.h **** The maximal possible delay is 768 us / F_CPU in MHz.
149:C:/WinAVR/avr/include/util/delay.h **** */
150:C:/WinAVR/avr/include/util/delay.h **** void
151:C:/WinAVR/avr/include/util/delay.h **** _delay_us(double __us)
152:C:/WinAVR/avr/include/util/delay.h **** {
153:C:/WinAVR/avr/include/util/delay.h **** uint8_t __ticks;
154:C:/WinAVR/avr/include/util/delay.h **** double __tmp = ((F_CPU) / 3e6) * __us;
155:C:/WinAVR/avr/include/util/delay.h **** if (__tmp < 1.0)
156:C:/WinAVR/avr/include/util/delay.h **** __ticks = 1;
157:C:/WinAVR/avr/include/util/delay.h **** else if (__tmp > 255)
158:C:/WinAVR/avr/include/util/delay.h **** __ticks = 0; /* i.e. 256 */
159:C:/WinAVR/avr/include/util/delay.h **** else
160:C:/WinAVR/avr/include/util/delay.h **** __ticks = (uint8_t)__tmp;
161:C:/WinAVR/avr/include/util/delay.h **** _delay_loop_1(__ticks);
162:C:/WinAVR/avr/include/util/delay.h **** }
163:C:/WinAVR/avr/include/util/delay.h ****
164:C:/WinAVR/avr/include/util/delay.h ****
165:C:/WinAVR/avr/include/util/delay.h **** /**
166:C:/WinAVR/avr/include/util/delay.h **** \ingroup util_delay
167:C:/WinAVR/avr/include/util/delay.h ****
168:C:/WinAVR/avr/include/util/delay.h **** Perform a delay of \c __ms milliseconds, using _delay_loop_2().
169:C:/WinAVR/avr/include/util/delay.h ****
170:C:/WinAVR/avr/include/util/delay.h **** The macro F_CPU is supposed to be defined to a
171:C:/WinAVR/avr/include/util/delay.h **** constant defining the CPU clock frequency (in Hertz).
172:C:/WinAVR/avr/include/util/delay.h ****
173:C:/WinAVR/avr/include/util/delay.h **** The maximal possible delay is 262.14 ms / F_CPU in MHz.
174:C:/WinAVR/avr/include/util/delay.h **** */
175:C:/WinAVR/avr/include/util/delay.h **** void
176:C:/WinAVR/avr/include/util/delay.h **** _delay_ms(double __ms)
177:C:/WinAVR/avr/include/util/delay.h **** {
117 .LM7:
118 003c 80E0 ldi r24,lo8(0x41700000)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -