📄 lcd_init.lis
字号:
.module lcd_init.c
.area text(rom, con, rel)
0000 .dbfile E:\icc\lcd\lcd_init.c
0000 .dbfunc e delay _delay fV
0000 ; n -> R16,R17
.even
0000 _delay::
0000 .dbline -1
0000 .dbline 40
0000 ; /*
0000 ; LCD12864液晶驱动模块
0000 ; */
0000 ; /*
0000 ; PG0---RS---4
0000 ; PG1---R/W--5
0000 ; PG2---EN---6
0000 ; PA0---DB0---7
0000 ; PA1---DB1---8
0000 ; PA2---DB2---9
0000 ; PA3---DB3---10
0000 ; PA4---DB4---11
0000 ; PA5---DB5---12
0000 ; PA6---DB6---13
0000 ; PA7---DB7---14
0000 ;
0000 ; */
0000 ; #include <iom128v.h>
0000 ; #include <macros.h>
0000 ;
0000 ;
0000 ; /*命令或是数据选择*/
0000 ; /*RS = 0命令,RS = 1数据*/
0000 ; #define RS_CLR PORTG&=~(1<<PG0)
0000 ; #define RS_SET PORTG|=(1<<PG0)
0000 ; /*读取或写入选择*/
0000 ; /*RW = 1读,RW = 0写*/
0000 ; #define RW_CLR PORTG&=~(1<<PG1)
0000 ; #define RW_SET PORTG|=(1<<PG1)
0000 ; /*读写使能信号*/
0000 ; /*下降沿有效*/
0000 ; #define EN_CLR PORTG&=~(1<<PG2)
0000 ; #define EN_SET PORTG|=(1<<PG2)
0000 ; /*芯片复位脚*/
0000 ; /*高电平复位
0000 ; #define RST_CLR PORTD&=~(1<<PD7)
0000 ; #define RST_SET PORTD|=(1<<PD7)*/
0000 ; //延时函数
0000 ; void delay (unsigned int n)
0000 ; {
0000 L2:
0000 .dbline 41
0000 L3:
0000 .dbline 41
0000 ; while(n--);
0000 1801 movw R2,R16
0002 0150 subi R16,1
0004 1040 sbci R17,0
0006 2220 tst R2
0008 D9F7 brne L2
000A 3320 tst R3
000C C9F7 brne L2
000E X0:
000E .dbline -2
000E L1:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbsym r n 16 i
0010 .dbend
0010 .dbfunc e chk_busy _chk_busy fV
.even
0010 _chk_busy::
0010 .dbline -1
0010 .dbline 44
0010 ; }
0010 ; void chk_busy(void)
0010 ; {
0010 .dbline 45
0010 ; PORTA=0XFF;
0010 8FEF ldi R24,255
0012 8BBB out 0x1b,R24
0014 .dbline 46
0014 ; RS_CLR;
0014 80916500 lds R24,101
0018 8E7F andi R24,254
001A 80936500 sts 101,R24
001E .dbline 47
001E ; RW_SET;
001E 80916500 lds R24,101
0022 8260 ori R24,2
0024 80936500 sts 101,R24
0028 .dbline 49
0028 ;
0028 ; DDRA=0X00;
0028 2224 clr R2
002A 2ABA out 0x1a,R2
002C .dbline 51
002C ;
002C ; EN_SET;
002C 80916500 lds R24,101
0030 8460 ori R24,4
0032 80936500 sts 101,R24
0036 L6:
0036 .dbline 52
0036 L7:
0036 .dbline 52
0036 ; while(PINA&0X80);
0036 CF99 sbic 0x19,7
0038 FECF rjmp L6
003A .dbline 53
003A ; EN_CLR;
003A 80916500 lds R24,101
003E 8B7F andi R24,251
0040 80936500 sts 101,R24
0044 .dbline 54
0044 ; DDRA=0XFF;
0044 8FEF ldi R24,255
0046 8ABB out 0x1a,R24
0048 .dbline -2
0048 L5:
0048 .dbline 0 ; func end
0048 0895 ret
004A .dbend
004A .dbfunc e LCD_write_code _LCD_write_code fV
004A ; code -> R20
.even
004A _LCD_write_code::
004A 0E940000 xcall push_gset1
004E 402F mov R20,R16
0050 .dbline -1
0050 .dbline 58
0050 ; }
0050 ; //显示屏命令写入函数
0050 ; void LCD_write_code(unsigned char code)
0050 ; {
0050 .dbline 59
0050 ; chk_busy();
0050 DFDF xcall _chk_busy
0052 .dbline 60
0052 ; RS_CLR;
0052 80916500 lds R24,101
0056 8E7F andi R24,254
0058 80936500 sts 101,R24
005C .dbline 61
005C ; RW_CLR;
005C 80916500 lds R24,101
0060 8D7F andi R24,253
0062 80936500 sts 101,R24
0066 .dbline 62
0066 ; PORTA=code;
0066 4BBB out 0x1b,R20
0068 .dbline 63
0068 ; EN_SET;
0068 80916500 lds R24,101
006C 8460 ori R24,4
006E 80936500 sts 101,R24
0072 .dbline 64
0072 ; delay(100);
0072 04E6 ldi R16,100
0074 10E0 ldi R17,0
0076 C4DF xcall _delay
0078 .dbline 65
0078 ; EN_CLR;
0078 80916500 lds R24,101
007C 8B7F andi R24,251
007E 80936500 sts 101,R24
0082 .dbline -2
0082 L9:
0082 0E940000 xcall pop_gset1
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbsym r code 20 c
0088 .dbend
0088 .dbfunc e LCD_write_data _LCD_write_data fV
0088 ; data -> R20
.even
0088 _LCD_write_data::
0088 0E940000 xcall push_gset1
008C 402F mov R20,R16
008E .dbline -1
008E .dbline 69
008E ; }
008E ; //显示屏数据显写入函数
008E ; void LCD_write_data(unsigned char data)
008E ; {
008E .dbline 70
008E ; chk_busy();
008E C0DF xcall _chk_busy
0090 .dbline 71
0090 ; RS_SET;
0090 80916500 lds R24,101
0094 8160 ori R24,1
0096 80936500 sts 101,R24
009A .dbline 72
009A ; RW_CLR;
009A 80916500 lds R24,101
009E 8D7F andi R24,253
00A0 80936500 sts 101,R24
00A4 .dbline 73
00A4 ; PORTA=data;
00A4 4BBB out 0x1b,R20
00A6 .dbline 74
00A6 ; EN_SET;
00A6 80916500 lds R24,101
00AA 8460 ori R24,4
00AC 80936500 sts 101,R24
00B0 .dbline 75
00B0 ; delay(100);
00B0 04E6 ldi R16,100
00B2 10E0 ldi R17,0
00B4 A5DF xcall _delay
00B6 .dbline 76
00B6 ; EN_CLR;
00B6 80916500 lds R24,101
00BA 8B7F andi R24,251
00BC 80936500 sts 101,R24
00C0 .dbline -2
00C0 L10:
00C0 0E940000 xcall pop_gset1
00C4 .dbline 0 ; func end
00C4 0895 ret
00C6 .dbsym r data 20 c
00C6 .dbend
00C6 .dbfunc e disp_char _disp_char fV
00C6 ; asii -> R20
00C6 ; position -> R22
.even
00C6 _disp_char::
00C6 0E940000 xcall push_gset2
00CA 422F mov R20,R18
00CC 602F mov R22,R16
00CE .dbline -1
00CE .dbline 80
00CE ; }
00CE ; /*单个字符输入函数;position--显示位置,data--显示内容*/
00CE ; void disp_char(unsigned char position,unsigned char asii)
00CE ; {
00CE .dbline 81
00CE ; LCD_write_code(position);
00CE 062F mov R16,R22
00D0 BCDF xcall _LCD_write_code
00D2 .dbline 82
00D2 ; LCD_write_data(asii);
00D2 042F mov R16,R20
00D4 D9DF xcall _LCD_write_data
00D6 .dbline -2
00D6 L11:
00D6 0E940000 xcall pop_gset2
00DA .dbline 0 ; func end
00DA 0895 ret
00DC .dbsym r asii 20 c
00DC .dbsym r position 22 c
00DC .dbend
00DC .dbfunc e disp_word _disp_word fV
00DC ; word -> R20,R21
00DC ; position -> R22
.even
00DC _disp_word::
00DC 0E940000 xcall push_gset2
00E0 A901 movw R20,R18
00E2 602F mov R22,R16
00E4 .dbline -1
00E4 .dbline 97
00E4 ; }
00E4 ; /*一串字符输入函数
00E4 ; void disp_char_str(unsigned char position,unsigned char *str)
00E4 ; {
00E4 ; LCD_write_code(position);
00E4 ; while(*str!=0) //含义???
00E4 ; {
00E4 ;
00E4 ; LCD_write_data(*str);
00E4 ; str++;
00E4 ; }
00E4 ; }*/
00E4 ; /*汉字输入*/
00E4 ; void disp_word(unsigned char position,unsigned char *word)
00E4 ; {
00E4 .dbline 98
00E4 ; LCD_write_code(position);//要显示的位置
00E4 062F mov R16,R22
00E6 B1DF xcall _LCD_write_code
00E8 05C0 xjmp L14
00EA L13:
00EA .dbline 100
00EA .dbline 101
00EA FA01 movw R30,R20
00EC 0081 ldd R16,z+0
00EE CCDF xcall _LCD_write_data
00F0 .dbline 102
00F0 4F5F subi R20,255 ; offset = 1
00F2 5F4F sbci R21,255
00F4 .dbline 103
00F4 L14:
00F4 .dbline 99
00F4 ; while(*word!=0)
00F4 FA01 movw R30,R20
00F6 2080 ldd R2,z+0
00F8 2220 tst R2
00FA B9F7 brne L13
00FC .dbline -2
00FC L12:
00FC 0E940000 xcall pop_gset2
0100 .dbline 0 ; func end
0100 0895 ret
0102 .dbsym r word 20 pc
0102 .dbsym r position 22 c
0102 .dbend
0102 .dbfunc e disp_init _disp_init fV
.even
0102 _disp_init::
0102 .dbline -1
0102 .dbline 109
0102 ; {
0102 ; LCD_write_data(*word);
0102 ; word++;
0102 ; }
0102 ;
0102 ; }
0102 ;
0102 ; //显示屏初始化
0102 ; void disp_init(void)
0102 ; {
0102 .dbline 110
0102 ; DDRA=0XFF;
0102 8FEF ldi R24,255
0104 8ABB out 0x1a,R24
0106 .dbline 112
0106 ; //DDRD=(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
0106 ; DDRG=0XFF;
0106 80936400 sts 100,R24
010A .dbline 114
010A ;
010A ; LCD_write_code(0x30);//功能设定/*30---基本指令动作
010A 00E3 ldi R16,48
010C 9EDF xcall _LCD_write_code
010E .dbline 115
010E ; LCD_write_code(0x01);//清屏,地址指针指向00H
010E 01E0 ldi R16,1
0110 9CDF xcall _LCD_write_code
0112 .dbline 116
0112 ; LCD_write_code(0x06);//光标的移动方向
0112 06E0 ldi R16,6
0114 9ADF xcall _LCD_write_code
0116 .dbline 117
0116 ; LCD_write_code(0x0c);//光标反白显示--0x0f/*开显示,关游标
0116 0CE0 ldi R16,12
0118 98DF xcall _LCD_write_code
011A .dbline -2
011A L16:
011A .dbline 0 ; func end
011A 0895 ret
011C .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -