📄 lcd1602显示.lst
字号:
__start:
__text_start:
19 E5CF LDI R28,0x5F
1A E0D4 LDI R29,4
1B BFCD OUT 0x3D,R28
1C BFDE OUT 0x3E,R29
1D 51CE SUBI R28,0x1E
1E 40D0 SBCI R29,0
1F EA0A LDI R16,0xAA
20 8308 STD Y+0,R16
21 2400 CLR R0
22 E6EC LDI R30,0x6C
23 E0F0 LDI R31,0
24 E010 LDI R17,0
25 36EC CPI R30,0x6C
26 07F1 CPC R31,R17
27 F011 BEQ 0x002A
28 9201 ST R0,Z+
29 CFFB RJMP 0x0025
2A 8300 STD Z+0,R16
2B E2E6 LDI R30,0x26
2C E0F0 LDI R31,0
2D E6A0 LDI R26,0x60
2E E0B0 LDI R27,0
2F E010 LDI R17,0
30 E000 LDI R16,0
31 BF0B OUT 0x3B,R16
32 33E2 CPI R30,0x32
33 07F1 CPC R31,R17
34 F021 BEQ 0x0039
35 95C8 LPM
36 9631 ADIW R30,1
37 920D ST R0,X+
38 CFF9 RJMP 0x0032
39 D092 RCALL _main
_exit:
3A CFFF RJMP _exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_LCD1602显示\LCD1602显示.c
(0001) //ICC-AVR application builder : 2009-3-12 16:02:34
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTB = 0x00;
_port_init:
3B 2422 CLR R2
3C BA28 OUT 0x18,R2
(0011) DDRB = 0x00;
3D BA27 OUT 0x17,R2
(0012) PORTC = 0x00; //m103 output only
3E BA25 OUT 0x15,R2
(0013) DDRC = 0x00;
3F BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
40 BA22 OUT 0x12,R2
(0015) DDRD = 0x00;
41 BA21 OUT 0x11,R2
42 9508 RET
(0016) }
(0017)
(0018) //call this routine to initialize all peripherals
(0019) void init_devices(void)
(0020) {
(0021) //stop errant interrupts until set up
(0022) CLI(); //disable all interrupts
_init_devices:
43 94F8 BCLR 7
(0023) port_init();
44 DFF6 RCALL _port_init
(0024)
(0025) MCUCR = 0x00;
45 2422 CLR R2
46 BE25 OUT 0x35,R2
(0026) GICR = 0x00;
47 BE2B OUT 0x3B,R2
(0027) TIMSK = 0x00; //timer interrupt sources
48 BE29 OUT 0x39,R2
(0028) SEI(); //re-enable interrupts
49 9478 BSET 7
4A 9508 RET
_delay:
i --> R20
j --> R22
ms --> R16
4B D0B3 RCALL push_xgsetF000
(0029) //all peripherals are now initialized
(0030) }
(0031)
(0032) /*************************************************************************
(0033) 用 途:LCD1602显示
(0034) Taget :mega8
(0035) crystal :8M
(0036) 介 绍:用PB做端口,
(0037) PB0-D0
(0038) PB7-D7
(0039) ------
(0040) PC0-6
(0041) PC1-5
(0042) PC2-4----456为控制引脚
(0043) 入口参数:
(0044) 出口参数:
(0045) *************************************/
(0046) //延时程序
(0047) void delay(unsigned int ms)
(0048) {
(0049) unsigned int i,j;
(0050) for(i=0;i<ms;i++)
4C 2744 CLR R20
4D 2755 CLR R21
4E C00B RJMP 0x005A
(0051) {for(j=0;j<200;j++);}
4F 2766 CLR R22
50 2777 CLR R23
51 C002 RJMP 0x0054
52 5F6F SUBI R22,0xFF
53 4F7F SBCI R23,0xFF
54 3C68 CPI R22,0xC8
55 E0E0 LDI R30,0
56 077E CPC R23,R30
57 F3D0 BCS 0x0052
58 5F4F SUBI R20,0xFF
59 4F5F SBCI R21,0xFF
5A 1740 CP R20,R16
5B 0751 CPC R21,R17
5C F390 BCS 0x004F
5D C0A6 RJMP pop_xgsetF000
_com_lcd:
com --> R10
5E 92AA ST R10,-Y
5F 2EA0 MOV R10,R16
(0052) }
(0053) //送指令子程序
(0054) void com_lcd(unsigned char com)
(0055) {
(0056) PORTC&=~(1<<PC2);
60 98AA CBI 0x15,2
(0057) PORTC&=~(1<<PC1);
61 98A9 CBI 0x15,1
(0058) PORTB=com;
62 BAA8 OUT 0x18,R10
(0059) PORTC|=(1<<PC0);
63 9AA8 SBI 0x15,0
(0060) delay(5);
64 E005 LDI R16,5
65 E010 LDI R17,0
66 DFE4 RCALL _delay
(0061) PORTC&=~(1<<PC0);
67 98A8 CBI 0x15,0
68 90A9 LD R10,Y+
69 9508 RET
_data_lcd:
data --> R10
6A 92AA ST R10,-Y
6B 2EA0 MOV R10,R16
(0062) }
(0063) //送数据子程序
(0064) void data_lcd(unsigned char data)
(0065) {
(0066) PORTC|=(1<<PC2);
6C 9AAA SBI 0x15,2
(0067) PORTC&=~(1<<PC1);
6D 98A9 CBI 0x15,1
(0068) PORTB=data;
6E BAA8 OUT 0x18,R10
(0069) PORTC|=(1<<PC0);
6F 9AA8 SBI 0x15,0
(0070) delay(5);
70 E005 LDI R16,5
71 E010 LDI R17,0
72 DFD8 RCALL _delay
(0071) PORTC&=~(1<<PC0);
73 98A8 CBI 0x15,0
74 90A9 LD R10,Y+
75 9508 RET
(0072) }
(0073) //初始化
(0074) void LCD1602_init()
(0075) {
(0076) DDRB=0XFF;
_LCD1602_init:
76 EF8F LDI R24,0xFF
77 BB87 OUT 0x17,R24
(0077) DDRC|=0X07;
78 B384 IN R24,0x14
79 6087 ORI R24,7
7A BB84 OUT 0x14,R24
(0078) PORTC&=~(1<<PC0);
7B 98A8 CBI 0x15,0
(0079)
(0080) com_lcd(0x38);//5*7,2行显示
7C E308 LDI R16,0x38
7D DFE0 RCALL _com_lcd
(0081) delay(5);
7E E005 LDI R16,5
7F E010 LDI R17,0
80 DFCA RCALL _delay
(0082) com_lcd(0x01); //清屏
81 E001 LDI R16,1
82 DFDB RCALL _com_lcd
(0083) delay(5);
83 E005 LDI R16,5
84 E010 LDI R17,0
85 DFC5 RCALL _delay
(0084) com_lcd(0x0C);//文字不动,光标自动右移
86 E00C LDI R16,0xC
87 DFD6 RCALL _com_lcd
(0085) delay(5);
88 E005 LDI R16,5
89 E010 LDI R17,0
8A DFC0 RCALL _delay
(0086) com_lcd(0x06);//开显示
8B E006 LDI R16,6
8C DFD1 RCALL _com_lcd
(0087) delay(5);
8D E005 LDI R16,5
8E E010 LDI R17,0
8F DFBB RCALL _delay
90 9508 RET
(0088) }
(0089) //清屏
(0090) void LCD1602_clear()
(0091) {
(0092) com_lcd(0x01); //清屏
_LCD1602_clear:
91 E001 LDI R16,1
92 DFCB RCALL _com_lcd
(0093) delay(5);
93 E005 LDI R16,5
94 E010 LDI R17,0
95 DFB5 RCALL _delay
96 9508 RET
_LCD1602_goxy:
row --> R10
line --> R20
97 D05D RCALL push_xgset300C
98 2EA2 MOV R10,R18
99 2F40 MOV R20,R16
(0094) }
(0095) //定位x,y(x-列,y-行)
(0096) void LCD1602_goxy(unsigned char line,unsigned char row)
(0097) {
(0098) if (row==0)
9A 20AA TST R10
9B F411 BNE 0x009E
(0099) line+=0x81;
9C 574F SUBI R20,0x7F
9D C001 RJMP 0x009F
(0100) else
(0101) line+=0xc0;
9E 5440 SUBI R20,0x40
(0102) com_lcd(line);//第二行首地址
9F 2F04 MOV R16,R20
A0 DFBD RCALL _com_lcd
(0103) delay(5);
A1 E005 LDI R16,5
A2 E010 LDI R17,0
A3 DFA7 RCALL _delay
A4 C055 RJMP pop_xgset300C
_LCD1602_print:
str --> R20
A5 934A ST R20,-Y
A6 935A ST R21,-Y
A7 01A8 MOVW R20,R16
(0104) }
(0105) //显示字符串
(0106) LCD1602_print(char *str)
(0107) {
A8 C008 RJMP 0x00B1
(0108) while(*str)
(0109) {
(0110) data_lcd(*str);
A9 01FA MOVW R30,R20
AA 8100 LDD R16,Z+0
AB DFBE RCALL _data_lcd
(0111) delay(10);
AC E00A LDI R16,0xA
AD E010 LDI R17,0
AE DF9C RCALL _delay
(0112) str++;
AF 5F4F SUBI R20,0xFF
B0 4F5F SBCI R21,0xFF
B1 01FA MOVW R30,R20
B2 8020 LDD R2,Z+0
B3 2022 TST R2
B4 F7A1 BNE 0x00A9
B5 9159 LD R21,Y+
B6 9149 LD R20,Y+
B7 9508 RET
_LCD1602_printD:
n --> R10
B8 92AA ST R10,-Y
B9 2EA0 MOV R10,R16
(0113) }
(0114) }
(0115) //显示一个二位十位数
(0116) LCD1602_printD(unsigned char n)
(0117) {
(0118) data_lcd(n/10+0x30);
BA E01A LDI R17,0xA
BB 2D0A MOV R16,R10
BC D022 RCALL div8u
BD 5D00 SUBI R16,0xD0
BE DFAB RCALL _data_lcd
(0119) delay(10);
BF E00A LDI R16,0xA
C0 E010 LDI R17,0
C1 DF89 RCALL _delay
(0120) data_lcd(n%10+0x30);
C2 E01A LDI R17,0xA
C3 2D0A MOV R16,R10
C4 D018 RCALL mod8u
C5 5D00 SUBI R16,0xD0
C6 DFA3 RCALL _data_lcd
(0121) delay(10);
C7 E00A LDI R16,0xA
C8 E010 LDI R17,0
C9 DF81 RCALL _delay
CA 90A9 LD R10,Y+
CB 9508 RET
(0122) }
(0123) //**************************************************************************
(0124)
(0125) void main()
(0126) {
(0127) unsigned char i=23;
_main:
i --> R20
CC E147 LDI R20,0x17
(0128) port_init();
CD DF6D RCALL _port_init
(0129) init_devices();
CE DF74 RCALL _init_devices
(0130)
(0131) LCD1602_init();
CF DFA6 RCALL _LCD1602_init
(0132) LCD1602_goxy(2,0);
D0 2722 CLR R18
D1 E002 LDI R16,2
D2 DFC4 RCALL _LCD1602_goxy
(0133) LCD1602_print("xiaozhiyong");
D3 E600 LDI R16,0x60
D4 E010 LDI R17,0
D5 DFCF RCALL _LCD1602_print
(0134) LCD1602_goxy(2,1);
D6 E021 LDI R18,1
D7 E002 LDI R16,2
D8 DFBE RCALL _LCD1602_goxy
(0135) LCD1602_printD(i);
D9 2F04 MOV R16,R20
DA DFDD RCALL _LCD1602_printD
(0136)
(0137) while(1)
FILE: <library>
DB CFFF RJMP 0x00DB
DC 9508 RET
mod8u:
DD 9468 BSET 6
DE C001 RJMP xdiv8u
div8u:
DF 94E8 BCLR 6
xdiv8u:
E0 932A ST R18,-Y
E1 92FA ST R15,-Y
E2 92EA ST R14,-Y
E3 24FF CLR R15
E4 24EE CLR R14
E5 E120 LDI R18,0x10
E6 0F00 LSL R16
E7 1CFF ROL R15
E8 1CEE ROL R14
E9 16E1 CP R14,R17
EA F010 BCS 0x00ED
EB 1AE1 SUB R14,R17
EC 9503 INC R16
ED 952A DEC R18
EE F7B9 BNE 0x00E6
EF F40E BRTC 0x00F1
F0 2D0E MOV R16,R14
F1 90E9 LD R14,Y+
F2 90F9 LD R15,Y+
F3 9129 LD R18,Y+
F4 9508 RET
push_xgset300C:
F5 935A ST R21,-Y
F6 934A ST R20,-Y
F7 92BA ST R11,-Y
F8 92AA ST R10,-Y
F9 9508 RET
pop_xgset300C:
FA 90A9 LD R10,Y+
FB 90B9 LD R11,Y+
FC 9149 LD R20,Y+
FD 9159 LD R21,Y+
FE 9508 RET
push_xgsetF000:
FF 937A ST R23,-Y
100 936A ST R22,-Y
101 935A ST R21,-Y
102 934A ST R20,-Y
103 9508 RET
pop_xgsetF000:
104 9149 LD R20,Y+
105 9159 LD R21,Y+
106 9169 LD R22,Y+
107 9179 LD R23,Y+
108 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -