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

📄 lcd1602.lst

📁 ATmega16应用例子
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0090) #define bdat1 (bdat&0x02)
(0091) #define bdat2 (bdat&0x04)
(0092) #define bdat3 (bdat&0x08)
(0093) #define bdat4 (bdat&0x10)
(0094) #define bdat5 (bdat&0x20)
(0095) #define bdat6 (bdat&0x40)
(0096) #define bdat7 (bdat&0x80)
(0097) 
(0098) #define CGRAM0 0x00
(0099) #define CGRAM1 0x01
(0100) #define CGRAM2 0x02
(0101) #define CGRAM3 0x03
(0102) #define CGRAM4 0x04
(0103) #define CGRAM5 0x05
(0104) #define CGRAM6 0x06
(0105) #define CGRAM7 0x07
(0106) 
(0107) #define TRUE	1
(0108) #define FALSE	0
(0109) bool LCD1602Err = FALSE;
(0110) 
(0111) /*--------------------------------------------------------------------
(0112) 函数名称:LCD1602读读读读读忙~
(0113) 函数功能:都说是读读读读读忙咯~
(0114) 注意事项:对于高速CPU,应加延时,好像是废话~
(0115) 提示说明:无
(0116) 输    入:
(0117) 返    回:无
(0118) --------------------------------------------------------------------*/
(0119) void busy(void)
(0120) {
(0121) 	uint16 busyCounter=0;
_busy:
  busySta              --> R16
  busyCounter          --> R18
    025F 2722      CLR	R18
    0260 2733      CLR	R19
(0122) 	bool busySta;		//用于探测 lcd busy status
(0123) 	IN_BF;
    0261 98D7      CBI	0x1A,7
(0124) 	SET_D4;
    0262 9ADC      SBI	0x1B,4
(0125) 	SET_D5;
    0263 9ADD      SBI	0x1B,5
(0126) 	SET_D6;
    0264 9ADE      SBI	0x1B,6
(0127) 	SET_D7;
    0265 9ADF      SBI	0x1B,7
(0128) 	DELAY();
    0266 0000      NOP
    0267 0000      NOP
    0268 0000      NOP
    0269 0000      NOP
    026A 0000      NOP
    026B 0000      NOP
    026C 0000      NOP
    026D 0000      NOP
(0129) 	CLR_RS;
    026E 9895      CBI	0x12,5
(0130) 	DELAY();
    026F 0000      NOP
    0270 0000      NOP
    0271 0000      NOP
    0272 0000      NOP
    0273 0000      NOP
    0274 0000      NOP
    0275 0000      NOP
    0276 0000      NOP
(0131) 	SET_RW;
    0277 9A96      SBI	0x12,6
(0132) 	DELAY();
    0278 0000      NOP
    0279 0000      NOP
    027A 0000      NOP
    027B 0000      NOP
    027C 0000      NOP
    027D 0000      NOP
    027E 0000      NOP
    027F 0000      NOP
(0133) 
(0134) 	do
(0135) 	{
(0136) 		SET_E;   
    0280 9A97      SBI	0x12,7
(0137) 		DELAY();
    0281 0000      NOP
    0282 0000      NOP
    0283 0000      NOP
    0284 0000      NOP
    0285 0000      NOP
    0286 0000      NOP
    0287 0000      NOP
    0288 0000      NOP
(0138) /* 这里读取AC4-AC6位及BF的值,程序不需记录AC4-AC6的值,所以不存储 */
(0139) 		busySta=(bool)GET_BF;  
    0289 B309      IN	R16,0x19
    028A 2711      CLR	R17
    028B 7800      ANDI	R16,0x80
    028C 7010      ANDI	R17,0
(0140) 		CLR_E;
    028D 9897      CBI	0x12,7
(0141) 		DELAY(); 
    028E 0000      NOP
    028F 0000      NOP
    0290 0000      NOP
    0291 0000      NOP
    0292 0000      NOP
    0293 0000      NOP
    0294 0000      NOP
    0295 0000      NOP
(0142) /* 读取 "BUSY"时,"D4-D7"状态可能已经改变,必须再次设为输出"1" */
(0143) 		SET_D4;
    0296 9ADC      SBI	0x1B,4
(0144) 		SET_D5;
    0297 9ADD      SBI	0x1B,5
(0145) 		SET_D6;
    0298 9ADE      SBI	0x1B,6
(0146) 		SET_D7;
    0299 9ADF      SBI	0x1B,7
(0147) 		DELAY();
    029A 0000      NOP
    029B 0000      NOP
    029C 0000      NOP
    029D 0000      NOP
    029E 0000      NOP
    029F 0000      NOP
    02A0 0000      NOP
    02A1 0000      NOP
(0148) 		SET_E;   
    02A2 9A97      SBI	0x12,7
(0149) 		DELAY();
    02A3 0000      NOP
    02A4 0000      NOP
    02A5 0000      NOP
    02A6 0000      NOP
    02A7 0000      NOP
    02A8 0000      NOP
    02A9 0000      NOP
    02AA 0000      NOP
(0150) /* 这里读取AC0-AC3位的值,程序不需记录AC0-AC3的值,所以不存储 */
(0151) 		CLR_E;   
    02AB 9897      CBI	0x12,7
(0152) 		DELAY();
    02AC 0000      NOP
    02AD 0000      NOP
    02AE 0000      NOP
    02AF 0000      NOP
    02B0 0000      NOP
    02B1 0000      NOP
    02B2 0000      NOP
    02B3 0000      NOP
(0153) 		if(busyCounter==1000)
    02B4 3E28      CPI	R18,0xE8
    02B5 E0E3      LDI	R30,3
    02B6 073E      CPC	R19,R30
    02B7 F421      BNE	0x02BC
(0154) 		{
(0155) 			LCD1602Err=TRUE;	//标识LCD1602错误,方便上缴系统报错
    02B8 E081      LDI	R24,1
    02B9 93800060  STS	0x60,R24
(0156) 			return ;			//避免由于LCD1602错误而导致程序阻塞
    02BB C00A      RJMP	0x02C6
(0157) 		}
(0158) 		busyCounter++;
    02BC 5F2F      SUBI	R18,0xFF
    02BD 4F3F      SBCI	R19,0xFF
(0159) 	}
(0160) 	while(busySta);
    02BE 2300      TST	R16
    02BF F009      BEQ	0x02C1
    02C0 CFBF      RJMP	0x0280
(0161) 
(0162) 	LCD1602Err=FALSE;
    02C1 2422      CLR	R2
    02C2 92200060  STS	0x60,R2
(0163) 	CLR_E;
    02C4 9897      CBI	0x12,7
(0164) 	OUT_BF;
    02C5 9AD7      SBI	0x1A,7
(0165) }
    02C6 9508      RET
_write:
  dat                  --> R22
  flag                 --> R20
    02C7 940E082E  CALL	push_gset2
    02C9 2F62      MOV	R22,R18
    02CA 2F40      MOV	R20,R16
(0166) /*--------------------------------------------------------------------
(0167) 函数名称:LCD1602写操作
(0168) 函数功能:
(0169) 注意事项:对于高速CPU,应加延时,好像是废话~
(0170) 提示说明:无
(0171) 输    入:
(0172) 返    回:无
(0173) --------------------------------------------------------------------*/
(0174) void write(bool flag,uint8 dat)	//flag=0:command,flag=1:data
(0175) {  
(0176) 	bdat=dat;
    02CB 93600111  STS	_bdat,R22
(0177) 	busy();
    02CD DF91      RCALL	_busy
(0178) 	if(flag)
    02CE 2344      TST	R20
    02CF F011      BEQ	0x02D2
(0179) 		SET_RS;
    02D0 9A95      SBI	0x12,5
    02D1 C001      RJMP	0x02D3
(0180) 	else
(0181) 		CLR_RS;
    02D2 9895      CBI	0x12,5
(0182) 	DELAY();
    02D3 0000      NOP
    02D4 0000      NOP
    02D5 0000      NOP
    02D6 0000      NOP
    02D7 0000      NOP
    02D8 0000      NOP
    02D9 0000      NOP
    02DA 0000      NOP
(0183) 	CLR_RW;
    02DB 9896      CBI	0x12,6
(0184) 	DELAY();
    02DC 0000      NOP
    02DD 0000      NOP
    02DE 0000      NOP
    02DF 0000      NOP
    02E0 0000      NOP
    02E1 0000      NOP
    02E2 0000      NOP
    02E3 0000      NOP
(0185) 	if(bdat4)
    02E4 90200111  LDS	R2,_bdat
    02E6 FE24      SBRS	R2,4
    02E7 C002      RJMP	0x02EA
(0186) 		SET_D4;
    02E8 9ADC      SBI	0x1B,4
    02E9 C001      RJMP	0x02EB
(0187) 	else
(0188) 		CLR_D4;
    02EA 98DC      CBI	0x1B,4
(0189) 	if(bdat5)
    02EB 90200111  LDS	R2,_bdat
    02ED FE25      SBRS	R2,5
    02EE C002      RJMP	0x02F1
(0190) 		SET_D5;
    02EF 9ADD      SBI	0x1B,5
    02F0 C001      RJMP	0x02F2
(0191) 	else
(0192) 		CLR_D5;
    02F1 98DD      CBI	0x1B,5
(0193) 	if(bdat6)
    02F2 90200111  LDS	R2,_bdat
    02F4 FE26      SBRS	R2,6
    02F5 C002      RJMP	0x02F8
(0194) 		SET_D6;
    02F6 9ADE      SBI	0x1B,6
    02F7 C001      RJMP	0x02F9
(0195) 	else
(0196) 		CLR_D6;
    02F8 98DE      CBI	0x1B,6
(0197) 	if(bdat7)
    02F9 90200111  LDS	R2,_bdat
    02FB FE27      SBRS	R2,7
    02FC C002      RJMP	0x02FF
(0198) 		SET_D7;
    02FD 9ADF      SBI	0x1B,7
    02FE C001      RJMP	0x0300
(0199) 	else
(0200) 		CLR_D7;
    02FF 98DF      CBI	0x1B,7
(0201) 	DELAY();
    0300 0000      NOP
    0301 0000      NOP
    0302 0000      NOP
    0303 0000      NOP
    0304 0000      NOP
    0305 0000      NOP
    0306 0000      NOP
    0307 0000      NOP
(0202) 	SET_E;	
    0308 9A97      SBI	0x12,7
(0203) 	DELAY();
    0309 0000      NOP
    030A 0000      NOP
    030B 0000      NOP
    030C 0000      NOP
    030D 0000      NOP
    030E 0000      NOP
    030F 0000      NOP
    0310 0000      NOP
(0204) 	CLR_E;
    0311 9897      CBI	0x12,7
(0205) 	DELAY(); 
    0312 0000      NOP
    0313 0000      NOP
    0314 0000      NOP
    0315 0000      NOP
    0316 0000      NOP
    0317 0000      NOP
    0318 0000      NOP
    0319 0000      NOP
(0206) 
(0207) 	if(bdat0)
    031A 90200111  LDS	R2,_bdat
    031C FE20      SBRS	R2,0
    031D C002      RJMP	0x0320
(0208) 		SET_D4;
    031E 9ADC      SBI	0x1B,4
    031F C001      RJMP	0x0321
(0209) 	else
(0210) 		CLR_D4;
    0320 98DC      CBI	0x1B,4
(0211) 	if(bdat1)
    0321 90200111  LDS	R2,_bdat
    0323 FE21      SBRS	R2,1
    0324 C002      RJMP	0x0327
(0212) 		SET_D5;
    0325 9ADD      SBI	0x1B,5
    0326 C001      RJMP	0x0328
(0213) 	else
(0214) 		CLR_D5;
    0327 98DD      CBI	0x1B,5
(0215) 	if(bdat2)
    0328 90200111  LDS	R2,_bdat
    032A FE22      SBRS	R2,2
    032B C002      RJMP	0x032E
(0216) 		SET_D6;
    032C 9ADE      SBI	0x1B,6
    032D C001      RJMP	0x032F
(0217) 	else
(0218) 		CLR_D6;
    032E 98DE      CBI	0x1B,6
(0219) 	if(bdat3)
    032F 90200111  LDS	R2,_bdat
    0331 FE23      SBRS	R2,3
    0332 C002      RJMP	0x0335
(0220) 		SET_D7;
    0333 9ADF      SBI	0x1B,7
    0334 C001      RJMP	0x0336
(0221) 	else
(0222) 		CLR_D7;
    0335 98DF      CBI	0x1B,7
(0223) 	DELAY();
    0336 0000      NOP
    0337 0000      NOP
    0338 0000      NOP
    0339 0000      NOP
    033A 0000      NOP
    033B 0000      NOP
    033C 0000      NOP
    033D 0000      NOP
(0224) 	SET_E;		
    033E 9A97      SBI	0x12,7
(0225) 	DELAY();
    033F 0000      NOP
    0340 0000      NOP
    0341 0000      NOP
    0342 0000      NOP
    0343 0000      NOP
    0344 0000      NOP
    0345 0000      NOP
    0346 0000      NOP
(0226) 	CLR_E;
    0347 9897      CBI	0x12,7
(0227) 	DELAY();
    0348 0000      NOP
    0349 0000      NOP
    034A 0000      NOP
    034B 0000      NOP
    034C 0000      NOP
    034D 0000      NOP
    034E 0000      NOP
    034F 0000      NOP
(0228) }
    0350 940E080E  CALL	pop_gset2
    0352 9508      RET
_LCD1602_setCGRAM:
  i                    --> R20
  buf                  --> R22
  adr                  --> R20
    0353 940E082E  CALL	push_gset2
    0355 01B9      MOVW	R22,R18
    0356 2F40      MOV	R20,R16
(0229) /*--------------------------------------------------------------------
(0230) 函数名称:LCD1602读操作
(0231) 函数功能:
(0232) 注意事项:对于高速CPU,应加延时,好像是废话~
(0233) 提示说明:无
(0234) 输    入:
(0235) 返    回:无
(0236) --------------------------------------------------------------------*/
(0237) //void read(uint8 adr)
(0238) //{	
(0239) //}
(0240) /*--------------------------------------------------------------------
(0241) 函数名称:LCD1602设置CGRAM内容
(0242) 函数功能:
(0243) 注意事项:对于高速CPU,应加延时,好像是废话~
(0244) 提示说明:调用LCD1602_setCG(0,userCh),则写入用户定义的字符"userCh"
(0245) 输    入:"adr"数据范围:0-8,"buf"为用户需要写入的字符"userCh"
(0246) 返    回:无
(0247) --------------------------------------------------------------------*/
(0248) void LCD1602_setCGRAM(uint8 adr,const uint8 buf[8])
(0249) {	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -