📄 1602.lst
字号:
__start:
__text_start:
1F E5CF LDI R28,0x5F
20 E0D4 LDI R29,4
21 BFCD OUT 0x3D,R28
22 BFDE OUT 0x3E,R29
23 51C0 SUBI R28,0x10
24 40D0 SBCI R29,0
25 EA0A LDI R16,0xAA
26 8308 STD Y+0,R16
27 2400 CLR R0
28 E7E8 LDI R30,0x78
29 E0F0 LDI R31,0
2A E010 LDI R17,0
2B 37E8 CPI R30,0x78
2C 07F1 CPC R31,R17
2D F011 BEQ 0x0030
2E 9201 ST R0,Z+
2F CFFB RJMP 0x002B
30 8300 STD Z+0,R16
31 E2E6 LDI R30,0x26
32 E0F0 LDI R31,0
33 E6A0 LDI R26,0x60
34 E0B0 LDI R27,0
35 E010 LDI R17,0
36 E000 LDI R16,0
37 BF0B OUT 0x3B,R16
38 33EE CPI R30,0x3E
39 07F1 CPC R31,R17
3A F021 BEQ 0x003F
3B 95C8 LPM
3C 9631 ADIW R30,1
3D 920D ST R0,X+
3E CFF9 RJMP 0x0038
3F D07C RCALL _main
_exit:
40 CFFF RJMP _exit
FILE: D:\我的文档\MYDESI~1\1602\1602.c
(0001) //说明:此程序在LCD1602上显示“Velcome! ”“www.iccavr.com”同时实现左右移动。
(0002)
(0003) /*********************************
(0004) * 字符LCD1602应用例子 *
(0005) * 实验环境:本站的M16学习板 *
(0006) * 接线方式:RS=PD.3,E=PC.6 *
(0007) * Db0-Db7=PB0-PB7 *
(0008) * 作 者:tonghe *
(0009) * 日 期:2007年03月06日 *
(0010) * 版 本:V1.2 *
(0011) * 修改日期:2007年08月11日 *
(0012) * 编 译 器:ICCAVR6.31A *
(0013) *********************************/
(0014) #include "iom8v.h"
(0015)
(0016) //宏定义
(0017) #define RS1602 PD3 //RS接在PORTD.3上
(0018) #define E1602 PC6 //E接在PORTC.6上
(0019) #define LCD_DATA PORTB //8位数据联接在PORTB上
(0020) #define CLR_RS PORTD&=~(1<<RS1602)//RS清0
(0021) #define SET_RS PORTD|=1<<RS1602 //RS置1
(0022) #define CLR_E PORTC&=~(1<<E1602) //E清0
(0023) #define SET_E PORTC|=1<<E1602 //E置1
(0024)
(0025) #define uchar unsigned char
(0026) #define uint unsigned int
(0027)
(0028) //配置端口
(0029) void port_init(void)
(0030) {
(0031) // PORTA = 0xFF;
(0032) //DDRA = 0x00;
(0033) DDRB = 0xFF;
_port_init:
41 EF8F LDI R24,0xFF
42 BB87 OUT 0x17,R24
(0034) PORTB = 0xFF;
43 BB88 OUT 0x18,R24
(0035) DDRD = 0xFF;
44 BB81 OUT 0x11,R24
(0036) PORTD = 0x00;
45 2422 CLR R2
46 BA22 OUT 0x12,R2
(0037)
(0038) DDRC = 0xFF; //定义C口为输出
47 BB84 OUT 0x14,R24
(0039) PORTC = 0x00; //开背光:接在PC7
48 BA25 OUT 0x15,R2
49 9508 RET
_delay_ms:
a --> R20
i --> R16
4A 934A ST R20,-Y
4B 935A ST R21,-Y
(0040)
(0041) }
(0042)
(0043) //延时函数:入口i,单位mS,最大65536mS
(0044) void delay_ms(uint i)
(0045) {
(0046) uint a;
(0047) for(;i;i--)
4C C00A RJMP 0x0057
(0048) {
(0049) for(a=150;a!=0;a--) //针对时钟频率为1M
4D E946 LDI R20,0x96
4E E050 LDI R21,0
4F C002 RJMP 0x0052
50 5041 SUBI R20,1
51 4050 SBCI R21,0
52 3040 CPI R20,0
53 0745 CPC R20,R21
54 F7D9 BNE 0x0050
55 5001 SUBI R16,1
56 4010 SBCI R17,0
57 3000 CPI R16,0
58 0701 CPC R16,R17
59 F799 BNE 0x004D
5A 9159 LD R21,Y+
5B 9149 LD R20,Y+
5C 9508 RET
_lcd_da:
data --> R10
5D 92AA ST R10,-Y
5E 2EA0 MOV R10,R16
(0050) {;}
(0051) }
(0052) }
(0053)
(0054) //写数据到LCD的函数
(0055) void lcd_da(uchar data)
(0056) {
(0057) SET_RS; //RS置高,写数据
5F 9A93 SBI 0x12,3
(0058) delay_ms(1);
60 E001 LDI R16,1
61 E010 LDI R17,0
62 DFE7 RCALL _delay_ms
(0059) SET_E;
63 9AAE SBI 0x15,6
(0060) LCD_DATA = data;
64 BAA8 OUT 0x18,R10
(0061) delay_ms(1);
65 E001 LDI R16,1
66 E010 LDI R17,0
67 DFE2 RCALL _delay_ms
(0062) CLR_E;
68 98AE CBI 0x15,6
(0063) delay_ms(1); //延时5MS
69 E001 LDI R16,1
6A E010 LDI R17,0
6B DFDE RCALL _delay_ms
6C 90A9 LD R10,Y+
6D 9508 RET
_lcd_comm:
data --> R10
6E 92AA ST R10,-Y
6F 2EA0 MOV R10,R16
(0064) }
(0065)
(0066) //写指令到LCD的函数
(0067) void lcd_comm(uchar data)
(0068) {
(0069) CLR_RS; //RS清0,写指令
70 9893 CBI 0x12,3
(0070) delay_ms(1); //延时5MS
71 E001 LDI R16,1
72 E010 LDI R17,0
73 DFD6 RCALL _delay_ms
(0071) SET_E;
74 9AAE SBI 0x15,6
(0072) LCD_DATA = data;
75 BAA8 OUT 0x18,R10
(0073) delay_ms(1);
76 E001 LDI R16,1
77 E010 LDI R17,0
78 DFD1 RCALL _delay_ms
(0074) CLR_E;
79 98AE CBI 0x15,6
(0075) delay_ms(1); //延时5MS
7A E001 LDI R16,1
7B E010 LDI R17,0
7C DFCD RCALL _delay_ms
7D 90A9 LD R10,Y+
7E 9508 RET
_lcd:
s --> R20
7F 934A ST R20,-Y
80 935A ST R21,-Y
81 01A8 MOVW R20,R16
(0076) }
(0077)
(0078) //显示字符串函数:入口:待显示的字符串
(0079) void lcd(char *s)
(0080) {
82 C005 RJMP 0x0088
(0081) while(*s)
(0082) {
(0083) lcd_da(*s);
83 01FA MOVW R30,R20
84 8100 LDD R16,Z+0
85 DFD7 RCALL _lcd_da
(0084) s++;
86 5F4F SUBI R20,0xFF
87 4F5F SBCI R21,0xFF
88 01FA MOVW R30,R20
89 8020 LDD R2,Z+0
8A 2022 TST R2
8B F7B9 BNE 0x0083
8C 9159 LD R21,Y+
8D 9149 LD R20,Y+
8E 9508 RET
(0085) }
(0086) }
(0087)
(0088) //清屏指令函数
(0089) void cls(void)
(0090) {
(0091) lcd_comm(0x01);
_cls:
8F E001 LDI R16,1
90 DFDD RCALL _lcd_comm
(0092) delay_ms(5);
91 E005 LDI R16,5
92 E010 LDI R17,0
93 DFB6 RCALL _delay_ms
94 9508 RET
_locate:
x --> R20
b --> R22
a --> R10
95 D065 RCALL push_xgsetF00C
96 2F62 MOV R22,R18
97 2EA0 MOV R10,R16
(0093) }
(0094)
(0095) //定位指令函数
(0096) void locate(uchar a,uchar b)
(0097) {
(0098) uchar x;
(0099) if(a==1)
98 2D8A MOV R24,R10
99 3081 CPI R24,1
9A F419 BNE 0x009E
(0100) x=0x80+b-1;
9B 2F46 MOV R20,R22
9C 5840 SUBI R20,0x80
9D 5041 SUBI R20,1
(0101) if(a==2)
9E 2D8A MOV R24,R10
9F 3082 CPI R24,2
A0 F419 BNE 0x00A4
(0102) x=0xC0+b-1;
A1 2F46 MOV R20,R22
A2 5440 SUBI R20,0x40
A3 5041 SUBI R20,1
(0103) lcd_comm(x);
A4 2F04 MOV R16,R20
A5 DFC8 RCALL _lcd_comm
(0104) delay_ms(1);
A6 E001 LDI R16,1
A7 E010 LDI R17,0
A8 DFA1 RCALL _delay_ms
A9 C058 RJMP pop_xgsetF00C
(0105) }
(0106)
(0107) //LCD初始化函数
(0108) void lcd_init(void)
(0109) {
(0110) lcd_comm(0x38); //写指令:8位数据、2行显示、5*8点阵
_lcd_init:
AA E308 LDI R16,0x38
AB DFC2 RCALL _lcd_comm
(0111) delay_ms(5);
AC E005 LDI R16,5
AD E010 LDI R17,0
AE DF9B RCALL _delay_ms
(0112) lcd_comm(0x06); //写指令:自左向右显示
AF E006 LDI R16,6
B0 DFBD RCALL _lcd_comm
(0113) delay_ms(5);
B1 E005 LDI R16,5
B2 E010 LDI R17,0
B3 DF96 RCALL _delay_ms
(0114) lcd_comm(0x0C); //写指令:显示开
B4 E00C LDI R16,0xC
B5 DFB8 RCALL _lcd_comm
(0115) delay_ms(5);
B6 E005 LDI R16,5
B7 E010 LDI R17,0
B8 DF91 RCALL _delay_ms
(0116) // lcd_comm(0x80); //写指令:第1行地址
(0117) // delay_ms(5);
(0118) lcd_comm(0x01); //写指令:CLS
B9 E001 LDI R16,1
BA DFB3 RCALL _lcd_comm
BB 9508 RET
(0119) }
(0120)
(0121) //主函数
(0122) void main(void)
(0123) {
(0124) uchar i;
(0125)
(0126) port_init(); //端口初始化
_main:
i --> R20
BC DF84 RCALL _port_init
(0127) delay_ms(50); //延时500ms
BD E302 LDI R16,0x32
BE E010 LDI R17,0
BF DF8A RCALL _delay_ms
(0128) lcd_init(); //LCD初始化
C0 DFE9 RCALL _lcd_init
(0129)
(0130) delay_ms(50);
C1 E302 LDI R16,0x32
C2 E010 LDI R17,0
C3 DF86 RCALL _delay_ms
(0131) locate(1,5); //第一行显示位置
C4 E025 LDI R18,5
C5 E001 LDI R16,1
C6 DFCE RCALL _locate
(0132) lcd("Velcome!"); //第一行显示内容
C7 E60F LDI R16,0x6F
C8 E010 LDI R17,0
C9 DFB5 RCALL _lcd
(0133) locate(2,2); //第二行显示位置
CA E022 LDI R18,2
CB E002 LDI R16,2
CC DFC8 RCALL _locate
(0134) lcd("www.iccavr.com"); //第二行显示内容
CD E600 LDI R16,0x60
CE E010 LDI R17,0
CF DFAF RCALL _lcd
(0135)
(0136) for(i=5;i;i--) //先右移5位
D0 E045 LDI R20,5
D1 C006 RJMP 0x00D8
(0137) {
(0138) lcd_comm(0x1C);
D2 E10C LDI R16,0x1C
D3 DF9A RCALL _lcd_comm
(0139) delay_ms(100);
D4 E604 LDI R16,0x64
D5 E010 LDI R17,0
D6 DF73 RCALL _delay_ms
D7 954A DEC R20
D8 2344 TST R20
D9 F7C1 BNE 0x00D2
DA C01E RJMP 0x00F9
(0140) }
(0141)
(0142) while (1)
(0143) {
(0144) for(i=10;i;i--) //左移10位
DB E04A LDI R20,0xA
DC C00B RJMP 0x00E8
(0145) {
(0146) lcd_comm(0x18);
DD E108 LDI R16,0x18
DE DF8F RCALL _lcd_comm
(0147) if(i==6)delay_ms(2000); //移到中间暂停2秒
DF 3046 CPI R20,6
E0 F419 BNE 0x00E4
E1 ED00 LDI R16,0xD0
E2 E017 LDI R17,7
E3 DF66 RCALL _delay_ms
(0148) delay_ms(400);
E4 E900 LDI R16,0x90
E5 E011 LDI R17,1
E6 DF63 RCALL _delay_ms
E7 954A DEC R20
E8 2344 TST R20
E9 F799 BNE 0x00DD
(0149) }
(0150) for(i=10;i;i--) //右移10位
EA E04A LDI R20,0xA
EB C00B RJMP 0x00F7
(0151) {
(0152) lcd_comm(0x1C);
EC E10C LDI R16,0x1C
ED DF80 RCALL _lcd_comm
(0153) if(i==6)delay_ms(2000);
EE 3046 CPI R20,6
EF F419 BNE 0x00F3
F0 ED00 LDI R16,0xD0
F1 E017 LDI R17,7
F2 DF57 RCALL _delay_ms
(0154) delay_ms(400);
FILE: <library>
F3 E900 LDI R16,0x90
F4 E011 LDI R17,1
F5 DF54 RCALL _delay_ms
F6 954A DEC R20
F7 2344 TST R20
F8 F799 BNE 0x00EC
F9 CFE1 RJMP 0x00DB
FA 9508 RET
push_xgsetF00C:
FB 937A ST R23,-Y
FC 936A ST R22,-Y
FD 935A ST R21,-Y
FE 934A ST R20,-Y
FF 92BA ST R11,-Y
100 92AA ST R10,-Y
101 9508 RET
pop_xgsetF00C:
102 90A9 LD R10,Y+
103 90B9 LD R11,Y+
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 + -