📄 yj1602.s
字号:
ldi R16,2
ldi R17,0
.dbline -2
.dbline 105
; }
L27:
.dbline 0 ; func end
xjmp _Delayms
.dbend
.dbfunc e LCD1602_readBF _LCD1602_readBF fc
; busy -> R20
.even
_LCD1602_readBF::
xcall push_gset1
.dbline -1
.dbline 113
; /*******************************************
; 函数名称: LCD1602_readBF
; 功 能: 1602液晶清屏
; 参 数: 无
; 返回值 : busy--为1时忙,为0时可以接收指令
; /********************************************/
; uchar LCD1602_readBF(void)
; {
.dbline 115
; uchar busy;
; busy=LCD1602_readbyte(iCmd); //读回BF标志和地址
clr R16
xcall _LCD1602_readbyte
mov R20,R16
.dbline 116
; if(busy&0x80) //忙
sbrs R16,7
rjmp L29
.dbline 117
; busy=1;
ldi R20,1
xjmp L30
L29:
.dbline 119
; else //不忙,可以写入
; busy=0;
clr R20
L30:
.dbline 120
; return busy;
mov R16,R20
.dbline -2
L28:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r busy 20 c
.dbend
.dbfunc e LCD1602_gotoXY _LCD1602_gotoXY fV
; Col -> R20
; Row -> R22
.even
_LCD1602_gotoXY::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 130
; }
; /*******************************************
; 函数名称: LCD1602_gotoXY
; 功 能: 移动到指定位置
; 参 数: Row--指定的行
; Col--指定的列
; 返回值 : 无
; /********************************************/
; void LCD1602_gotoXY(uchar Row, uchar Col)
; {
.dbline 131
; switch (Row) //选择行
clr R23
cpi R22,2
ldi R30,0
cpc R23,R30
breq L35
xjmp L32
X0:
.dbline 132
; {
L35:
.dbline 134
; case 2:
; LCD1602_sendbyte(iCmd, LCDa_L2 + Col); break; //写入第2行的指定列
mov R18,R20
subi R18,64 ; addi 192
clr R16
xcall _LCD1602_sendbyte
.dbline 134
xjmp L33
L32:
.dbline 136
mov R18,R20
subi R18,128 ; addi 128
clr R16
xcall _LCD1602_sendbyte
.dbline 136
L33:
.dbline -2
.dbline 138
; default:
; LCD1602_sendbyte(iCmd, LCDa_L1 + Col); break; //写入第1行的指定列
; }
; }
L31:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Col 20 c
.dbsym r Row 22 c
.dbend
.dbfunc e LCD1602_initial _LCD1602_initial fV
.even
_LCD1602_initial::
.dbline -1
.dbline 146
; /*******************************************
; 函数名称: LCD1602_initial
; 功 能: 1602液晶初始化
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void LCD1602_initial(void)
; {
.dbline 147
; Delayms(100); // 等待内部复位
ldi R16,100
ldi R17,0
xcall _Delayms
.dbline 148
; LCD1602_portini(); //端口初始化
xcall _LCD1602_portini
.dbline 150
;
; LCD1602_sendbyte(iCmd, LCDa_FUNCTION); // 功能、模式设定
ldi R18,56
clr R16
xcall _LCD1602_sendbyte
L37:
.dbline 151
L38:
.dbline 151
; while(LCD1602_readBF());
xcall _LCD1602_readBF
tst R16
brne L37
.dbline 152
; LCD1602_sendbyte(iCmd, LCDa_ON); //打开显示
ldi R18,12
clr R16
xcall _LCD1602_sendbyte
L40:
.dbline 153
L41:
.dbline 153
; while(LCD1602_readBF());
xcall _LCD1602_readBF
tst R16
brne L40
.dbline 154
; LCD1602_clear(); //清屏
xcall _LCD1602_clear
L43:
.dbline 155
L44:
.dbline 155
; while(LCD1602_readBF());
xcall _LCD1602_readBF
tst R16
brne L43
.dbline 156
; LCD1602_sendbyte(iCmd, LCDa_ENTRY); // 输入模式设定
ldi R18,6
clr R16
.dbline -2
.dbline 157
; }
L36:
.dbline 0 ; func end
xjmp _LCD1602_sendbyte
.dbend
.dbfunc e LCD1602_wrCGRAM _LCD1602_wrCGRAM fV
; i -> R20
; ptCGRAM -> R22,R23
.even
_LCD1602_wrCGRAM::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 165
; /*******************************************
; 函数名称: LCD1602_wrCGRAM
; 功 能: 向CGRAM写入数据
; 参 数: ptCGRAM--CGRAM数据指针
; 返回值 : 无
; /********************************************/
; void LCD1602_wrCGRAM(const uchar *ptCGRAM)
; {
.dbline 167
; uchar i;
; LCD1602_sendbyte(iCmd, LCDa_CGRAM_ADDR); //写入CGRAM首地址
ldi R18,64
clr R16
xcall _LCD1602_sendbyte
.dbline 168
; for (i = 0; i < LCDa_CGMAX; i++) //写入64个字节的CGRAM内容
clr R20
xjmp L50
L47:
.dbline 169
.dbline 170
mov R30,R20
clr R31
add R30,R22
adc R31,R23
lpm R18,Z
ldi R16,1
xcall _LCD1602_sendbyte
.dbline 171
L48:
.dbline 168
inc R20
L50:
.dbline 168
cpi R20,64
brlo L47
.dbline -2
.dbline 172
; {
; LCD1602_sendbyte(iDat,ptCGRAM[i]);
; }
; }
L46:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r ptCGRAM 22 pc
.dbend
.dbfunc e LCD1602_disCGRAM _LCD1602_disCGRAM fV
; i -> R20
.even
_LCD1602_disCGRAM::
xcall push_gset1
.dbline -1
.dbline 180
; /*******************************************
; 函数名称: LCD1602_disCGRAM
; 功 能: 显示CGRAM内容,将64个字节写在两行,每行32个字节
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void LCD1602_disCGRAM(void)
; {
.dbline 182
; uchar i;
; LCD1602_gotoXY(1,6); //从第1行第6列开始显示
ldi R18,6
ldi R16,1
xcall _LCD1602_gotoXY
.dbline 183
; for (i = 0;i <4;i++) //显示前32个字节的内容
clr R20
xjmp L55
L52:
.dbline 184
.dbline 185
mov R18,R20
ldi R16,1
xcall _LCD1602_sendbyte
.dbline 186
L53:
.dbline 183
inc R20
L55:
.dbline 183
cpi R20,4
brlo L52
.dbline 187
; {
; LCD1602_sendbyte(iDat, i);
; }
; LCD1602_gotoXY(2,6); //从第2行第6列开始显示
ldi R18,6
ldi R16,2
xcall _LCD1602_gotoXY
.dbline 188
; for (i = 4;i <8;i++) //显示后32个字节的内容
ldi R20,4
xjmp L59
L56:
.dbline 189
.dbline 190
mov R18,R20
ldi R16,1
xcall _LCD1602_sendbyte
.dbline 191
L57:
.dbline 188
inc R20
L59:
.dbline 188
cpi R20,8
brlo L56
.dbline -2
.dbline 192
; {
; LCD1602_sendbyte(iDat,i);
; }
; }
L51:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e main _main fV
; i -> R20
.even
_main::
.dbline -1
.dbline 200
; /*******************************************
; 函数名称: main
; 功 能: 1602液晶驱动主程序
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void main(void)
; {
.dbline 202
; uchar i;
; Board_init( );
xcall _Board_init
.dbline 203
; LCD1602_initial();
xcall _LCD1602_initial
xjmp L62
X1:
.dbline 205
; while(1)
; { //滚动显示CGROM的字符
L64:
.dbline 206
L65:
.dbline 206
; while(LCD1602_readBF());
xcall _LCD1602_readBF
tst R16
brne L64
.dbline 207
; LCD1602_gotoXY(1,17);
ldi R18,17
ldi R16,1
xcall _LCD1602_gotoXY
.dbline 208
; LCD1602_sendstr("AVR_PQ1A BOARD");
ldi R16,<L67
ldi R17,>L67
xcall _LCD1602_sendstr
L68:
.dbline 209
L69:
.dbline 209
; while(LCD1602_readBF());
xcall _LCD1602_readBF
tst R16
brne L68
.dbline 210
; LCD1602_gotoXY(2,18);
ldi R18,18
ldi R16,2
xcall _LCD1602_gotoXY
.dbline 211
; LCD1602_sendstr("13212800564");
ldi R16,<L71
ldi R17,>L71
xcall _LCD1602_sendstr
.dbline 212
; for(i=0;i<30;i++)
clr R20
xjmp L75
L72:
.dbline 213
.dbline 214
ldi R18,24
clr R16
xcall _LCD1602_sendbyte
.dbline 215
ldi R16,500
ldi R17,1
xcall _Delayms
.dbline 216
L73:
.dbline 212
inc R20
L75:
.dbline 212
cpi R20,30
brlo L72
.dbline 217
xcall _LCD1602_clear
.dbline 219
ldi R16,<_CGRAM
ldi R17,>_CGRAM
xcall _LCD1602_wrCGRAM
.dbline 220
ldi R16,90
ldi R17,0
xcall _Delayms
.dbline 221
xcall _LCD1602_disCGRAM
.dbline 222
ldi R16,2000
ldi R17,7
xcall _Delayms
.dbline 223
xcall _LCD1602_clear
.dbline 224
L62:
.dbline 204
xjmp L65
X2:
.dbline -2
.dbline 225
; {
; LCD1602_sendbyte(iCmd, LCDa_D2L);
; Delayms(500);
; }
; LCD1602_clear();
; //静止显示CGRAM的内容
; LCD1602_wrCGRAM(CGRAM);
; Delayms(90);
; LCD1602_disCGRAM();
; Delayms(2000);
; LCD1602_clear();
; }
; }
L60:
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.area data(ram, con, rel)
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
L71:
.blkb 12
.area idata
.byte 49,51,50,49,50,56,48,48,53,54,52,0
.area data(ram, con, rel)
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
L67:
.blkb 15
.area idata
.byte 'A,'V,'R,95,'P,'Q,49,'A,32,'B,'O,'A,'R,'D,0
.area data(ram, con, rel)
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -