📄 lcd1602.lis
字号:
.module LCD1602.C
.area text(rom, con, rel)
0000 .dbfile E:\张秋伟\我的实验\数控电压源\LCD1602.C
0000 .dbfunc e delay_ms _delay_ms fV
0000 ; i -> R20,R21
0000 ; n -> R22,R23
.even
0000 _delay_ms::
0000 0E940000 xcall push_gset2
0004 B801 movw R22,R16
0006 .dbline -1
0006 .dbline 25
0006 ; #include <iom16v.h>
0006 ; #include <macros.h>
0006 ; #include "delay.h"
0006 ; /*
0006 ; 数据口接PB口:PB0--DB0,PB1--DB1,.....PB7--DB7;
0006 ; 控制总线RS--PD3 RW--PD5 EN--PD4
0006 ;
0006 ; */
0006 ; #define LCDPORT PORTC
0006 ; #define LCDDDR DDRC
0006 ; #define LCDPIN PINC
0006 ;
0006 ; #define RS_CLR PORTA&= ~(1 << PA0)
0006 ; #define RS_SET PORTA |= (1 << PA0)
0006 ;
0006 ; #define RW_CLR PORTA &= ~(1 << PA1)
0006 ; #define RW_SET PORTA |= (1 << PA1)
0006 ;
0006 ; #define EN_CLR PORTA &= ~(1 << PA2)
0006 ; #define EN_SET PORTA |= (1 << PA2)
0006 ; #define Clear_Screen Write_Command(0x01)
0006 ;
0006 ;
0006 ; void delay_ms(unsigned int n)
0006 ; {
0006 .dbline 27
0006 4427 clr R20
0008 5527 clr R21
000A 04C0 xjmp L5
000C L2:
000C .dbline 27
000C 0E940000 xcall _delay_1ms
0010 L3:
0010 .dbline 27
0010 4F5F subi R20,255 ; offset = 1
0012 5F4F sbci R21,255
0014 L5:
0014 .dbline 27
0014 ; unsigned int i;
0014 ; for(i=0;i<n;i++)delay_1ms();
0014 4617 cp R20,R22
0016 5707 cpc R21,R23
0018 C8F3 brlo L2
001A .dbline -2
001A L1:
001A 0E940000 xcall pop_gset2
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbsym r i 20 i
0020 .dbsym r n 22 i
0020 .dbend
0020 .dbfunc e En_Toggle _En_Toggle fV
.even
0020 _En_Toggle::
0020 .dbline -1
0020 .dbline 31
0020 ; }
0020 ;
0020 ; void En_Toggle()//产生一个使能脉冲
0020 ; {
0020 .dbline 32
0020 ; EN_CLR; //拉低使能位,产生一个下降沿
0020 DA98 cbi 0x1b,2
0022 .dbline 33
0022 ; delay_ms(5);//保持低电平一定时间
0022 05E0 ldi R16,5
0024 10E0 ldi R17,0
0026 ECDF xcall _delay_ms
0028 .dbline 34
0028 ; EN_SET; //拉高使能位
0028 DA9A sbi 0x1b,2
002A .dbline 35
002A ; delay_ms(3);//保持高电平一定时间
002A 03E0 ldi R16,3
002C 10E0 ldi R17,0
002E E8DF xcall _delay_ms
0030 .dbline 36
0030 ; EN_CLR; //拉低使能位,产生一个下降沿
0030 DA98 cbi 0x1b,2
0032 .dbline -2
0032 L6:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbend
0034 .dbfunc e Wait_Until_Ready _Wait_Until_Ready fV
.even
0034 _Wait_Until_Ready::
0034 .dbline -1
0034 .dbline 41
0034 ; }
0034 ;
0034 ; /* 不断检测LCD的忙标志 (BF),直到其为0,表示可以执行下一条指令*/
0034 ; void Wait_Until_Ready(void)
0034 ; {
0034 .dbline 42
0034 ; RW_SET; //设为读状态
0034 D99A sbi 0x1b,1
0036 .dbline 43
0036 ; RS_CLR; //所读为状态位
0036 D898 cbi 0x1b,0
0038 .dbline 44
0038 ; LCDDDR&=~(1<<DDD7);//单片机设为输入,用以读取LCD的忙标志
0038 A798 cbi 0x14,7
003A .dbline 45
003A ; EN_SET;
003A DA9A sbi 0x1b,2
003C .dbline 46
003C ; delay_ms(5);
003C 05E0 ldi R16,5
003E 10E0 ldi R17,0
0040 DFDF xcall _delay_ms
0042 L8:
0042 .dbline 47
0042 L9:
0042 .dbline 47
0042 ; while((LCDPIN&0x80)==0x80) ; //不断循环,直至BF=0
0042 23B2 in R2,0x13
0044 3324 clr R3
0046 27FC sbrc R2,7
0048 FCCF rjmp L8
004A .dbline 48
004A ; EN_CLR;
004A DA98 cbi 0x1b,2
004C .dbline 49
004C ; LCDDDR|=(1<<DDD7);
004C A79A sbi 0x14,7
004E .dbline -2
004E L7:
004E .dbline 0 ; func end
004E 0895 ret
0050 .dbend
0050 .dbfunc e Write_Command _Write_Command fV
0050 ; Command -> R20
.even
0050 _Write_Command::
0050 0E940000 xcall push_gset1
0054 402F mov R20,R16
0056 .dbline -1
0056 .dbline 53
0056 ; }
0056 ;
0056 ; void Write_Command(unsigned char Command) //向LCD写入命令字
0056 ; {
0056 .dbline 54
0056 ; RS_CLR; //写入的是命令
0056 D898 cbi 0x1b,0
0058 .dbline 55
0058 ; RW_CLR; //置为写状态
0058 D998 cbi 0x1b,1
005A .dbline 56
005A ; LCDDDR=0xFF;
005A 8FEF ldi R24,255
005C 84BB out 0x14,R24
005E .dbline 57
005E ; LCDPORT=Command; //写命令字
005E 45BB out 0x15,R20
0060 .dbline 58
0060 ; delay_ms(2);
0060 02E0 ldi R16,2
0062 10E0 ldi R17,0
0064 CDDF xcall _delay_ms
0066 .dbline 59
0066 ; En_Toggle();
0066 DCDF xcall _En_Toggle
0068 .dbline 60
0068 ; Wait_Until_Ready(); //等待指令执行完毕
0068 E5DF xcall _Wait_Until_Ready
006A .dbline -2
006A L11:
006A 0E940000 xcall pop_gset1
006E .dbline 0 ; func end
006E 0895 ret
0070 .dbsym r Command 20 c
0070 .dbend
0070 .dbfunc e Write_Data _Write_Data fV
0070 ; Data -> R20,R21
.even
0070 _Write_Data::
0070 0E940000 xcall push_gset1
0074 A801 movw R20,R16
0076 .dbline -1
0076 .dbline 64
0076 ; }
0076 ;
0076 ; void Write_Data(unsigned int Data)
0076 ; {
0076 .dbline 65
0076 ; RS_SET;
0076 D89A sbi 0x1b,0
0078 .dbline 66
0078 ; RW_CLR; //写入的是数据
0078 D998 cbi 0x1b,1
007A .dbline 67
007A ; LCDDDR=0xFF;
007A 8FEF ldi R24,255
007C 84BB out 0x14,R24
007E .dbline 68
007E ; delay_ms(2);
007E 02E0 ldi R16,2
0080 10E0 ldi R17,0
0082 BEDF xcall _delay_ms
0084 .dbline 69
0084 ; LCDPORT=Data;
0084 45BB out 0x15,R20
0086 .dbline 70
0086 ; En_Toggle();
0086 CCDF xcall _En_Toggle
0088 .dbline 71
0088 ; Wait_Until_Ready();
0088 D5DF xcall _Wait_Until_Ready
008A .dbline -2
008A L12:
008A 0E940000 xcall pop_gset1
008E .dbline 0 ; func end
008E 0895 ret
0090 .dbsym r Data 20 i
0090 .dbend
0090 .dbfunc e Write_Position _Write_Position fV
0090 ; p -> R20
0090 ; colum -> R22,R23
0090 ; row -> R20,R21
.even
0090 _Write_Position::
0090 0E940000 xcall push_gset2
0094 B901 movw R22,R18
0096 A801 movw R20,R16
0098 .dbline -1
0098 .dbline 75
0098 ; }
0098 ;
0098 ; void Write_Position(unsigned int row,unsigned int colum)//设字符位置
0098 ; {
0098 .dbline 77
0098 ; unsigned char p;
0098 ; if(row==1)
0098 4130 cpi R20,1
009A E0E0 ldi R30,0
009C 5E07 cpc R21,R30
009E 41F4 brne L14
00A0 .dbline 78
00A0 ; {
00A0 .dbline 79
00A0 ; p=0x80+colum-1;
00A0 462F mov R20,R22
00A2 4058 subi R20,128 ; offset = 128
00A4 5F4F sbci R21,255
00A6 4150 subi R20,1
00A8 5040 sbci R21,0
00AA .dbline 80
00AA ; Write_Command(p);
00AA 042F mov R16,R20
00AC D1DF xcall _Write_Command
00AE .dbline 81
00AE ; }
00AE 07C0 xjmp L15
00B0 L14:
00B0 .dbline 83
00B0 .dbline 84
00B0 462F mov R20,R22
00B2 4054 subi R20,64 ; offset = 192
00B4 5F4F sbci R21,255
00B6 4150 subi R20,1
00B8 5040 sbci R21,0
00BA .dbline 85
00BA 042F mov R16,R20
00BC C9DF xcall _Write_Command
00BE .dbline 86
00BE L15:
00BE .dbline -2
00BE L13:
00BE 0E940000 xcall pop_gset2
00C2 .dbline 0 ; func end
00C2 0895 ret
00C4 .dbsym r p 20 c
00C4 .dbsym r colum 22 i
00C4 .dbsym r row 20 i
00C4 .dbend
00C4 .dbfunc e Write_String _Write_String fV
00C4 ; s -> R20,R21
.even
00C4 _Write_String::
00C4 0E940000 xcall push_gset1
00C8 A801 movw R20,R16
00CA .dbline -1
00CA .dbline 90
00CA ; else
00CA ; {
00CA ; p=0xC0+colum-1;
00CA ; Write_Command(p);
00CA ; }
00CA ; }
00CA ;
00CA ; void Write_String(char *s)//写入字符串
00CA ; {
00CA .dbline 91
00CA ; for(;*s!='\0';s++)
00CA 06C0 xjmp L20
00CC L17:
00CC .dbline 92
00CC FA01 movw R30,R20
00CE 0081 ldd R16,z+0
00D0 1127 clr R17
00D2 CEDF xcall _Write_Data
00D4 L18:
00D4 .dbline 91
00D4 4F5F subi R20,255 ; offset = 1
00D6 5F4F sbci R21,255
00D8 L20:
00D8 .dbline 91
00D8 FA01 movw R30,R20
00DA 2080 ldd R2,z+0
00DC 2220 tst R2
00DE B1F7 brne L17
00E0 .dbline -2
00E0 L16:
00E0 0E940000 xcall pop_gset1
00E4 .dbline 0 ; func end
00E4 0895 ret
00E6 .dbsym r s 20 pc
00E6 .dbend
00E6 .dbfunc e Initialize_LCD _Initialize_LCD fV
.even
00E6 _Initialize_LCD::
00E6 .dbline -1
00E6 .dbline 95
00E6 ; Write_Data(*s);
00E6 ; }
00E6 ; void Initialize_LCD(void)
00E6 ; {
00E6 .dbline 96
00E6 ; CLI(); //禁止所有中断
00E6 F894 cli
00E8 .dbline 97
00E8 ; PORTA=0x00;
00E8 2224 clr R2
00EA 2BBA out 0x1b,R2
00EC .dbline 98
00EC ; DDRA=0X07;
00EC 87E0 ldi R24,7
00EE 8ABB out 0x1a,R24
00F0 .dbline 99
00F0 ; LCDPORT=0x00;
00F0 25BA out 0x15,R2
00F2 .dbline 100
00F2 ; LCDDDR=0xFF;
00F2 8FEF ldi R24,255
00F4 84BB out 0x14,R24
00F6 .dbline 101
00F6 ; Write_Command(0X38);
00F6 08E3 ldi R16,56
00F8 ABDF xcall _Write_Command
00FA .dbline 102
00FA ; Write_Command(0x06);
00FA 06E0 ldi R16,6
00FC A9DF xcall _Write_Command
00FE .dbline 103
00FE ; Write_Command(0x0c);
00FE 0CE0 ldi R16,12
0100 A7DF xcall _Write_Command
0102 .dbline 104
0102 ; Clear_Screen;
0102 01E0 ldi R16,1
0104 A5DF xcall _Write_Command
0106 .dbline 105
0106 ; SEI();//开全局中断
0106 7894 sei
0108 .dbline -2
0108 L21:
0108 .dbline 0 ; func end
0108 0895 ret
010A .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -