📄 lcd1602pbpd.s
字号:
; ----------------------------------------------------------------------
; 对外函数说明:
;
; ----------------------------------------------------------------------
; 10101010101010101010101010101010101010101010101010101010101010101010*/
;
; #ifndef LCD1602_H
; #define LCD1602_H
;
; #include "D:\ICC_H\CmmICC.H"
;
; /* 待定参数 */
; #define DELAY() {NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();}
;
; /* 不考虑移植性的写法 */
; //uint8 bdata bdat;
; //sbit bdat0=bdat^0;
; //sbit bdat1=bdat^1;
; //sbit bdat2=bdat^2;
; //sbit bdat3=bdat^3;
; //sbit bdat4=bdat^4;
; //sbit bdat5=bdat^5;
; //sbit bdat6=bdat^6;
; //sbit bdat7=bdat^7;
; /* 考虑移植性的写法 */
; uint8 bdat;
; #define bdat0 (bdat&0x01)
; #define bdat1 (bdat&0x02)
; #define bdat2 (bdat&0x04)
; #define bdat3 (bdat&0x08)
; #define bdat4 (bdat&0x10)
; #define bdat5 (bdat&0x20)
; #define bdat6 (bdat&0x40)
; #define bdat7 (bdat&0x80)
;
; #define CGRAM0 0x00
; #define CGRAM1 0x01
; #define CGRAM2 0x02
; #define CGRAM3 0x03
; #define CGRAM4 0x04
; #define CGRAM5 0x05
; #define CGRAM6 0x06
; #define CGRAM7 0x07
;
; #define TRUE 1
; #define FALSE 0
; bool LCD1602Err = FALSE;
;
; /*--------------------------------------------------------------------
; 函数名称:LCD1602读读读读读忙~
; 函数功能:都说是读读读读读忙咯~
; 注意事项:对于高速CPU,应加延时,好像是废话~
; 提示说明:无
; 输 入:
; 返 回:无
; --------------------------------------------------------------------*/
; void busy(void)
; {
; uint16 busyCounter=0;
clr R16
clr R17
; bool busySta; //用于探测 lcd busy status
; IN_BF;
cbi 0x11,7
; SET_D4;
sbi 0x12,4
; SET_D5;
sbi 0x12,5
; SET_D6;
sbi 0x12,6
; SET_D7;
sbi 0x12,7
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; CLR_RS;
cbi 0x18,5
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; SET_RW;
sbi 0x18,6
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
L122:
;
; do
; {
; SET_E;
sbi 0x18,7
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; /* 这里读取AC4-AC6位及BF的值,程序不需记录AC4-AC6的值,所以不存储 */
; busySta=(bool)GET_BF;
in R18,0x10
clr R19
andi R18,128
andi R19,0
; CLR_E;
cbi 0x18,7
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; /* 读取 "BUSY"时,"D4-D7"状态可能已经改变,必须再次设为输出"1" */
; SET_D4;
sbi 0x12,4
; SET_D5;
sbi 0x12,5
; SET_D6;
sbi 0x12,6
; SET_D7;
sbi 0x12,7
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; SET_E;
sbi 0x18,7
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; /* 这里读取AC0-AC3位的值,程序不需记录AC0-AC3的值,所以不存储 */
; CLR_E;
cbi 0x18,7
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; if(busyCounter==1000)
cpi R16,232
ldi R30,3
cpc R17,R30
brne L125
X44:
; {
; LCD1602Err=TRUE; //标识LCD1602错误,方便上缴系统报错
ldi R24,1
sts _LCD1602Err,R24
; return ; //避免由于LCD1602错误而导致程序阻塞
xjmp L121
L125:
; }
; busyCounter++;
subi R16,255 ; offset = 1
sbci R17,255
; }
L123:
; while(busySta);
tst R18
breq X46
xjmp L122
X46:
X45:
;
; LCD1602Err=FALSE;
clr R2
sts _LCD1602Err,R2
; CLR_E;
cbi 0x18,7
; OUT_BF;
sbi 0x11,7
L121:
.dbline 0 ; func end
ret
; dat -> R12
; flag -> R10
.even
_write::
st -y,R10
st -y,R12
mov R12,R18
mov R10,R16
; }
; /*--------------------------------------------------------------------
; 函数名称:LCD1602写操作
; 函数功能:
; 注意事项:对于高速CPU,应加延时,好像是废话~
; 提示说明:无
; 输 入:
; 返 回:无
; --------------------------------------------------------------------*/
; void write(bool flag,uint8 dat) //flag=0:command,flag=1:data
; {
; bdat=dat;
sts _bdat,R12
; busy();
xcall _busy
; if(flag)
tst R10
breq L128
X47:
; SET_RS;
sbi 0x18,5
xjmp L129
L128:
; else
; CLR_RS;
cbi 0x18,5
L129:
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; CLR_RW;
cbi 0x18,6
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; if(bdat4)
lds R2,_bdat
sbrs R2,4
rjmp L130
X48:
; SET_D4;
sbi 0x12,4
xjmp L131
L130:
; else
; CLR_D4;
cbi 0x12,4
L131:
; if(bdat5)
lds R2,_bdat
sbrs R2,5
rjmp L132
X49:
; SET_D5;
sbi 0x12,5
xjmp L133
L132:
; else
; CLR_D5;
cbi 0x12,5
L133:
; if(bdat6)
lds R2,_bdat
sbrs R2,6
rjmp L134
X50:
; SET_D6;
sbi 0x12,6
xjmp L135
L134:
; else
; CLR_D6;
cbi 0x12,6
L135:
; if(bdat7)
lds R2,_bdat
sbrs R2,7
rjmp L136
X51:
; SET_D7;
sbi 0x12,7
xjmp L137
L136:
; else
; CLR_D7;
cbi 0x12,7
L137:
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; SET_E;
sbi 0x18,7
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; CLR_E;
cbi 0x18,7
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
;
; if(bdat0)
lds R2,_bdat
sbrs R2,0
rjmp L138
X52:
; SET_D4;
sbi 0x12,4
xjmp L139
L138:
; else
; CLR_D4;
cbi 0x12,4
L139:
; if(bdat1)
lds R2,_bdat
sbrs R2,1
rjmp L140
X53:
; SET_D5;
sbi 0x12,5
xjmp L141
L140:
; else
; CLR_D5;
cbi 0x12,5
L141:
; if(bdat2)
lds R2,_bdat
sbrs R2,2
rjmp L142
X54:
; SET_D6;
sbi 0x12,6
xjmp L143
L142:
; else
; CLR_D6;
cbi 0x12,6
L143:
; if(bdat3)
lds R2,_bdat
sbrs R2,3
rjmp L144
X55:
; SET_D7;
sbi 0x12,7
xjmp L145
L144:
; else
; CLR_D7;
cbi 0x12,7
L145:
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; SET_E;
sbi 0x18,7
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
; CLR_E;
cbi 0x18,7
; DELAY();
nop
nop
nop
nop
nop
nop
nop
nop
L127:
.dbline 0 ; func end
ld R12,y+
ld R10,y+
ret
; i -> R20
; buf -> R10,R11
; adr -> R12
.even
_LCD1602_setCGRAM::
xcall push_xgset303C
movw R10,R18
mov R12,R16
; }
; /*--------------------------------------------------------------------
; 函数名称:LCD1602读操作
; 函数功能:
; 注意事项:对于高速CPU,应加延时,好像是废话~
; 提示说明:无
; 输 入:
; 返 回:无
; --------------------------------------------------------------------*/
; //void read(uint8 adr)
; //{
; //}
; /*--------------------------------------------------------------------
; 函数名称:LCD1602设置CGRAM内容
; 函数功能:
; 注意事项:对于高速CPU,应加延时,好像是废话~
; 提示说明:调用LCD1602_setCG(0,userCh),则写入用户定义的字符"userCh"
; 输 入:"adr"数据范围:0-8,"buf"为用户需要写入的字符"userCh"
; 返 回:无
; --------------------------------------------------------------------*/
; void LCD1602_setCGRAM(uint8 adr,const uint8 buf[8])
; {
; uint8 i;
; write(0,0x40+adr*8);
mov R18,R12
lsl R18
lsl R18
lsl R18
subi R18,192 ; addi 64
clr R16
xcall _write
; for(i=0;i<8;i++)
clr R20
xjmp L150
L147:
; write(1,buf[i]);
mov R30,R20
clr R31
add R30,R10
adc R31,R11
lpm R18,Z
ldi R16,1
xcall _write
L148:
inc R20
L150:
cpi R20,8
brlo L147
X56:
L146:
.dbline 0 ; func end
xjmp pop_xgset303C
.area data(ram, con, rel)
L152:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
L153:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
L154:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
L155:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
L156:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.area text(rom, con, rel)
; str -> R10,R11
.even
_LCD1602_setCmd::
xcall push_xgset003C
movw R10,R16
; /* 不得采样下面写法,因为传入的是数组,最后一个不是'\0' */
; //while(*buf)
; //write(1,*buf++);
; }
; /*--------------------------------------------------------------------
; 函数名称:LCD1602命令设置
; 函数功能:
; 注意事项:对于高速CPU,应加延时,好像是废话~
; 提示说明:
; 输 入:"CLR_SCR"/"GO_HOME"/"AC_INC"/"AC_DEC"...
; 返 回:无
; --------------------------------------------------------------------*/
; //---- function ------ 1 -------- 0 ----LcdWordPos--
; // dispEn | Enable | Disable | bit2
; // cursorEn | Enable | Disable | bit1
; // blinkEn | Enable | Disable | bit0
; //------------------------------------------------------
; // isACinc | INC_AC | DEC_AC | bit1
; // shiftEn | Enable | Disable | bit0
; //------------------------------------------------------
; void LCD1602_setCmd(uint8 *str)
; {
; static bool dispEn =0;
; static bool cursorEn=0;
; static bool blinkEn =0;
; static bool shiftEn =0;
; static bool isACinc =0;
;
; if(!strcmp(str,"CLR_SCR")) //clear screen
ldi R18,<L159
ldi R19,>L159
movw R16,R10
xcall _strcmp
cpi R16,0
cpc R16,R17
brne L157
X57:
; write(0,0x01);
ldi R18,1
clr R16
xcall _write
xjmp L158
L157:
;
; else if(!strcmp(str,"GO_HOME")) //set AC go home
ldi R18,<L162
ldi R19,>L162
movw R16,R10
xcall _strcmp
cpi R16,0
cpc R16,R17
brne L160
X58:
; write(0,0x02);
ldi R18,2
clr R16
xcall _write
xjmp L161
L160:
; /*--------------------------------------------------
; isACinc & shiftEn 共用一个命令设置
; --------------------------------------------------*/
; else if(!strcmp(str,"INC_AC")) //set AC as inc mode
ldi R18,<L165
ldi R19,>L165
movw R16,R10
xcall _strcmp
movw R12,R16
cpi R16,0
cpc R16,R17
brne L163
X59:
; {
; isACinc=1;
ldi R24,1
sts L156,R24
; if(shiftEn)
lds R2,L155
tst R2
breq L166
X60:
; write(0,0x07);
ldi R18,7
clr R16
xcall _write
xjmp L164
L166:
; else
; write(0,0x06);
ldi R18,6
clr R16
xcall _write
; }
xjmp L164
L163:
; else if(!strcmp(str,"DEC_AC")) //set AC as dec mode
ldi R18,<L170
ldi R19,>L170
movw R16,R10
xcall _strcmp
movw R12,R16
cpi R16,0
cpc R16,R17
brne L168
X61:
; {
; isACinc=0;
clr R2
sts L156,R2
; if(shiftEn)
lds R2,L155
tst R2
breq L171
X62:
; write(0,0x05);
ldi R18,5
clr R16
xcall _write
xjmp L169
L171:
; else
; write(0,0x04);
ldi R18,4
clr R16
xcall _write
; }
xjmp L169
L168:
; else if(!strcmp(str,"EN_SHIFT")) //enable shift
ldi R18,<L175
ldi R19,>L175
movw R16,R10
xcall _strcmp
movw R12,R16
cpi R16,0
cpc R16,R17
brne L173
X63:
; {
; shiftEn=1;
ldi R24,1
sts L155,R24
; if(isACinc)
lds R2,L156
tst R2
breq L176
X64:
; write(0,0x07);
ldi R18,7
clr R16
xcall _write
xjmp L174
L176:
; else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -