📄 lcd1602.lis
字号:
.module lcd1602.c
.area text(rom, con, rel)
0000 .dbfile D:\MYJOB~1\AVR资料\示例程序\DS1302-LCD1602-4bitBUS\lcd1602.c
0000 .dbfunc e delay_us _delay_us fV
0000 ; n -> R16,R17
.even
0000 _delay_us::
0000 .dbline -1
0000 .dbline 24
0000 ; /*
0000 ; LCD1602液晶屏四线驱动模块
0000 ; 1、可直接嵌入到项目中使用
0000 ; 2、晶振频率:1M
0000 ; 3、如晶振提高低层驱动延时要作相应修改
0000 ; 4、程序在原来基础上只使用了PB口的高四位,即PB4—PB7,PB0—PB3可以做它用
0000 ;
0000 ; SunnyTrip
0000 ; www.iccavr.com
0000 ; */
0000 ;
0000 ; #include <iom16v.h>
0000 ;
0000 ; #define RS_CLR PORTD &= ~(1 << PD3)
0000 ; #define RS_SET PORTD |= (1 << PD3)
0000 ;
0000 ; #define RW_CLR PORTD &= ~(1 << PD4)
0000 ; #define RW_SET PORTD |= (1 << PD4)
0000 ;
0000 ; #define EN_CLR PORTD &= ~(1 << PD6)
0000 ; #define EN_SET PORTD |= (1 << PD6)
0000 ;
0000 ; /*延时函数*/
0000 ; void delay_us(unsigned int n) {
0000 .dbline 26
0000 ;
0000 ; if (n == 0) {
0000 0030 cpi R16,0
0002 0107 cpc R16,R17
0004 09F4 brne L5
0006 X0:
0006 .dbline 26
0006 .dbline 27
0006 ; return ;
0006 06C0 xjmp L1
0008 L4:
0008 .dbline 29
0008 L5:
0008 .dbline 29
0008 ; }
0008 ; while (--n);
0008 C801 movw R24,R16
000A 0197 sbiw R24,1
000C 8C01 movw R16,R24
000E 0030 cpi R16,0
0010 0107 cpc R16,R17
0012 D1F7 brne L4
0014 X1:
0014 .dbline -2
0014 L1:
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbsym r n 16 i
0016 .dbend
0016 .dbfunc e delay_ms _delay_ms fV
0016 ; a -> R20
0016 ; b -> R22
0016 ; i -> R16
.even
0016 _delay_ms::
0016 0E940000 xcall push_gset2
001A .dbline -1
001A .dbline 33
001A ; }
001A ;
001A ; /*延时函数*/
001A ; void delay_ms(unsigned char i) {
001A .dbline 36
001A 41E0 ldi R20,1
001C 06C0 xjmp L11
001E L8:
001E .dbline 36
001E ;
001E ; unsigned char a, b;
001E ; for (a = 1; a < i; a++) {
001E .dbline 37
001E 61E0 ldi R22,1
0020 01C0 xjmp L15
0022 L12:
0022 .dbline 37
0022 .dbline 38
0022 .dbline 39
0022 L13:
0022 .dbline 37
0022 6395 inc R22
0024 L15:
0024 .dbline 37
0024 6623 tst R22
0026 E9F7 brne L12
0028 .dbline 40
0028 L9:
0028 .dbline 36
0028 4395 inc R20
002A L11:
002A .dbline 36
002A 4017 cp R20,R16
002C C0F3 brlo L8
002E .dbline -2
002E L7:
002E 0E940000 xcall pop_gset2
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbsym r a 20 c
0034 .dbsym r b 22 c
0034 .dbsym r i 16 c
0034 .dbend
0034 .dbfunc e LCD_write_com _LCD_write_com fV
0034 ; com -> R20
.even
0034 _LCD_write_com::
0034 0E940000 xcall push_gset1
0038 402F mov R20,R16
003A .dbline -1
003A .dbline 44
003A ; for (b = 1; b; b++) {
003A ; ;
003A ; }
003A ; }
003A ; }
003A ;
003A ; /*显示屏命令写入函数*/
003A ; void LCD_write_com(unsigned char com) {
003A .dbline 46
003A ;
003A ; RS_CLR;
003A 9398 cbi 0x12,3
003C .dbline 47
003C ; RW_CLR;
003C 9498 cbi 0x12,4
003E .dbline 48
003E ; EN_SET;
003E 969A sbi 0x12,6
0040 .dbline 49
0040 ; PORTB&=0x0f;
0040 88B3 in R24,0x18
0042 8F70 andi R24,15
0044 88BB out 0x18,R24
0046 .dbline 50
0046 ; PORTB|= com&0xf0;
0046 842F mov R24,R20
0048 807F andi R24,240
004A 28B2 in R2,0x18
004C 282A or R2,R24
004E 28BA out 0x18,R2
0050 .dbline 51
0050 ; com = com<<4;
0050 842F mov R24,R20
0052 8F70 andi R24,#0x0F
0054 8295 swap R24
0056 482F mov R20,R24
0058 .dbline 52
0058 ; EN_CLR;
0058 9698 cbi 0x12,6
005A .dbline 53
005A ; delay_us(1);
005A 01E0 ldi R16,1
005C 10E0 ldi R17,0
005E D0DF xcall _delay_us
0060 .dbline 54
0060 ; EN_SET;
0060 969A sbi 0x12,6
0062 .dbline 55
0062 ; PORTB&=0x0f;
0062 88B3 in R24,0x18
0064 8F70 andi R24,15
0066 88BB out 0x18,R24
0068 .dbline 56
0068 ; PORTB|= com&0xf0;
0068 842F mov R24,R20
006A 807F andi R24,240
006C 28B2 in R2,0x18
006E 282A or R2,R24
0070 28BA out 0x18,R2
0072 .dbline 57
0072 ; EN_CLR;
0072 9698 cbi 0x12,6
0074 .dbline 58
0074 ; delay_us(1);
0074 01E0 ldi R16,1
0076 10E0 ldi R17,0
0078 C3DF xcall _delay_us
007A .dbline -2
007A L16:
007A 0E940000 xcall pop_gset1
007E .dbline 0 ; func end
007E 0895 ret
0080 .dbsym r com 20 c
0080 .dbend
0080 .dbfunc e LCD_write_data _LCD_write_data fV
0080 ; data -> R20
.even
0080 _LCD_write_data::
0080 0E940000 xcall push_gset1
0084 402F mov R20,R16
0086 .dbline -1
0086 .dbline 62
0086 ; }
0086 ;
0086 ; /*显示屏命令写入函数*/
0086 ; void LCD_write_data(unsigned char data) {
0086 .dbline 64
0086 ;
0086 ; RS_SET;
0086 939A sbi 0x12,3
0088 .dbline 65
0088 ; RW_CLR;
0088 9498 cbi 0x12,4
008A .dbline 66
008A ; EN_SET;
008A 969A sbi 0x12,6
008C .dbline 67
008C ; PORTB&=0x0f;
008C 88B3 in R24,0x18
008E 8F70 andi R24,15
0090 88BB out 0x18,R24
0092 .dbline 68
0092 ; PORTB|= data&0xf0;
0092 842F mov R24,R20
0094 807F andi R24,240
0096 28B2 in R2,0x18
0098 282A or R2,R24
009A 28BA out 0x18,R2
009C .dbline 69
009C ; data = data<<4;
009C 842F mov R24,R20
009E 8F70 andi R24,#0x0F
00A0 8295 swap R24
00A2 482F mov R20,R24
00A4 .dbline 70
00A4 ; EN_CLR;
00A4 9698 cbi 0x12,6
00A6 .dbline 71
00A6 ; delay_us(1);
00A6 01E0 ldi R16,1
00A8 10E0 ldi R17,0
00AA AADF xcall _delay_us
00AC .dbline 72
00AC ; EN_SET;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -