⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yj12864.lst

📁 AVR单片机开发版资料测试程序里的源程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
    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 + -