📄 lcd_1602_driver.lis
字号:
.module LCD_1602_Driver.c
.area data(ram, con, rel)
0000 _new::
0000 .blkb 1
.area idata
0000 20 .byte 32
.area data(ram, con, rel)
0001 .dbfile E:\刻录的\电子技术\项目\电池放电器\软件V2.0\LCD_1602_Driver.c
0001 .dbsym e new _new c
0001 _num::
0001 .blkb 2
.area idata
0001 0000 .word 0
.area data(ram, con, rel)
0003 .dbfile E:\刻录的\电子技术\项目\电池放电器\软件V2.0\LCD_1602_Driver.c
0003 .dbsym e num _num i
.area text(rom, con, rel)
0000 .dbfile E:\刻录的\电子技术\项目\电池放电器\软件V2.0\LCD_1602_Driver.c
0000 .dbfunc e LCD_init _LCD_init fV
.even
0000 _LCD_init::
0000 .dbline -1
0000 .dbline 21
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ; #include "discharge.h"
0000 ; #include "LCD_1602.h"
0000 ;
0000 ; unsigned char lcd_data[32];//32字节显存,记录LCD上显示的数据
0000 ; unsigned char data[32];//32字节缓存,保存将要写入LCD的数据
0000 ; unsigned char add;//显存地址标号
0000 ; unsigned char new=32;//显存标号
0000 ; unsigned int num=0;
0000 ; /**********************************************************
0000 ; TC1602B LCD DISPLAY
0000 ; 建立时间:2005年12月12号
0000 ; 修改日期:2005年12月12号
0000 ; LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
0000 ; 入命令
0000 ; LCD第一行显示寄存器地址:0X80-0X8F
0000 ; LCD第二行显示寄存器地址:0XC0-0XCF
0000 ; **********************************************************/
0000 ; void LCD_init(void)
0000 ; {
0000 .dbline 22
0000 ; LCD_EN_DDR|=LCD_EN;//设定该引脚方向为输出
0000 8E9A sbi 0x11,6
0002 .dbline 23
0002 ; LCD_RS_DDR|=LCD_RS;//设定该引脚方向为输出
0002 8F9A sbi 0x11,7
0004 .dbline 24
0004 ; LCD_D4_DDR|=LCD_D4;//设定数据口为输出
0004 8D9A sbi 0x11,5
0006 .dbline 25
0006 ; LCD_D5_DDR|=LCD_D5;//设定数据口为输出
0006 8C9A sbi 0x11,4
0008 .dbline 26
0008 ; LCD_D6_DDR|=LCD_D6;//设定数据口为输出
0008 8B9A sbi 0x11,3
000A .dbline 27
000A ; LCD_D7_DDR|=LCD_D7;//设定数据口为输出
000A 8A9A sbi 0x11,2
000C .dbline 29
000C ;
000C ; LCD_EN_PORT&=~LCD_EN;//EN设为低电平
000C 9698 cbi 0x12,6
000E .dbline 30
000E ; LCD_RS_PORT&=~LCD_RS;//RS设为低电平
000E 9798 cbi 0x12,7
0010 .dbline 31
0010 ; LCD_D4_PORT&=~LCD_D4;//数据口置低电平
0010 9598 cbi 0x12,5
0012 .dbline 32
0012 ; LCD_D5_PORT&=~LCD_D5;//数据口置低电平
0012 9498 cbi 0x12,4
0014 .dbline 33
0014 ; LCD_D6_PORT&=~LCD_D6;//数据口置低电平
0014 9398 cbi 0x12,3
0016 .dbline 34
0016 ; LCD_D7_PORT&=~LCD_D7;//数据口置低电平
0016 9298 cbi 0x12,2
0018 .dbline 36
0018 ;
0018 ; LCD_write_char(0,0x33); //4bit test
0018 23E3 ldi R18,51
001A 30E0 ldi R19,0
001C 0027 clr R16
001E 1127 clr R17
0020 2AD0 rcall _LCD_write_char
0022 .dbline 37
0022 ; delay_nms(25);
0022 09E1 ldi R16,25
0024 10E0 ldi R17,0
0026 00D0 rcall _delay_nms
0028 .dbline 38
0028 ; LCD_write_char(0,0x32);
0028 22E3 ldi R18,50
002A 30E0 ldi R19,0
002C 0027 clr R16
002E 1127 clr R17
0030 22D0 rcall _LCD_write_char
0032 .dbline 39
0032 ; delay_nms(15);
0032 0FE0 ldi R16,15
0034 10E0 ldi R17,0
0036 00D0 rcall _delay_nms
0038 .dbline 40
0038 ; LCD_write_char(0,0x28);
0038 28E2 ldi R18,40
003A 30E0 ldi R19,0
003C 0027 clr R16
003E 1127 clr R17
0040 1AD0 rcall _LCD_write_char
0042 .dbline 41
0042 ; delay_nms(15);
0042 0FE0 ldi R16,15
0044 10E0 ldi R17,0
0046 00D0 rcall _delay_nms
0048 .dbline 42
0048 ; LCD_write_char(0,0x0C); //显示开
0048 2CE0 ldi R18,12
004A 30E0 ldi R19,0
004C 0027 clr R16
004E 1127 clr R17
0050 12D0 rcall _LCD_write_char
0052 .dbline 43
0052 ; delay_nms(15);
0052 0FE0 ldi R16,15
0054 10E0 ldi R17,0
0056 00D0 rcall _delay_nms
0058 .dbline 44
0058 ; LCD_write_char(0,0x01); //显示清屏
0058 21E0 ldi R18,1
005A 30E0 ldi R19,0
005C 0027 clr R16
005E 1127 clr R17
0060 0AD0 rcall _LCD_write_char
0062 .dbline 45
0062 ; delay_nms(15);
0062 0FE0 ldi R16,15
0064 10E0 ldi R17,0
0066 00D0 rcall _delay_nms
0068 .dbline 46
0068 ; LCD_write_char(0,0x06); //显示光标移动设置
0068 26E0 ldi R18,6
006A 30E0 ldi R19,0
006C 0027 clr R16
006E 1127 clr R17
0070 02D0 rcall _LCD_write_char
0072 .dbline 47
0072 ; LCD_clear();
0072 64D0 rcall _LCD_clear
0074 .dbline -2
0074 L1:
0074 .dbline 0 ; func end
0074 0895 ret
0076 .dbend
0076 .dbfunc e LCD_write_char _LCD_write_char fV
0076 ; data -> R20,R21
0076 ; command -> R22,R23
.even
0076 _LCD_write_char::
0076 00D0 rcall push_gset2
0078 A901 movw R20,R18
007A B801 movw R22,R16
007C .dbline -1
007C .dbline 56
007C ; //LCD_init_CGRAM();
007C ; }
007C ; /*-----------------------------------------------------------------------
007C ; LCD_write_char : 写一个字节到LCD的函数
007C ; 编写日期 :2005-12-12
007C ; 最后修改日期 :2005-12-12
007C ; -----------------------------------------------------------------------*/
007C ; void LCD_write_char(unsigned command,unsigned data)
007C ; {
007C .dbline 57
007C ; if (command == 0)
007C 6030 cpi R22,0
007E 6707 cpc R22,R23
0080 11F4 brne L3
0082 X0:
0082 .dbline 58
0082 ; LCD_RS_PORT &= ~LCD_RS; //RS=0 写地址
0082 9798 cbi 0x12,7
0084 01C0 rjmp L4
0086 L3:
0086 .dbline 60
0086 ; else
0086 ; LCD_RS_PORT |= LCD_RS; //RS=1 写数据
0086 979A sbi 0x12,7
0088 L4:
0088 .dbline 62
0088 ;
0088 ; LCD_write_DATA_PORT(data);//写高4位
0088 042F mov R16,R20
008A 18D0 rcall _LCD_write_DATA_PORT
008C .dbline 63
008C ; LCD_write_DATA_PORT(data<<4);//写低4位
008C 042F mov R16,R20
008E 000F lsl R16
0090 111F rol R17
0092 000F lsl R16
0094 111F rol R17
0096 000F lsl R16
0098 111F rol R17
009A 000F lsl R16
009C 111F rol R17
009E 0ED0 rcall _LCD_write_DATA_PORT
00A0 .dbline 64
00A0 ; delay_nus(250);
00A0 0AEF ldi R16,250
00A2 10E0 ldi R17,0
00A4 00D0 rcall _delay_nus
00A6 .dbline 65
00A6 ; num++;//统计向LCD发送的字节数
00A6 80910100 lds R24,_num
00AA 90910200 lds R25,_num+1
00AE 0196 adiw R24,1
00B0 90930200 sts _num+1,R25
00B4 80930100 sts _num,R24
00B8 .dbline -2
00B8 L2:
00B8 00D0 rcall pop_gset2
00BA .dbline 0 ; func end
00BA 0895 ret
00BC .dbsym r data 20 i
00BC .dbsym r command 22 i
00BC .dbend
00BC .dbfunc e LCD_write_DATA_PORT _LCD_write_DATA_PORT fV
00BC ; data -> R20
.even
00BC _LCD_write_DATA_PORT::
00BC 00D0 rcall push_gset1
00BE 402F mov R20,R16
00C0 .dbline -1
00C0 .dbline 75
00C0 ; }
00C0 ; /*-----------------------------------------------------------------------
00C0 ; LCD_write_DATA_PORT : 写数据到LCD数据口函数
00C0 ;
00C0 ; 输入参数data :要写入的数据(仅高4位)
00C0 ; 编写日期 :2005-12-12
00C0 ; 最后修改日期 :2005-12-12
00C0 ; -----------------------------------------------------------------------*/
00C0 ; void LCD_write_DATA_PORT(unsigned char data)
00C0 ; {
00C0 .dbline 76
00C0 ; if((data>>4)%2)
00C0 12E0 ldi R17,2
00C2 042F mov R16,R20
00C4 0295 swap R16
00C6 0F70 andi R16,#0x0F
00C8 00D0 rcall mod8u
00CA 0023 tst R16
00CC 11F0 breq L6
00CE .dbline 77
00CE ; LCD_D4_PORT |=LCD_D4;
00CE 959A sbi 0x12,5
00D0 01C0 rjmp L7
00D2 L6:
00D2 .dbline 79
00D2 ; else
00D2 ; LCD_D4_PORT &=~LCD_D4;
00D2 9598 cbi 0x12,5
00D4 L7:
00D4 .dbline 81
00D4 ;
00D4 ; if((data>>5)%2)
00D4 12E0 ldi R17,2
00D6 042F mov R16,R20
00D8 0695 lsr R16
00DA 0695 lsr R16
00DC 0695 lsr R16
00DE 0695 lsr R16
00E0 0695 lsr R16
00E2 00D0 rcall mod8u
00E4 0023 tst R16
00E6 11F0 breq L8
00E8 .dbline 82
00E8 ; LCD_D5_PORT |=LCD_D5;
00E8 949A sbi 0x12,4
00EA 01C0 rjmp L9
00EC L8:
00EC .dbline 84
00EC ; else
00EC ; LCD_D5_PORT &=~LCD_D5;
00EC 9498 cbi 0x12,4
00EE L9:
00EE .dbline 86
00EE ;
00EE ; if((data>>6)%2)
00EE 12E0 ldi R17,2
00F0 042F mov R16,R20
00F2 0695 lsr R16
00F4 0695 lsr R16
00F6 0695 lsr R16
00F8 0695 lsr R16
00FA 0695 lsr R16
00FC 0695 lsr R16
00FE 00D0 rcall mod8u
0100 0023 tst R16
0102 11F0 breq L10
0104 .dbline 87
0104 ; LCD_D6_PORT |=LCD_D6;
0104 939A sbi 0x12,3
0106 01C0 rjmp L11
0108 L10:
0108 .dbline 89
0108 ; else
0108 ; LCD_D6_PORT &=~LCD_D6;
0108 9398 cbi 0x12,3
010A L11:
010A .dbline 91
010A ;
010A ; if((data>>7)%2)
010A 12E0 ldi R17,2
010C 042F mov R16,R20
010E 0695 lsr R16
0110 0695 lsr R16
0112 0695 lsr R16
0114 0695 lsr R16
0116 0695 lsr R16
0118 0695 lsr R16
011A 0695 lsr R16
011C 00D0 rcall mod8u
011E 0023 tst R16
0120 11F0 breq L12
0122 .dbline 92
0122 ; LCD_D7_PORT |=LCD_D7;
0122 929A sbi 0x12,2
0124 01C0 rjmp L13
0126 L12:
0126 .dbline 94
0126 ; else
0126 ; LCD_D7_PORT &=~LCD_D7;
0126 9298 cbi 0x12,2
0128 L13:
0128 .dbline 96
0128 ;
0128 ; LCD_EN_PORT |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD
0128 969A sbi 0x12,6
012A .dbline 97
012A ; delay_nus(25);
012A 09E1 ldi R16,25
012C 10E0 ldi R17,0
012E 00D0 rcall _delay_nus
0130 .dbline 98
0130 ; LCD_EN_PORT &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD
0130 9698 cbi 0x12,6
0132 .dbline 99
0132 ; delay_nus(25);
0132 09E1 ldi R16,25
0134 10E0 ldi R17,0
0136 00D0 rcall _delay_nus
0138 .dbline -2
0138 L5:
0138 00D0 rcall pop_gset1
013A .dbline 0 ; func end
013A 0895 ret
013C .dbsym r data 20 c
013C .dbend
013C .dbfunc e LCD_clear _LCD_clear fV
013C ; i -> R20
.even
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -