📄 1602.lis
字号:
.module _1602.c
.area text(rom, con, rel)
0000 .dbfile D:\我的文档\MYDESI~1\1602\1602.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 30
0000 ; //说明:此程序在LCD1602上显示“Velcome! ”“www.iccavr.com”同时实现左右移动。
0000 ;
0000 ; /*********************************
0000 ; * 字符LCD1602应用例子 *
0000 ; * 实验环境:本站的M16学习板 *
0000 ; * 接线方式:RS=PD.3,E=PC.6 *
0000 ; * Db0-Db7=PB0-PB7 *
0000 ; * 作 者:tonghe *
0000 ; * 日 期:2007年03月06日 *
0000 ; * 版 本:V1.2 *
0000 ; * 修改日期:2007年08月11日 *
0000 ; * 编 译 器:ICCAVR6.31A *
0000 ; *********************************/
0000 ; #include "iom8v.h"
0000 ;
0000 ; //宏定义
0000 ; #define RS1602 PD3 //RS接在PORTD.3上
0000 ; #define E1602 PC6 //E接在PORTC.6上
0000 ; #define LCD_DATA PORTB //8位数据联接在PORTB上
0000 ; #define CLR_RS PORTD&=~(1<<RS1602)//RS清0
0000 ; #define SET_RS PORTD|=1<<RS1602 //RS置1
0000 ; #define CLR_E PORTC&=~(1<<E1602) //E清0
0000 ; #define SET_E PORTC|=1<<E1602 //E置1
0000 ;
0000 ; #define uchar unsigned char
0000 ; #define uint unsigned int
0000 ;
0000 ; //配置端口
0000 ; void port_init(void)
0000 ; {
0000 .dbline 33
0000 ; // PORTA = 0xFF;
0000 ; //DDRA = 0x00;
0000 ; DDRB = 0xFF;
0000 8FEF ldi R24,255
0002 87BB out 0x17,R24
0004 .dbline 34
0004 ; PORTB = 0xFF;
0004 88BB out 0x18,R24
0006 .dbline 35
0006 ; DDRD = 0xFF;
0006 81BB out 0x11,R24
0008 .dbline 36
0008 ; PORTD = 0x00;
0008 2224 clr R2
000A 22BA out 0x12,R2
000C .dbline 38
000C ;
000C ; DDRC = 0xFF; //定义C口为输出
000C 84BB out 0x14,R24
000E .dbline 39
000E ; PORTC = 0x00; //开背光:接在PC7
000E 25BA out 0x15,R2
0010 .dbline -2
0010 L1:
0010 .dbline 0 ; func end
0010 0895 ret
0012 .dbend
0012 .dbfunc e delay_ms _delay_ms fV
0012 ; a -> R20,R21
0012 ; i -> R16,R17
.even
0012 _delay_ms::
0012 4A93 st -y,R20
0014 5A93 st -y,R21
0016 .dbline -1
0016 .dbline 45
0016 ;
0016 ; }
0016 ;
0016 ; //延时函数:入口i,单位mS,最大65536mS
0016 ; void delay_ms(uint i)
0016 ; {
0016 .dbline 47
0016 ; uint a;
0016 ; for(;i;i--)
0016 0AC0 rjmp L6
0018 L3:
0018 .dbline 48
0018 ; {
0018 .dbline 49
0018 ; for(a=150;a!=0;a--) //针对时钟频率为1M
0018 46E9 ldi R20,150
001A 50E0 ldi R21,0
001C 02C0 rjmp L10
001E L7:
001E .dbline 50
001E ; {;}
001E .dbline 50
001E .dbline 50
001E L8:
001E .dbline 49
001E 4150 subi R20,1
0020 5040 sbci R21,0
0022 L10:
0022 .dbline 49
0022 4030 cpi R20,0
0024 4507 cpc R20,R21
0026 D9F7 brne L7
0028 X0:
0028 .dbline 51
0028 ; }
0028 L4:
0028 .dbline 47
0028 0150 subi R16,1
002A 1040 sbci R17,0
002C L6:
002C .dbline 47
002C 0030 cpi R16,0
002E 0107 cpc R16,R17
0030 99F7 brne L3
0032 X1:
0032 .dbline -2
0032 L2:
0032 .dbline 0 ; func end
0032 5991 ld R21,y+
0034 4991 ld R20,y+
0036 0895 ret
0038 .dbsym r a 20 i
0038 .dbsym r i 16 i
0038 .dbend
0038 .dbfunc e lcd_da _lcd_da fV
0038 ; data -> R10
.even
0038 _lcd_da::
0038 AA92 st -y,R10
003A A02E mov R10,R16
003C .dbline -1
003C .dbline 56
003C ; }
003C ;
003C ; //写数据到LCD的函数
003C ; void lcd_da(uchar data)
003C ; {
003C .dbline 57
003C ; SET_RS; //RS置高,写数据
003C 939A sbi 0x12,3
003E .dbline 58
003E ; delay_ms(1);
003E 01E0 ldi R16,1
0040 10E0 ldi R17,0
0042 E7DF rcall _delay_ms
0044 .dbline 59
0044 ; SET_E;
0044 AE9A sbi 0x15,6
0046 .dbline 60
0046 ; LCD_DATA = data;
0046 A8BA out 0x18,R10
0048 .dbline 61
0048 ; delay_ms(1);
0048 01E0 ldi R16,1
004A 10E0 ldi R17,0
004C E2DF rcall _delay_ms
004E .dbline 62
004E ; CLR_E;
004E AE98 cbi 0x15,6
0050 .dbline 63
0050 ; delay_ms(1); //延时5MS
0050 01E0 ldi R16,1
0052 10E0 ldi R17,0
0054 DEDF rcall _delay_ms
0056 .dbline -2
0056 L11:
0056 .dbline 0 ; func end
0056 A990 ld R10,y+
0058 0895 ret
005A .dbsym r data 10 c
005A .dbend
005A .dbfunc e lcd_comm _lcd_comm fV
005A ; data -> R10
.even
005A _lcd_comm::
005A AA92 st -y,R10
005C A02E mov R10,R16
005E .dbline -1
005E .dbline 68
005E ; }
005E ;
005E ; //写指令到LCD的函数
005E ; void lcd_comm(uchar data)
005E ; {
005E .dbline 69
005E ; CLR_RS; //RS清0,写指令
005E 9398 cbi 0x12,3
0060 .dbline 70
0060 ; delay_ms(1); //延时5MS
0060 01E0 ldi R16,1
0062 10E0 ldi R17,0
0064 D6DF rcall _delay_ms
0066 .dbline 71
0066 ; SET_E;
0066 AE9A sbi 0x15,6
0068 .dbline 72
0068 ; LCD_DATA = data;
0068 A8BA out 0x18,R10
006A .dbline 73
006A ; delay_ms(1);
006A 01E0 ldi R16,1
006C 10E0 ldi R17,0
006E D1DF rcall _delay_ms
0070 .dbline 74
0070 ; CLR_E;
0070 AE98 cbi 0x15,6
0072 .dbline 75
0072 ; delay_ms(1); //延时5MS
0072 01E0 ldi R16,1
0074 10E0 ldi R17,0
0076 CDDF rcall _delay_ms
0078 .dbline -2
0078 L12:
0078 .dbline 0 ; func end
0078 A990 ld R10,y+
007A 0895 ret
007C .dbsym r data 10 c
007C .dbend
007C .dbfunc e lcd _lcd fV
007C ; s -> R20,R21
.even
007C _lcd::
007C 4A93 st -y,R20
007E 5A93 st -y,R21
0080 A801 movw R20,R16
0082 .dbline -1
0082 .dbline 80
0082 ; }
0082 ;
0082 ; //显示字符串函数:入口:待显示的字符串
0082 ; void lcd(char *s)
0082 ; {
0082 05C0 rjmp L15
0084 L14:
0084 .dbline 82
0084 ; while(*s)
0084 ; {
0084 .dbline 83
0084 ; lcd_da(*s);
0084 FA01 movw R30,R20
0086 0081 ldd R16,z+0
0088 D7DF rcall _lcd_da
008A .dbline 84
008A ; s++;
008A 4F5F subi R20,255 ; offset = 1
008C 5F4F sbci R21,255
008E .dbline 85
008E ; }
008E L15:
008E .dbline 81
008E FA01 movw R30,R20
0090 2080 ldd R2,z+0
0092 2220 tst R2
0094 B9F7 brne L14
0096 X2:
0096 .dbline -2
0096 L13:
0096 .dbline 0 ; func end
0096 5991 ld R21,y+
0098 4991 ld R20,y+
009A 0895 ret
009C .dbsym r s 20 pc
009C .dbend
009C .dbfunc e cls _cls fV
.even
009C _cls::
009C .dbline -1
009C .dbline 90
009C ; }
009C ;
009C ; //清屏指令函数
009C ; void cls(void)
009C ; {
009C .dbline 91
009C ; lcd_comm(0x01);
009C 01E0 ldi R16,1
009E DDDF rcall _lcd_comm
00A0 .dbline 92
00A0 ; delay_ms(5);
00A0 05E0 ldi R16,5
00A2 10E0 ldi R17,0
00A4 B6DF rcall _delay_ms
00A6 .dbline -2
00A6 L17:
00A6 .dbline 0 ; func end
00A6 0895 ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -