📄 yj12864.lst
字号:
02C2 B381 IN R24,P11
02C3 6F80 ORI R24,0xF0
02C4 BB81 OUT P11,R24
(0090) LCDb_DATA_DDR |= 0xFF; //配置数据管脚为输出
02C5 B387 IN R24,P17
02C6 6F8F ORI R24,0xFF
02C7 BB87 OUT P17,R24
(0091) LCDb_SET_RST; //不使能复位端
02C8 9A97 SBI P12,7
(0092) }
02C9 9508 RET
_LCD12864_readbyte:
dByte --> R20
DatCmd --> R20
02CA 940E040F CALL push_gset1
02CC 2F40 MOV R20,R16
(0093) /*******************************************
(0094) 函数名称: LCD12864_readbyte
(0095) 功 能: 从12864液晶读出一个字节数据或者指令
(0096) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0097) 返回值 : dByte--读回的数据或者指令
(0098) /********************************************/
(0099) uchar LCD12864_readbyte(uchar DatCmd)
(0100) {
(0101) uchar dByte;
(0102) if (DatCmd == iCmd) //指令操作
02CD 2344 TST R20
02CE F411 BNE 0x02D1
(0103) LCDb_CLR_RS;
02CF 9894 CBI P12,4
02D0 C001 RJMP 0x02D2
(0104) else
(0105) LCDb_SET_RS;
02D1 9A94 SBI P12,4
(0106)
(0107) LCDb_SET_RW; //读操作
02D2 9A95 SBI P12,5
(0108) LCDb_SET_E;
02D3 9A96 SBI P12,6
(0109) LCDb_DATA_DDR=0x00; //数据总线定义为输入
02D4 2422 CLR R2
02D5 BA27 OUT P17,R2
(0110) dByte=LCDb_DI; //读数据或者指令
02D6 B346 IN R20,P16
(0111) Delayms(1); //时序调整
02D7 E001 LDI R16,1
02D8 E010 LDI R17,0
02D9 DFAC RCALL _Delayms
(0112) LCDb_CLR_E;
02DA 9896 CBI P12,6
(0113) LCDb_DATA_DDR|=0xff; //数据总线还原为输出
02DB B387 IN R24,P17
02DC 6F8F ORI R24,0xFF
02DD BB87 OUT P17,R24
(0114) return dByte;
02DE 2F04 MOV R16,R20
02DF 940E0412 CALL pop_gset1
02E1 9508 RET
_LCD12864_sendbyte:
dByte --> R20
DatCmd --> R22
02E2 940E0426 CALL push_gset2
02E4 2F42 MOV R20,R18
02E5 2F60 MOV R22,R16
(0115) }
(0116) /*******************************************
(0117) 函数名称: LCD12864_sendbyte
(0118) 功 能: 向12864液晶写入一个字节数据或者指令
(0119) 参 数: DatCmd--为iDat时是数据,为iCmd时是指令
(0120) dByte--为写入12864的数据或者指令
(0121) 返回值 : 无
(0122) /********************************************/
(0123) void LCD12864_sendbyte(uchar DatCmd, uchar dByte)
(0124) {
(0125) if (DatCmd == iCmd) //指令操作
02E6 2366 TST R22
02E7 F411 BNE 0x02EA
(0126) LCDb_CLR_RS;
02E8 9894 CBI P12,4
02E9 C001 RJMP 0x02EB
(0127) else
(0128) LCDb_SET_RS;
02EA 9A94 SBI P12,4
(0129)
(0130) LCDb_CLR_RW; //写操作
02EB 9895 CBI P12,5
(0131) LCDb_SET_E;
02EC 9A96 SBI P12,6
(0132) LCDb_DO = dByte; //写入数据
02ED BB48 OUT P18,R20
(0133) Delayus(100);
02EE E604 LDI R16,0x64
02EF E010 LDI R17,0
02F0 DF7D RCALL _Delayus
(0134) LCDb_CLR_E;
02F1 9896 CBI P12,6
(0135) }
02F2 940E0432 CALL pop_gset2
02F4 9508 RET
_LCD12864_sendstr:
ptString --> R20
02F5 940E040F CALL push_gset1
02F7 01A8 MOVW R20,R16
(0136) /*******************************************
(0137) 函数名称: LCD12864_sendstr
(0138) 功 能: 向12864液晶写入一个字符串
(0139) 参 数: ptString--字符串指针
(0140) 返回值 : 无
(0141) /********************************************/
(0142) void LCD12864_sendstr(uchar *ptString)
(0143) {
02F8 C005 RJMP 0x02FE
(0144) while((*ptString)!='\0') //字符串未结束一直写
(0145) {
(0146) LCD12864_sendbyte(iDat, *ptString++);
02F9 01FA MOVW R30,R20
02FA 9121 LD R18,Z+
02FB 01AF MOVW R20,R30
02FC E001 LDI R16,1
02FD DFE4 RCALL _LCD12864_sendbyte
02FE 01FA MOVW R30,R20
02FF 8020 LDD R2,0+Z
0300 2022 TST R2
0301 F7B9 BNE 0x02F9
(0147) }
(0148) }
0302 940E0412 CALL pop_gset1
0304 9508 RET
(0149) /*******************************************
(0150) 函数名称: LCD12864_clear
(0151) 功 能: 12864液晶清屏
(0152) 参 数: 无
(0153) 返回值 : 无
(0154) /********************************************/
(0155) void LCD12864_clear(void)
(0156) {
(0157) LCD12864_sendbyte(iCmd,LCDb_CLS);
_LCD12864_clear:
0305 E021 LDI R18,1
0306 2700 CLR R16
0307 DFDA RCALL _LCD12864_sendbyte
(0158) Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
0308 E002 LDI R16,2
0309 E010 LDI R17,0
(0159) }
030A CF7B RJMP _Delayms
_LCD12864_readBF:
busy --> R20
030B 940E040F CALL push_gset1
(0160) /*******************************************
(0161) 函数名称: LCD12864_readBF
(0162) 功 能: 12864液晶清屏
(0163) 参 数: 无
(0164) 返回值 : busy--为1时忙,为0时可以接收指令
(0165) /********************************************/
(0166) uchar LCD12864_readBF(void)
(0167) {
(0168) uchar busy;
(0169) busy=LCD12864_readbyte(iCmd); //读回BF标志和地址
030D 2700 CLR R16
030E DFBB RCALL _LCD12864_readbyte
030F 2F40 MOV R20,R16
(0170) if(busy&0x80) //如果忙,返回忙状态
0310 FF07 SBRS R16,7
0311 C002 RJMP 0x0314
(0171) busy=1;
0312 E041 LDI R20,1
0313 C001 RJMP 0x0315
(0172) else //不忙,可以写入
(0173) busy=0;
0314 2744 CLR R20
(0174) return busy;
0315 2F04 MOV R16,R20
0316 940E0412 CALL pop_gset1
0318 9508 RET
_LCD12864_gotoXY:
Col --> R20
Row --> R22
0319 940E0426 CALL push_gset2
031B 2F42 MOV R20,R18
031C 2F60 MOV R22,R16
(0175) }
(0176) /*******************************************
(0177) 函数名称: LCD12864_gotoXY
(0178) 功 能: 移动到指定位置
(0179) 参 数: Row--指定的行
(0180) Col--指定的列
(0181) 返回值 : 无
(0182) /********************************************/
(0183) void LCD12864_gotoXY(uchar Row, uchar Col)
(0184) {
(0185) switch (Row) //选择行
031D 2777 CLR R23
031E 3062 CPI R22,2
031F E0E0 LDI R30,0
0320 077E CPC R23,R30
0321 F049 BEQ 0x032B
0322 3063 CPI R22,3
0323 E0E0 LDI R30,0
0324 077E CPC R23,R30
0325 F051 BEQ 0x0330
0326 3064 CPI R22,4
0327 E0E0 LDI R30,0
0328 077E CPC R23,R30
0329 F059 BEQ 0x0335
032A C00F RJMP 0x033A
(0186) {
(0187) case 2:
(0188) LCD12864_sendbyte(iCmd, LCDb_L2 + Col); break; //写入第2行的指定列
032B 2F24 MOV R18,R20
032C 5720 SUBI R18,0x70
032D 2700 CLR R16
032E DFB3 RCALL _LCD12864_sendbyte
032F C00E RJMP 0x033E
(0189) case 3:
(0190) LCD12864_sendbyte(iCmd, LCDb_L3 + Col); break; //写入第3行的指定列
0330 2F24 MOV R18,R20
0331 5728 SUBI R18,0x78
0332 2700 CLR R16
0333 DFAE RCALL _LCD12864_sendbyte
0334 C009 RJMP 0x033E
(0191) case 4:
(0192) LCD12864_sendbyte(iCmd, LCDb_L4 + Col); break; //写入第4行的指定列
0335 2F24 MOV R18,R20
0336 5628 SUBI R18,0x68
0337 2700 CLR R16
0338 DFA9 RCALL _LCD12864_sendbyte
0339 C004 RJMP 0x033E
(0193) default:
(0194) LCD12864_sendbyte(iCmd, LCDb_L1 + Col); break; //写入第1行的指定列
033A 2F24 MOV R18,R20
033B 5820 SUBI R18,0x80
033C 2700 CLR R16
033D DFA4 RCALL _LCD12864_sendbyte
(0195) }
(0196) }
033E 940E0432 CALL pop_gset2
0340 9508 RET
(0197) /*******************************************
(0198) 函数名称: LCD12864_initial
(0199) 功 能: 12864液晶初始化
(0200) 参 数: 无
(0201) 返回值 : 无
(0202) /********************************************/
(0203) void LCD12864_initial(void)
(0204) {
(0205) Delayms(100); // 等待内部复位
_LCD12864_initial:
0341 E604 LDI R16,0x64
0342 E010 LDI R17,0
0343 DF42 RCALL _Delayms
(0206) LCD12864_portini(); //端口初始化
0344 DF7D RCALL _LCD12864_portini
(0207)
(0208) LCD12864_sendbyte(iCmd, LCDb_FUNCTION); //功能、模式设定
0345 E328 LDI R18,0x38
0346 2700 CLR R16
0347 DF9A RCALL _LCD12864_sendbyte
(0209) while(LCD12864_readBF());
0348 DFC2 RCALL _LCD12864_readBF
0349 2300 TST R16
034A F7E9 BNE 0x0348
(0210) LCD12864_sendbyte(iCmd, LCDb_ON); //打开显示
034B E02C LDI R18,0xC
034C 2700 CLR R16
034D DF94 RCALL _LCD12864_sendbyte
(0211) while(LCD12864_readBF());
034E DFBC RCALL _LCD12864_readBF
034F 2300 TST R16
0350 F7E9 BNE 0x034E
(0212) LCD12864_clear(); //清屏
0351 DFB3 RCALL _LCD12864_clear
(0213) while(LCD12864_readBF());
0352 DFB8 RCALL _LCD12864_readBF
0353 2300 TST R16
0354 F7E9 BNE 0x0352
(0214) LCD12864_sendbyte(iCmd, LCDb_ENTRY); // 输入模式设定
0355 E026 LDI R18,6
0356 2700 CLR R16
(0215) }
0357 CF8A RJMP _LCD12864_sendbyte
_LCD12864_opGDRAM:
i --> R20
x --> R22
j --> R10
ptGDRAM --> R12
0358 940E042E CALL push_gset4
035A 0168 MOVW R12,R16
(0216) /*******************************************
(0217) 函数名称: LCD12864_opGDRAM
(0218) 功 能: 向GDRAM写入数据,并显示(完成绘图功能)
(0219) 参 数: ptGDRAM--GDRAM数据指针
(0220) 返回值 : 无
(0221) /********************************************/
(0222) void LCD12864_opGDRAM(const uchar *ptGDRAM)
(0223) {
(0224) uchar i,j;
(0225) uint x=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -