📄 yj1602.s
字号:
.module YJ1602.C
.area text(rom, con, rel)
.dbfile C:/icc/include/AVR_PQ1A.h
.dbfunc e Delayus _Delayus fV
; i -> R20,R21
; US -> R22,R23
.even
_Delayus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 28
; /*******************************************
; 文件:YJ1602.C
; 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
; 硬件:ATMEGA16芯片
; 日期:2006年12月10日
; 功能:驱动开发板上的1602液晶
; 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
; /******************************************/
; #include <iom16v.h> //包含型号头文件
; #include <macros.h> //包含"位"操作头文件
; #include <stdio.h> //标准输入输出头文件
; #include <AVR_PQ1A.h> //包含自定义常量头文件
;
; #pragma data:code
; const uchar CGRAM[LCDa_CGMAX] =
; {
; //8*5字模
; 0x00,0x01,0x1F,0x11,0x1F,0x01,0x01,0x01, // 第1、2行显示"中"字
; 0x00,0x00,0x1E,0x02,0x1E,0x00,0x00,0x00,
; 0x00,0x01,0x1F,0x04,0x02,0x01,0x02,0x04, // 第3、4行显示"文"字
; 0x00,0x00,0x1f,0x04,0x08,0x10,0x08,0x04,
; 0x00,0x0E,0x11,0x10,0x08,0x04,0x02,0x01, // 第5、6行显示心型
; 0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x10,
; 0x00,0x0E,0x11,0x10,0x08,0x04,0x02,0x01, // 第7、8行显示心型
; 0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x10,
; };
; #pragma data:data
; /*******************************************
.dbline 30
; 函数名称: LCD1602_portini
; 功 能: 初始化1602液晶用到的IO口
ldi R16,5
ldi R17,0
movw R18,R22
xcall empy16s
movw R22,R16
lsr R23
ror R22
lsr R23
ror R22
.dbline 31
clr R20
clr R21
xjmp L5
L2:
.dbline 31
L3:
.dbline 31
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 31
; 参 数: 无
cp R20,R22
cpc R21,R23
brlo L2
.dbline -2
.dbline 32
; 返回值 : 无
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r US 22 i
.dbend
.dbfunc e Delayms _Delayms fV
; i -> R20,R21
; j -> R22,R23
; MS -> R16,R17
.even
_Delayms::
xcall push_gset2
.dbline -1
.dbline 40
; /********************************************/
; void LCD1602_portini(void)
; {
; LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
; LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
; }
; /*******************************************
; 函数名称: LCD1602_readbyte
.dbline 42
; 功 能: 从1602液晶读出一个字节数据或者指令
; 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
clr R20
clr R21
xjmp L10
L7:
.dbline 43
clr R22
clr R23
xjmp L14
L11:
.dbline 43
L12:
.dbline 43
subi R22,255 ; offset = 1
sbci R23,255
L14:
.dbline 43
cpi R22,117
ldi R30,4
cpc R23,R30
brlo L11
L8:
.dbline 42
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 42
cp R20,R16
cpc R21,R17
brlo L7
.dbline -2
.dbline 44
; 返回值 : dByte--读回的数据或者指令
; /********************************************/
L6:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r MS 16 i
.dbend
.dbfunc e Board_init _Board_init fV
.even
_Board_init::
.dbline -1
.dbline 52
; uchar LCD1602_readbyte(uchar DatCmd)
; {
; uchar dByte;
; if (DatCmd == iCmd) //指令操作
; LCDa_CLR_RS;
; else
; LCDa_SET_RS;
;
.dbline 53
; LCDa_SET_RW; //读操作
ldi R24,255
out 0x1a,R24
.dbline 54
; LCDa_SET_E;
out 0x17,R24
.dbline 55
; LCDa_DATA_DDR=0x00; //数据总线定义为输入
out 0x14,R24
.dbline 56
; dByte=LCDa_DI; //读数据或者指令
out 0x11,R24
.dbline 58
; Delayms(1); //时序调整
; LCDa_CLR_E;
clr R2
out 0xd,R2
.dbline 60
; LCDa_DATA_DDR|=0xff; //数据总线还原为输出
; return dByte;
sbi 0x1b,6
.dbline 61
; }
cbi 0x15,6
.dbline 62
; /*******************************************
cbi 0x1b,1
.dbline 63
; 函数名称: LCD1602_sendbyte
out 0x18,R24
.dbline 64
; 功 能: 向1602液晶写入一个字节数据或者指令
sbi 0x1b,2
.dbline 65
; 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
ldi R16,5
ldi R17,0
xcall _Delayus
.dbline 66
; dByte--为写入1602的数据或者指令
cbi 0x1b,2
.dbline 68
; 返回值 : 无
; /********************************************/
clr R2
out 0x18,R2
.dbline 69
; void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
sbi 0x1b,3
.dbline 70
; {
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 71
; if (DatCmd == iCmd) //指令操作
cbi 0x1b,3
.dbline 73
; LCDa_CLR_RS;
; else
ldi R24,255
out 0x18,R24
.dbline 74
; LCDa_SET_RS;
sbi 0x1b,4
.dbline 75
;
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 76
; LCDa_CLR_RW; //写操作
cbi 0x1b,4
.dbline 78
; LCDa_SET_E;
; LCDa_DO = dByte; //写入数据
ldi R24,255
out 0x12,R24
.dbline 79
; Delayms(1);
sbi 0x1b,7
.dbline 80
; LCDa_CLR_E;
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 81
; }
cbi 0x1b,7
.dbline -2
.dbline 84
; /*******************************************
; 函数名称: LCD1602_sendstr
; 功 能: 向1602液晶写入一个字符串
L15:
.dbline 0 ; func end
ret
.dbend
.area code(ram, con, rel)
.dbfile C:/icc/include/AVR_PQ1A.h
.area lit(rom, con, rel)
_CGRAM::
.byte 0,1
.byte 31,17
.byte 31,1
.byte 1,1
.byte 0,0
.byte 30,2
.byte 30,0
.byte 0,0
.byte 0,1
.byte 31,4
.byte 2,1
.byte 2,4
.byte 0,0
.byte 31,4
.byte 8,16
.byte 8,4
.byte 0,14
.byte 17,16
.byte 8,4
.byte 2,1
.byte 0,14
.byte 17,1
.byte 2,4
.byte 8,16
.byte 0,14
.byte 17,16
.byte 8,4
.byte 2,1
.byte 0,14
.byte 17,1
.byte 2,4
.byte 8,16
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
.dbsym e CGRAM _CGRAM A[64:64]c
.area data(ram, con, rel)
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
.area text(rom, con, rel)
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\3_1602\YJ1602.C
.dbfunc e LCD1602_portini _LCD1602_portini fV
.even
_LCD1602_portini::
.dbline -1
.dbline 35
.dbline 36
in R24,0x11
ori R24,112
out 0x11,R24
.dbline 37
in R24,0x17
ori R24,255
out 0x17,R24
.dbline -2
.dbline 38
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD1602_readbyte _LCD1602_readbyte fc
; dByte -> R20
; DatCmd -> R20
.even
_LCD1602_readbyte::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 46
.dbline 48
tst R20
brne L18
.dbline 49
cbi 0x12,4
xjmp L19
L18:
.dbline 51
sbi 0x12,4
L19:
.dbline 53
sbi 0x12,5
.dbline 54
sbi 0x12,6
.dbline 55
clr R2
out 0x17,R2
.dbline 56
in R20,0x16
.dbline 57
ldi R16,1
ldi R17,0
xcall _Delayms
.dbline 58
cbi 0x12,6
.dbline 59
in R24,0x17
ori R24,255
out 0x17,R24
.dbline 60
mov R16,R20
.dbline -2
L17:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r dByte 20 c
.dbsym r DatCmd 20 c
.dbend
.dbfunc e LCD1602_sendbyte _LCD1602_sendbyte fV
; dByte -> R20
; DatCmd -> R22
.even
_LCD1602_sendbyte::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 70
.dbline 71
tst R22
brne L21
.dbline 72
cbi 0x12,4
xjmp L22
L21:
.dbline 74
sbi 0x12,4
L22:
.dbline 76
cbi 0x12,5
.dbline 77
sbi 0x12,6
.dbline 78
out 0x18,R20
.dbline 79
ldi R16,1
ldi R17,0
xcall _Delayms
.dbline 80
cbi 0x12,6
.dbline -2
.dbline 81
L20:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r dByte 20 c
.dbsym r DatCmd 22 c
.dbend
.dbfunc e LCD1602_sendstr _LCD1602_sendstr fV
; ptString -> R20,R21
.even
_LCD1602_sendstr::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 89
; 参 数: ptString--字符串指针
; 返回值 : 无
; /********************************************/
; void LCD1602_sendstr(uchar *ptString)
; {
xjmp L25
L24:
.dbline 91
.dbline 92
movw R30,R20
ld R18,Z+
movw R20,R30
ldi R16,1
xcall _LCD1602_sendbyte
.dbline 93
L25:
.dbline 90
; while((*ptString)!='\0') //字符串未结束
movw R30,R20
ldd R2,z+0
tst R2
brne L24
.dbline -2
.dbline 94
; {
; LCD1602_sendbyte(iDat, *ptString++);
; }
; }
L23:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r ptString 20 pc
.dbend
.dbfunc e LCD1602_clear _LCD1602_clear fV
.even
_LCD1602_clear::
.dbline -1
.dbline 102
; /*******************************************
; 函数名称: LCD1602_clear
; 功 能: 1602液晶清屏
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void LCD1602_clear(void)
; {
.dbline 103
; LCD1602_sendbyte(iCmd,LCDa_CLS);
ldi R18,1
clr R16
xcall _LCD1602_sendbyte
.dbline 104
; Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -