📄 lcd12864.lis
字号:
.module lcd12864.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\016-LCD12864\lcd12864.c
0000 .dbfunc e delay_us _delay_us fV
0000 ; n -> R16,R17
.even
0000 _delay_us::
0000 .dbline -1
0000 .dbline 33
0000 ; /*
0000 ; LCD1602液晶屏驱动模块
0000 ; 1、可直接嵌入到项目中使用
0000 ; 2、晶振频率:1M
0000 ; 3、如晶振提高低层驱动延时要作相应修改
0000 ;
0000 ; AVR_AFA
0000 ; www.iccavr.com
0000 ; */
0000 ;
0000 ; #include <iom16v.h>
0000 ; #include "font.h"
0000 ;
0000 ; #define RS_CLR PORTD &= ~(1 << PD3)/*命令或数据选择*/
0000 ; #define RS_SET PORTD |= (1 << PD3)/*RS = 1命令,RS = 0数据*/
0000 ;
0000 ; #define RW_CLR PORTD &= ~(1 << PD4)/*读取或写入选择*/
0000 ; #define RW_SET PORTD |= (1 << PD4)/*RW = 1读,RW = 0写*/
0000 ;
0000 ; #define EN_CLR PORTD &= ~(1 << PD6)/*读写使能信号*/
0000 ; #define EN_SET PORTD |= (1 << PD6)/*下降沿有效*/
0000 ;
0000 ; #define RST_CLR PORTD &= ~(1 << PD7)/*芯片复位脚*/
0000 ; #define RST_SET PORTD |= (1 << PD7)/*高电平复位*/
0000 ;
0000 ; #define CSA_CLR PORTC &= ~(1 << PC6)/*左半屏片选*/
0000 ; #define CSA_SET PORTC |= (1 << PC6)/*高电平选中*/
0000 ;
0000 ; #define CSB_CLR PORTC &= ~(1 << PC7)/*右半屏片选*/
0000 ; #define CSB_SET PORTC |= (1 << PC7)/*高电平选中*/
0000 ;
0000 ; /*延时函数*/
0000 ; void delay_us(unsigned int n) {
0000 .dbline 35
0000 ;
0000 ; if (n == 0) {
0000 0030 cpi R16,0
0002 0107 cpc R16,R17
0004 09F4 brne L5
0006 X0:
0006 .dbline 35
0006 .dbline 36
0006 ; return ;
0006 06C0 xjmp L1
0008 L4:
0008 .dbline 38
0008 L5:
0008 .dbline 38
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 42
001A ; }
001A ;
001A ; /*延时函数*/
001A ; void delay_ms(unsigned char i) {
001A .dbline 45
001A 41E0 ldi R20,1
001C 06C0 xjmp L11
001E L8:
001E .dbline 45
001E ;
001E ; unsigned char a, b;
001E ; for (a = 1; a < i; a++) {
001E .dbline 46
001E 61E0 ldi R22,1
0020 01C0 xjmp L15
0022 L12:
0022 .dbline 46
0022 .dbline 47
0022 .dbline 48
0022 L13:
0022 .dbline 46
0022 6395 inc R22
0024 L15:
0024 .dbline 46
0024 6623 tst R22
0026 E9F7 brne L12
0028 .dbline 49
0028 L9:
0028 .dbline 45
0028 4395 inc R20
002A L11:
002A .dbline 45
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 LCD0_write_com _LCD0_write_com fV
0034 ; com -> R20
.even
0034 _LCD0_write_com::
0034 0E940000 xcall push_gset1
0038 402F mov R20,R16
003A .dbline -1
003A .dbline 53
003A ; for (b = 1; b; b++) {
003A ; ;
003A ; }
003A ; }
003A ; }
003A ;
003A ; /*显示屏命令写入函数前半屏*/
003A ; void LCD0_write_com(unsigned char com) {
003A .dbline 55
003A ;
003A ; RS_CLR;
003A 9398 cbi 0x12,3
003C .dbline 56
003C ; RW_CLR;
003C 9498 cbi 0x12,4
003E .dbline 57
003E ; CSA_SET;
003E AE9A sbi 0x15,6
0040 .dbline 58
0040 ; CSB_CLR;
0040 AF98 cbi 0x15,7
0042 .dbline 59
0042 ; EN_SET;
0042 969A sbi 0x12,6
0044 .dbline 60
0044 ; PORTB = com;
0044 48BB out 0x18,R20
0046 .dbline 61
0046 ; delay_us(1);
0046 01E0 ldi R16,1
0048 10E0 ldi R17,0
004A DADF xcall _delay_us
004C .dbline 62
004C ; EN_CLR;
004C 9698 cbi 0x12,6
004E .dbline -2
004E L16:
004E 0E940000 xcall pop_gset1
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbsym r com 20 c
0054 .dbend
0054 .dbfunc e LCD1_write_com _LCD1_write_com fV
0054 ; com -> R20
.even
0054 _LCD1_write_com::
0054 0E940000 xcall push_gset1
0058 402F mov R20,R16
005A .dbline -1
005A .dbline 66
005A ; }
005A ;
005A ; /*显示屏命令写入函数后半屏*/
005A ; void LCD1_write_com(unsigned char com) {
005A .dbline 68
005A ;
005A ; RS_CLR;
005A 9398 cbi 0x12,3
005C .dbline 69
005C ; RW_CLR;
005C 9498 cbi 0x12,4
005E .dbline 70
005E ; CSA_CLR;
005E AE98 cbi 0x15,6
0060 .dbline 71
0060 ; CSB_SET;
0060 AF9A sbi 0x15,7
0062 .dbline 72
0062 ; EN_SET;
0062 969A sbi 0x12,6
0064 .dbline 73
0064 ; PORTB = com;
0064 48BB out 0x18,R20
0066 .dbline 74
0066 ; delay_us(1);
0066 01E0 ldi R16,1
0068 10E0 ldi R17,0
006A CADF xcall _delay_us
006C .dbline 75
006C ; EN_CLR;
006C 9698 cbi 0x12,6
006E .dbline -2
006E L17:
006E 0E940000 xcall pop_gset1
0072 .dbline 0 ; func end
0072 0895 ret
0074 .dbsym r com 20 c
0074 .dbend
0074 .dbfunc e LCD0_write_data _LCD0_write_data fV
0074 ; data -> R20
.even
0074 _LCD0_write_data::
0074 0E940000 xcall push_gset1
0078 402F mov R20,R16
007A .dbline -1
007A .dbline 79
007A ; }
007A ;
007A ; /*显示屏命令写入函数*/
007A ; void LCD0_write_data(unsigned char data) {
007A .dbline 81
007A ;
007A ; RS_SET;
007A 939A sbi 0x12,3
007C .dbline 82
007C ; RW_CLR;
007C 9498 cbi 0x12,4
007E .dbline 83
007E ; CSA_SET;
007E AE9A sbi 0x15,6
0080 .dbline 84
0080 ; CSB_CLR;
0080 AF98 cbi 0x15,7
0082 .dbline 85
0082 ; EN_SET;
0082 969A sbi 0x12,6
0084 .dbline 86
0084 ; PORTB = data;
0084 48BB out 0x18,R20
0086 .dbline 87
0086 ; delay_us(1);
0086 01E0 ldi R16,1
0088 10E0 ldi R17,0
008A BADF xcall _delay_us
008C .dbline 88
008C ; EN_CLR;
008C 9698 cbi 0x12,6
008E .dbline -2
008E L18:
008E 0E940000 xcall pop_gset1
0092 .dbline 0 ; func end
0092 0895 ret
0094 .dbsym r data 20 c
0094 .dbend
0094 .dbfunc e LCD1_write_data _LCD1_write_data fV
0094 ; data -> R20
.even
0094 _LCD1_write_data::
0094 0E940000 xcall push_gset1
0098 402F mov R20,R16
009A .dbline -1
009A .dbline 92
009A ; }
009A ;
009A ; /*显示屏命令写入函数*/
009A ; void LCD1_write_data(unsigned char data) {
009A .dbline 94
009A ;
009A ; RS_SET;
009A 939A sbi 0x12,3
009C .dbline 95
009C ; RW_CLR;
009C 9498 cbi 0x12,4
009E .dbline 96
009E ; CSA_CLR;
009E AE98 cbi 0x15,6
00A0 .dbline 97
00A0 ; CSB_SET;
00A0 AF9A sbi 0x15,7
00A2 .dbline 98
00A2 ; EN_SET;
00A2 969A sbi 0x12,6
00A4 .dbline 99
00A4 ; PORTB = data;
00A4 48BB out 0x18,R20
00A6 .dbline 100
00A6 ; delay_us(1);
00A6 01E0 ldi R16,1
00A8 10E0 ldi R17,0
00AA AADF xcall _delay_us
00AC .dbline 101
00AC ; EN_CLR;
00AC 9698 cbi 0x12,6
00AE .dbline -2
00AE L19:
00AE 0E940000 xcall pop_gset1
00B2 .dbline 0 ; func end
00B2 0895 ret
00B4 .dbsym r data 20 c
00B4 .dbend
00B4 .dbfunc e disp_clear _disp_clear fV
00B4 ; x -> R20
00B4 ; y -> R10
00B4 ; x1 -> R22
00B4 ; x0 -> R12
.even
00B4 _disp_clear::
00B4 0E940000 xcall push_gset4
00B8 622F mov R22,R18
00BA C02E mov R12,R16
00BC A884 ldd R10,y+8
00BE .dbline -1
00BE .dbline 105
00BE ; }
00BE ;
00BE ; /*显示屏清空显示*/
00BE ; void disp_clear(unsigned char x0, unsigned char x1, unsigned char y) {
00BE .dbline 110
00BE ;
00BE ; unsigned char x;
00BE ;
00BE ; /*清除高位*/
00BE ; x = x0;
00BE 4C2D mov R20,R12
00C0 .dbline 111
00C0 ; if (x < 63) { /*地址在左半屏范围内*/
00C0 4F33 cpi R20,63
00C2 70F4 brsh L24
00C4 .dbline 111
00C4 .dbline 112
00C4 ; LCD0_write_com(y | 0xB8);
00C4 0A2D mov R16,R10
00C6 086B ori R16,184
00C8 B5DF xcall _LCD0_write_com
00CA .dbline 113
00CA ; LCD0_write_com(x | 0x40);
00CA 042F mov R16,R20
00CC 0064 ori R16,64
00CE B2DF xcall _LCD0_write_com
00D0 .dbline 114
00D0 ; }
00D0 07C0 xjmp L24
00D2 L23:
00D2 .dbline 115
00D2 ; while (x < x1) {
00D2 .dbline 116
00D2 ; LCD0_write_data(0x00);
00D2 0027 clr R16
00D4 CFDF xcall _LCD0_write_data
00D6 .dbline 117
00D6 ; x ++;
00D6 4395 inc R20
00D8 .dbline 118
00D8 ; if (x > 63) { /*判断地址是否越界*/
00D8 8FE3 ldi R24,63
00DA 8417 cp R24,R20
00DC 08F4 brsh L26
00DE .dbline 118
00DE .dbline 119
00DE ; break;
00DE 02C0 xjmp L25
00E0 L26:
00E0 .dbline 121
00E0 L24:
00E0 .dbline 115
00E0 4617 cp R20,R22
00E2 B8F3 brlo L23
00E4 L25:
00E4 .dbline 122
00E4 ; }
00E4 ; }
00E4 ; if (x < x1) { /*地址进入左半屏范围*/
00E4 4617 cp R20,R22
00E6 50F4 brsh L31
00E8 .dbline 122
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -