📄 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:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\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:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
0003 .dbsym e num _num i
.area text(rom, con, rel)
0000 .dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\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 "LCD_1602.h"
0000 ; void delay_nms(unsigned int n);
0000 ; void delay_nus(unsigned int n);
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 2ED0 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 26D0 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 1ED0 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 16D0 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 0ED0 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 06D0 rcall _LCD_write_char
0072 .dbline 47
0072 ; LCD_clear();
0072 68D0 rcall _LCD_clear
0074 .dbline 48
0074 ; delay_nms(10);
0074 0AE0 ldi R16,10
0076 10E0 ldi R17,0
0078 00D0 rcall _delay_nms
007A .dbline 49
007A ; LCD_init_CGRAM();
007A 2DD3 rcall _LCD_init_CGRAM
007C .dbline -2
007C L1:
007C .dbline 0 ; func end
007C 0895 ret
007E .dbend
007E .dbfunc e LCD_write_char _LCD_write_char fV
007E ; data -> R20,R21
007E ; command -> R22,R23
.even
007E _LCD_write_char::
007E 00D0 rcall push_gset2
0080 A901 movw R20,R18
0082 B801 movw R22,R16
0084 .dbline -1
0084 .dbline 57
0084 ; }
0084 ; /*-----------------------------------------------------------------------
0084 ; LCD_write_char : 写一个字节到LCD的函数
0084 ; 编写日期 :2005-12-12
0084 ; 最后修改日期 :2005-12-12
0084 ; -----------------------------------------------------------------------*/
0084 ; void LCD_write_char(unsigned command,unsigned data)
0084 ; {
0084 .dbline 58
0084 ; if (command == 0)
0084 6030 cpi R22,0
0086 6707 cpc R22,R23
0088 11F4 brne L3
008A X0:
008A .dbline 59
008A ; LCD_RS_PORT &= ~LCD_RS; //RS=0 写地址
008A 9798 cbi 0x12,7
008C 01C0 rjmp L4
008E L3:
008E .dbline 61
008E ; else
008E ; LCD_RS_PORT |= LCD_RS; //RS=1 写数据
008E 979A sbi 0x12,7
0090 L4:
0090 .dbline 63
0090 ;
0090 ; LCD_write_DATA_PORT(data);//写高4位
0090 042F mov R16,R20
0092 18D0 rcall _LCD_write_DATA_PORT
0094 .dbline 64
0094 ; LCD_write_DATA_PORT(data<<4);//写低4位
0094 042F mov R16,R20
0096 000F lsl R16
0098 111F rol R17
009A 000F lsl R16
009C 111F rol R17
009E 000F lsl R16
00A0 111F rol R17
00A2 000F lsl R16
00A4 111F rol R17
00A6 0ED0 rcall _LCD_write_DATA_PORT
00A8 .dbline 65
00A8 ; delay_nus(250);
00A8 0AEF ldi R16,250
00AA 10E0 ldi R17,0
00AC 00D0 rcall _delay_nus
00AE .dbline 66
00AE ; num++;//统计向LCD发送的字节数
00AE 80910100 lds R24,_num
00B2 90910200 lds R25,_num+1
00B6 0196 adiw R24,1
00B8 90930200 sts _num+1,R25
00BC 80930100 sts _num,R24
00C0 .dbline -2
00C0 L2:
00C0 00D0 rcall pop_gset2
00C2 .dbline 0 ; func end
00C2 0895 ret
00C4 .dbsym r data 20 i
00C4 .dbsym r command 22 i
00C4 .dbend
00C4 .dbfunc e LCD_write_DATA_PORT _LCD_write_DATA_PORT fV
00C4 ; data -> R20
.even
00C4 _LCD_write_DATA_PORT::
00C4 00D0 rcall push_gset1
00C6 402F mov R20,R16
00C8 .dbline -1
00C8 .dbline 76
00C8 ; }
00C8 ; /*-----------------------------------------------------------------------
00C8 ; LCD_write_DATA_PORT : 写数据到LCD数据口函数
00C8 ;
00C8 ; 输入参数data :要写入的数据(仅高4位)
00C8 ; 编写日期 :2005-12-12
00C8 ; 最后修改日期 :2005-12-12
00C8 ; -----------------------------------------------------------------------*/
00C8 ; void LCD_write_DATA_PORT(unsigned char data)
00C8 ; {
00C8 .dbline 77
00C8 ; if((data>>4)%2)
00C8 12E0 ldi R17,2
00CA 042F mov R16,R20
00CC 0295 swap R16
00CE 0F70 andi R16,#0x0F
00D0 00D0 rcall mod8u
00D2 0023 tst R16
00D4 11F0 breq L6
00D6 .dbline 78
00D6 ; LCD_D4_PORT |=LCD_D4;
00D6 959A sbi 0x12,5
00D8 01C0 rjmp L7
00DA L6:
00DA .dbline 80
00DA ; else
00DA ; LCD_D4_PORT &=~LCD_D4;
00DA 9598 cbi 0x12,5
00DC L7:
00DC .dbline 82
00DC ;
00DC ; if((data>>5)%2)
00DC 12E0 ldi R17,2
00DE 042F mov R16,R20
00E0 0695 lsr R16
00E2 0695 lsr R16
00E4 0695 lsr R16
00E6 0695 lsr R16
00E8 0695 lsr R16
00EA 00D0 rcall mod8u
00EC 0023 tst R16
00EE 11F0 breq L8
00F0 .dbline 83
00F0 ; LCD_D5_PORT |=LCD_D5;
00F0 949A sbi 0x12,4
00F2 01C0 rjmp L9
00F4 L8:
00F4 .dbline 85
00F4 ; else
00F4 ; LCD_D5_PORT &=~LCD_D5;
00F4 9498 cbi 0x12,4
00F6 L9:
00F6 .dbline 87
00F6 ;
00F6 ; if((data>>6)%2)
00F6 12E0 ldi R17,2
00F8 042F mov R16,R20
00FA 0695 lsr R16
00FC 0695 lsr R16
00FE 0695 lsr R16
0100 0695 lsr R16
0102 0695 lsr R16
0104 0695 lsr R16
0106 00D0 rcall mod8u
0108 0023 tst R16
010A 11F0 breq L10
010C .dbline 88
010C ; LCD_D6_PORT |=LCD_D6;
010C 939A sbi 0x12,3
010E 01C0 rjmp L11
0110 L10:
0110 .dbline 90
0110 ; else
0110 ; LCD_D6_PORT &=~LCD_D6;
0110 9398 cbi 0x12,3
0112 L11:
0112 .dbline 92
0112 ;
0112 ; if((data>>7)%2)
0112 12E0 ldi R17,2
0114 042F mov R16,R20
0116 0695 lsr R16
0118 0695 lsr R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -