📄 lcd1602.s
字号:
.module LCD1602.C
.area text(rom, con, rel)
.dbfile E:\张秋伟\我的实验\数控电压源\LCD1602.C
.dbfunc e delay_ms _delay_ms fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_ms::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 25
; #include <iom16v.h>
; #include <macros.h>
; #include "delay.h"
; /*
; 数据口接PB口:PB0--DB0,PB1--DB1,.....PB7--DB7;
; 控制总线RS--PD3 RW--PD5 EN--PD4
;
; */
; #define LCDPORT PORTC
; #define LCDDDR DDRC
; #define LCDPIN PINC
;
; #define RS_CLR PORTA&= ~(1 << PA0)
; #define RS_SET PORTA |= (1 << PA0)
;
; #define RW_CLR PORTA &= ~(1 << PA1)
; #define RW_SET PORTA |= (1 << PA1)
;
; #define EN_CLR PORTA &= ~(1 << PA2)
; #define EN_SET PORTA |= (1 << PA2)
; #define Clear_Screen Write_Command(0x01)
;
;
; void delay_ms(unsigned int n)
; {
.dbline 27
clr R20
clr R21
xjmp L5
L2:
.dbline 27
xcall _delay_1ms
L3:
.dbline 27
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 27
; unsigned int i;
; for(i=0;i<n;i++)delay_1ms();
cp R20,R22
cpc R21,R23
brlo L2
.dbline -2
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e En_Toggle _En_Toggle fV
.even
_En_Toggle::
.dbline -1
.dbline 31
; }
;
; void En_Toggle()//产生一个使能脉冲
; {
.dbline 32
; EN_CLR; //拉低使能位,产生一个下降沿
cbi 0x1b,2
.dbline 33
; delay_ms(5);//保持低电平一定时间
ldi R16,5
ldi R17,0
xcall _delay_ms
.dbline 34
; EN_SET; //拉高使能位
sbi 0x1b,2
.dbline 35
; delay_ms(3);//保持高电平一定时间
ldi R16,3
ldi R17,0
xcall _delay_ms
.dbline 36
; EN_CLR; //拉低使能位,产生一个下降沿
cbi 0x1b,2
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Wait_Until_Ready _Wait_Until_Ready fV
.even
_Wait_Until_Ready::
.dbline -1
.dbline 41
; }
;
; /* 不断检测LCD的忙标志 (BF),直到其为0,表示可以执行下一条指令*/
; void Wait_Until_Ready(void)
; {
.dbline 42
; RW_SET; //设为读状态
sbi 0x1b,1
.dbline 43
; RS_CLR; //所读为状态位
cbi 0x1b,0
.dbline 44
; LCDDDR&=~(1<<DDD7);//单片机设为输入,用以读取LCD的忙标志
cbi 0x14,7
.dbline 45
; EN_SET;
sbi 0x1b,2
.dbline 46
; delay_ms(5);
ldi R16,5
ldi R17,0
xcall _delay_ms
L8:
.dbline 47
L9:
.dbline 47
; while((LCDPIN&0x80)==0x80) ; //不断循环,直至BF=0
in R2,0x13
clr R3
sbrc R2,7
rjmp L8
.dbline 48
; EN_CLR;
cbi 0x1b,2
.dbline 49
; LCDDDR|=(1<<DDD7);
sbi 0x14,7
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Write_Command _Write_Command fV
; Command -> R20
.even
_Write_Command::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 53
; }
;
; void Write_Command(unsigned char Command) //向LCD写入命令字
; {
.dbline 54
; RS_CLR; //写入的是命令
cbi 0x1b,0
.dbline 55
; RW_CLR; //置为写状态
cbi 0x1b,1
.dbline 56
; LCDDDR=0xFF;
ldi R24,255
out 0x14,R24
.dbline 57
; LCDPORT=Command; //写命令字
out 0x15,R20
.dbline 58
; delay_ms(2);
ldi R16,2
ldi R17,0
xcall _delay_ms
.dbline 59
; En_Toggle();
xcall _En_Toggle
.dbline 60
; Wait_Until_Ready(); //等待指令执行完毕
xcall _Wait_Until_Ready
.dbline -2
L11:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r Command 20 c
.dbend
.dbfunc e Write_Data _Write_Data fV
; Data -> R20,R21
.even
_Write_Data::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 64
; }
;
; void Write_Data(unsigned int Data)
; {
.dbline 65
; RS_SET;
sbi 0x1b,0
.dbline 66
; RW_CLR; //写入的是数据
cbi 0x1b,1
.dbline 67
; LCDDDR=0xFF;
ldi R24,255
out 0x14,R24
.dbline 68
; delay_ms(2);
ldi R16,2
ldi R17,0
xcall _delay_ms
.dbline 69
; LCDPORT=Data;
out 0x15,R20
.dbline 70
; En_Toggle();
xcall _En_Toggle
.dbline 71
; Wait_Until_Ready();
xcall _Wait_Until_Ready
.dbline -2
L12:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r Data 20 i
.dbend
.dbfunc e Write_Position _Write_Position fV
; p -> R20
; colum -> R22,R23
; row -> R20,R21
.even
_Write_Position::
xcall push_gset2
movw R22,R18
movw R20,R16
.dbline -1
.dbline 75
; }
;
; void Write_Position(unsigned int row,unsigned int colum)//设字符位置
; {
.dbline 77
; unsigned char p;
; if(row==1)
cpi R20,1
ldi R30,0
cpc R21,R30
brne L14
.dbline 78
; {
.dbline 79
; p=0x80+colum-1;
mov R20,R22
subi R20,128 ; offset = 128
sbci R21,255
subi R20,1
sbci R21,0
.dbline 80
; Write_Command(p);
mov R16,R20
xcall _Write_Command
.dbline 81
; }
xjmp L15
L14:
.dbline 83
.dbline 84
mov R20,R22
subi R20,64 ; offset = 192
sbci R21,255
subi R20,1
sbci R21,0
.dbline 85
mov R16,R20
xcall _Write_Command
.dbline 86
L15:
.dbline -2
L13:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r p 20 c
.dbsym r colum 22 i
.dbsym r row 20 i
.dbend
.dbfunc e Write_String _Write_String fV
; s -> R20,R21
.even
_Write_String::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 90
; else
; {
; p=0xC0+colum-1;
; Write_Command(p);
; }
; }
;
; void Write_String(char *s)//写入字符串
; {
.dbline 91
; for(;*s!='\0';s++)
xjmp L20
L17:
.dbline 92
movw R30,R20
ldd R16,z+0
clr R17
xcall _Write_Data
L18:
.dbline 91
subi R20,255 ; offset = 1
sbci R21,255
L20:
.dbline 91
movw R30,R20
ldd R2,z+0
tst R2
brne L17
.dbline -2
L16:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r s 20 pc
.dbend
.dbfunc e Initialize_LCD _Initialize_LCD fV
.even
_Initialize_LCD::
.dbline -1
.dbline 95
; Write_Data(*s);
; }
; void Initialize_LCD(void)
; {
.dbline 96
; CLI(); //禁止所有中断
cli
.dbline 97
; PORTA=0x00;
clr R2
out 0x1b,R2
.dbline 98
; DDRA=0X07;
ldi R24,7
out 0x1a,R24
.dbline 99
; LCDPORT=0x00;
out 0x15,R2
.dbline 100
; LCDDDR=0xFF;
ldi R24,255
out 0x14,R24
.dbline 101
; Write_Command(0X38);
ldi R16,56
xcall _Write_Command
.dbline 102
; Write_Command(0x06);
ldi R16,6
xcall _Write_Command
.dbline 103
; Write_Command(0x0c);
ldi R16,12
xcall _Write_Command
.dbline 104
; Clear_Screen;
ldi R16,1
xcall _Write_Command
.dbline 105
; SEI();//开全局中断
sei
.dbline -2
L21:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -