📄 yi1602.lst
字号:
010A 9121 LD R18,Z+
010B 01AF MOVW R20,R30
010C E001 LDI R16,1
010D DFE4 RCALL _LCD1602_sendbyte
010E 01FA MOVW R30,R20
010F 8020 LDD R2,0+Z
0110 2022 TST R2
0111 F7B9 BNE 0x0109
(0093) }
(0094) }
0112 940E01C7 CALL pop_gset1
0114 9508 RET
(0095) /*******************************************
(0096) 函数名称: LCD1602_clear
(0097) 功 能: 1602液晶清屏
(0098) 参 数: 无
(0099) 返回值 : 无
(0100) /********************************************/
(0101) void LCD1602_clear(void)
(0102) {
(0103) LCD1602_sendbyte(iCmd,LCDa_CLS);
_LCD1602_clear:
0115 E021 LDI R18,1
0116 2700 CLR R16
0117 DFDA RCALL _LCD1602_sendbyte
(0104) Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
0118 E002 LDI R16,2
0119 E010 LDI R17,0
(0105) }
011A CF7C RJMP _Delayms
_LCD1602_readBF:
busy --> R20
011B 940E01C4 CALL push_gset1
(0106) /*******************************************
(0107) 函数名称: LCD1602_readBF
(0108) 功 能: 1602液晶清屏
(0109) 参 数: 无
(0110) 返回值 : busy--为1时忙,为0时可以接收指令
(0111) /********************************************/
(0112) uchar LCD1602_readBF(void)
(0113) {
(0114) uchar busy;
(0115) busy=LCD1602_readbyte(iCmd); //读回BF标志和地址
011D 2700 CLR R16
011E DFBB RCALL _LCD1602_readbyte
011F 2F40 MOV R20,R16
(0116) if(busy&0x80) //忙
0120 FF07 SBRS R16,7
0121 C002 RJMP 0x0124
(0117) busy=1;
0122 E041 LDI R20,1
0123 C001 RJMP 0x0125
(0118) else //不忙,可以写入
(0119) busy=0;
0124 2744 CLR R20
(0120) return busy;
0125 2F04 MOV R16,R20
0126 940E01C7 CALL pop_gset1
0128 9508 RET
_LCD1602_gotoXY:
Col --> R20
Row --> R22
0129 940E01DB CALL push_gset2
012B 2F42 MOV R20,R18
012C 2F60 MOV R22,R16
(0121) }
(0122) /*******************************************
(0123) 函数名称: LCD1602_gotoXY
(0124) 功 能: 移动到指定位置
(0125) 参 数: Row--指定的行
(0126) Col--指定的列
(0127) 返回值 : 无
(0128) /********************************************/
(0129) void LCD1602_gotoXY(uchar Row, uchar Col)
(0130) {
(0131) switch (Row) //选择行
012D 2777 CLR R23
012E 3062 CPI R22,2
012F E0E0 LDI R30,0
0130 077E CPC R23,R30
0131 F009 BEQ 0x0133
0132 C005 RJMP 0x0138
(0132) {
(0133) case 2:
(0134) LCD1602_sendbyte(iCmd, LCDa_L2 + Col); break; //写入第2行的指定列
0133 2F24 MOV R18,R20
0134 5420 SUBI R18,0x40
0135 2700 CLR R16
0136 DFBB RCALL _LCD1602_sendbyte
0137 C004 RJMP 0x013C
(0135) default:
(0136) LCD1602_sendbyte(iCmd, LCDa_L1 + Col); break; //写入第1行的指定列
0138 2F24 MOV R18,R20
0139 5820 SUBI R18,0x80
013A 2700 CLR R16
013B DFB6 RCALL _LCD1602_sendbyte
(0137) }
(0138) }
013C 940E01DF CALL pop_gset2
013E 9508 RET
(0139) /*******************************************
(0140) 函数名称: LCD1602_initial
(0141) 功 能: 1602液晶初始化
(0142) 参 数: 无
(0143) 返回值 : 无
(0144) /********************************************/
(0145) void LCD1602_initial(void)
(0146) {
(0147) Delayms(100); // 等待内部复位
_LCD1602_initial:
013F E604 LDI R16,0x64
0140 E010 LDI R17,0
0141 DF55 RCALL _Delayms
(0148) LCD1602_portini(); //端口初始化
0142 DF90 RCALL _LCD1602_portini
(0149)
(0150) LCD1602_sendbyte(iCmd, LCDa_FUNCTION); // 功能、模式设定
0143 E328 LDI R18,0x38
0144 2700 CLR R16
0145 DFAC RCALL _LCD1602_sendbyte
(0151) while(LCD1602_readBF());
0146 DFD4 RCALL _LCD1602_readBF
0147 2300 TST R16
0148 F7E9 BNE 0x0146
(0152) LCD1602_sendbyte(iCmd, LCDa_ON); //打开显示
0149 E02C LDI R18,0xC
014A 2700 CLR R16
014B DFA6 RCALL _LCD1602_sendbyte
(0153) while(LCD1602_readBF());
014C DFCE RCALL _LCD1602_readBF
014D 2300 TST R16
014E F7E9 BNE 0x014C
(0154) LCD1602_clear(); //清屏
014F DFC5 RCALL _LCD1602_clear
(0155) while(LCD1602_readBF());
0150 DFCA RCALL _LCD1602_readBF
0151 2300 TST R16
0152 F7E9 BNE 0x0150
(0156) LCD1602_sendbyte(iCmd, LCDa_ENTRY); // 输入模式设定
0153 E026 LDI R18,6
0154 2700 CLR R16
(0157) }
0155 CF9C RJMP _LCD1602_sendbyte
_LCD1602_wrCGRAM:
i --> R20
ptCGRAM --> R22
0156 940E01DB CALL push_gset2
0158 01B8 MOVW R22,R16
(0158) /*******************************************
(0159) 函数名称: LCD1602_wrCGRAM
(0160) 功 能: 向CGRAM写入数据
(0161) 参 数: ptCGRAM--CGRAM数据指针
(0162) 返回值 : 无
(0163) /********************************************/
(0164) void LCD1602_wrCGRAM(const uchar *ptCGRAM)
(0165) {
(0166) uchar i;
(0167) LCD1602_sendbyte(iCmd, LCDa_CGRAM_ADDR); //写入CGRAM首地址
0159 E420 LDI R18,0x40
015A 2700 CLR R16
015B DF96 RCALL _LCD1602_sendbyte
(0168) for (i = 0; i < LCDa_CGMAX; i++) //写入64个字节的CGRAM内容
015C 2744 CLR R20
015D C008 RJMP 0x0166
(0169) {
(0170) LCD1602_sendbyte(iDat,ptCGRAM[i]);
015E 2FE4 MOV R30,R20
015F 27FF CLR R31
0160 0FE6 ADD R30,R22
0161 1FF7 ADC R31,R23
0162 9124 LD R18,R18
0163 E001 LDI R16,1
0164 DF8D RCALL _LCD1602_sendbyte
0165 9543 INC R20
0166 3440 CPI R20,0x40
0167 F3B0 BCS 0x015E
(0171) }
(0172) }
0168 940E01DF CALL pop_gset2
016A 9508 RET
_LCD1602_disCGRAM:
i --> R20
016B 940E01C4 CALL push_gset1
(0173) /*******************************************
(0174) 函数名称: LCD1602_disCGRAM
(0175) 功 能: 显示CGRAM内容,将64个字节写在两行,每行32个字节
(0176) 参 数: 无
(0177) 返回值 : 无
(0178) /********************************************/
(0179) void LCD1602_disCGRAM(void)
(0180) {
(0181) uchar i;
(0182) LCD1602_gotoXY(1,6); //从第1行第6列开始显示
016D E026 LDI R18,6
016E E001 LDI R16,1
016F DFB9 RCALL _LCD1602_gotoXY
(0183) for (i = 0;i <4;i++) //显示前32个字节的内容
0170 2744 CLR R20
0171 C004 RJMP 0x0176
(0184) {
(0185) LCD1602_sendbyte(iDat, i);
0172 2F24 MOV R18,R20
0173 E001 LDI R16,1
0174 DF7D RCALL _LCD1602_sendbyte
0175 9543 INC R20
0176 3044 CPI R20,4
0177 F3D0 BCS 0x0172
(0186) }
(0187) LCD1602_gotoXY(2,6); //从第2行第6列开始显示
0178 E026 LDI R18,6
0179 E002 LDI R16,2
017A DFAE RCALL _LCD1602_gotoXY
(0188) for (i = 4;i <8;i++) //显示后32个字节的内容
017B E044 LDI R20,4
017C C004 RJMP 0x0181
(0189) {
(0190) LCD1602_sendbyte(iDat,i);
017D 2F24 MOV R18,R20
017E E001 LDI R16,1
017F DF72 RCALL _LCD1602_sendbyte
0180 9543 INC R20
0181 3048 CPI R20,0x8
0182 F3D0 BCS 0x017D
(0191) }
(0192) }
0183 940E01C7 CALL pop_gset1
0185 9508 RET
(0193) /*******************************************
(0194) 函数名称: main
(0195) 功 能: 1602液晶驱动主程序
(0196) 参 数: 无
(0197) 返回值 : 无
(0198) /********************************************/
(0199) void main(void)
(0200) {
(0201) uchar i;
(0202) Board_init( );
_main:
i --> R20
0186 DF26 RCALL _Board_init
(0203) LCD1602_initial();
0187 DFB7 RCALL _LCD1602_initial
0188 C029 RJMP 0x01B2
(0204) while(1)
(0205) { //滚动显示CGROM的字符
(0206) while(LCD1602_readBF());
0189 DF91 RCALL _LCD1602_readBF
018A 2300 TST R16
018B F7E9 BNE 0x0189
(0207) LCD1602_gotoXY(1,17);
018C E121 LDI R18,0x11
018D E001 LDI R16,1
018E DF9A RCALL _LCD1602_gotoXY
(0208) LCD1602_sendstr("AVR_PQ1A BOARD");
018F E60C LDI R16,0x6C
0190 E010 LDI R17,0
0191 DF73 RCALL _LCD1602_sendstr
(0209) while(LCD1602_readBF());
0192 DF88 RCALL _LCD1602_readBF
0193 2300 TST R16
0194 F7E9 BNE 0x0192
(0210) LCD1602_gotoXY(2,18);
0195 E122 LDI R18,0x12
0196 E002 LDI R16,2
0197 DF91 RCALL _LCD1602_gotoXY
(0211) LCD1602_sendstr("13212800564");
0198 E600 LDI R16,0x60
0199 E010 LDI R17,0
019A DF6A RCALL _LCD1602_sendstr
(0212) for(i=0;i<30;i++)
019B 2744 CLR R20
019C C007 RJMP 0x01A4
(0213) {
(0214) LCD1602_sendbyte(iCmd, LCDa_D2L);
019D E128 LDI R18,0x18
019E 2700 CLR R16
019F DF52 RCALL _LCD1602_sendbyte
(0215) Delayms(500);
01A0 EF04 LDI R16,0xF4
01A1 E011 LDI R17,1
01A2 DEF4 RCALL _Delayms
01A3 9543 INC R20
01A4 314E CPI R20,0x1E
01A5 F3B8 BCS 0x019D
(0216) }
(0217) LCD1602_clear();
01A6 DF6E RCALL _LCD1602_clear
(0218) //静止显示CGRAM的内容
(0219) LCD1602_wrCGRAM(CGRAM);
01A7 E600 LDI R16,0x60
01A8 E010 LDI R17,0
01A9 DFAC RCALL _LCD1602_wrCGRAM
(0220) Delayms(90);
01AA E50A LDI R16,0x5A
01AB E010 LDI R17,0
01AC DEEA RCALL _Delayms
(0221) LCD1602_disCGRAM();
01AD DFBD RCALL _LCD1602_disCGRAM
(0222) Delayms(2000);
01AE ED00 LDI R16,0xD0
01AF E017 LDI R17,7
01B0 DEE6 RCALL _Delayms
(0223) LCD1602_clear();
01B1 DF63 RCALL _LCD1602_clear
01B2 CFD6 RJMP 0x0189
(0224) }
(0225) }FILE: <library>
01B3 9508 RET
empy16s:
01B4 920A ST R0,-Y
01B5 921A ST R1,-Y
01B6 938A ST R24,-Y
01B7 939A ST R25,-Y
01B8 9F02 MUL R16,R18
01B9 01C0 MOVW R24,R0
01BA 9F12 MUL R17,R18
01BB 0D90 ADD R25,R0
01BC 9F03 MUL R16,R19
01BD 0D90 ADD R25,R0
01BE 018C MOVW R16,R24
01BF 9199 LD R25,Y+
01C0 9189 LD R24,Y+
01C1 9019 LD R1,Y+
01C2 9009 LD R0,Y+
01C3 9508 RET
push_gset1:
01C4 935A ST R21,-Y
01C5 934A ST R20,-Y
01C6 9508 RET
pop_gset1:
01C7 E0E1 LDI R30,1
pop:
01C8 9149 LD R20,Y+
01C9 9159 LD R21,Y+
01CA FDE0 SBRC R30,0
01CB 9508 RET
01CC 9169 LD R22,Y+
01CD 9179 LD R23,Y+
01CE FDE1 SBRC R30,1
01CF 9508 RET
01D0 90A9 LD R10,Y+
01D1 90B9 LD R11,Y+
01D2 FDE2 SBRC R30,2
01D3 9508 RET
01D4 90C9 LD R12,Y+
01D5 90D9 LD R13,Y+
01D6 FDE3 SBRC R30,3
01D7 9508 RET
01D8 90E9 LD R14,Y+
01D9 90F9 LD R15,Y+
01DA 9508 RET
push_gset2:
01DB 937A ST R23,-Y
01DC 936A ST R22,-Y
01DD 940C01C4 JMP push_gset1
pop_gset2:
01DF E0E2 LDI R30,2
01E0 940C01C8 JMP pop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -