cycle.lst

来自「ATmega16应用例子」· LST 代码 · 共 2,013 行 · 第 1/5 页

LST
2,013
字号
(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
    0251 2722      CLR	R18
    0252 2733      CLR	R19
(0122) 	bool busySta;		//用于探测 lcd busy status
(0123) 	IN_BF;
    0253 98D7      CBI	0x1A,7
(0124) 	SET_D4;
    0254 9ADC      SBI	0x1B,4
(0125) 	SET_D5;
    0255 9ADD      SBI	0x1B,5
(0126) 	SET_D6;
    0256 9ADE      SBI	0x1B,6
(0127) 	SET_D7;
    0257 9ADF      SBI	0x1B,7
(0128) 	DELAY();
    0258 0000      NOP
    0259 0000      NOP
    025A 0000      NOP
    025B 0000      NOP
    025C 0000      NOP
    025D 0000      NOP
    025E 0000      NOP
    025F 0000      NOP
(0129) 	CLR_RS;
    0260 9895      CBI	0x12,5
(0130) 	DELAY();
    0261 0000      NOP
    0262 0000      NOP
    0263 0000      NOP
    0264 0000      NOP
    0265 0000      NOP
    0266 0000      NOP
    0267 0000      NOP
    0268 0000      NOP
(0131) 	SET_RW;
    0269 9A96      SBI	0x12,6
(0132) 	DELAY();
    026A 0000      NOP
    026B 0000      NOP
    026C 0000      NOP
    026D 0000      NOP
    026E 0000      NOP
    026F 0000      NOP
    0270 0000      NOP
    0271 0000      NOP
(0133) 
(0134) 	do
(0135) 	{
(0136) 		SET_E;   
    0272 9A97      SBI	0x12,7
(0137) 		DELAY();
    0273 0000      NOP
    0274 0000      NOP
    0275 0000      NOP
    0276 0000      NOP
    0277 0000      NOP
    0278 0000      NOP
    0279 0000      NOP
    027A 0000      NOP
(0138) /* 这里读取AC4-AC6位及BF的值,程序不需记录AC4-AC6的值,所以不存储 */
(0139) 		busySta=(bool)GET_BF;  
    027B B309      IN	R16,0x19
    027C 2711      CLR	R17
    027D 7800      ANDI	R16,0x80
    027E 7010      ANDI	R17,0
(0140) 		CLR_E;
    027F 9897      CBI	0x12,7
(0141) 		DELAY(); 
    0280 0000      NOP
    0281 0000      NOP
    0282 0000      NOP
    0283 0000      NOP
    0284 0000      NOP
    0285 0000      NOP
    0286 0000      NOP
    0287 0000      NOP
(0142) /* 读取 "BUSY"时,"D4-D7"状态可能已经改变,必须再次设为输出"1" */
(0143) 		SET_D4;
    0288 9ADC      SBI	0x1B,4
(0144) 		SET_D5;
    0289 9ADD      SBI	0x1B,5
(0145) 		SET_D6;
    028A 9ADE      SBI	0x1B,6
(0146) 		SET_D7;
    028B 9ADF      SBI	0x1B,7
(0147) 		DELAY();
    028C 0000      NOP
    028D 0000      NOP
    028E 0000      NOP
    028F 0000      NOP
    0290 0000      NOP
    0291 0000      NOP
    0292 0000      NOP
    0293 0000      NOP
(0148) 		SET_E;   
    0294 9A97      SBI	0x12,7
(0149) 		DELAY();
    0295 0000      NOP
    0296 0000      NOP
    0297 0000      NOP
    0298 0000      NOP
    0299 0000      NOP
    029A 0000      NOP
    029B 0000      NOP
    029C 0000      NOP
(0150) /* 这里读取AC0-AC3位的值,程序不需记录AC0-AC3的值,所以不存储 */
(0151) 		CLR_E;   
    029D 9897      CBI	0x12,7
(0152) 		DELAY();
    029E 0000      NOP
    029F 0000      NOP
    02A0 0000      NOP
    02A1 0000      NOP
    02A2 0000      NOP
    02A3 0000      NOP
    02A4 0000      NOP
    02A5 0000      NOP
(0153) 		if(busyCounter==1000)
    02A6 3E28      CPI	R18,0xE8
    02A7 E0E3      LDI	R30,3
    02A8 073E      CPC	R19,R30
    02A9 F421      BNE	0x02AE
(0154) 		{
(0155) 			LCD1602Err=TRUE;	//标识LCD1602错误,方便上缴系统报错
    02AA E081      LDI	R24,1
    02AB 93800060  STS	LCD1602Err,R24
(0156) 			return ;			//避免由于LCD1602错误而导致程序阻塞
    02AD C00A      RJMP	0x02B8
(0157) 		}
(0158) 		busyCounter++;
    02AE 5F2F      SUBI	R18,0xFF
    02AF 4F3F      SBCI	R19,0xFF
(0159) 	}
(0160) 	while(busySta);
    02B0 2300      TST	R16
    02B1 F009      BEQ	0x02B3
    02B2 CFBF      RJMP	0x0272
(0161) 
(0162) 	LCD1602Err=FALSE;
    02B3 2422      CLR	R2
    02B4 92200060  STS	LCD1602Err,R2
(0163) 	CLR_E;
    02B6 9897      CBI	0x12,7
(0164) 	OUT_BF;
    02B7 9AD7      SBI	0x1A,7
    02B8 9508      RET
_write:
  dat                  --> R22
  flag                 --> R20
    02B9 940E07D7  CALL	push_gset2
    02BB 2F62      MOV	R22,R18
    02BC 2F40      MOV	R20,R16
(0165) }
(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;
    02BD 93600111  STS	bdat,R22
(0177) 	busy();
    02BF DF91      RCALL	_busy
(0178) 	if(flag)
    02C0 2344      TST	R20
    02C1 F011      BEQ	0x02C4
(0179) 		SET_RS;
    02C2 9A95      SBI	0x12,5
    02C3 C001      RJMP	0x02C5
(0180) 	else
(0181) 		CLR_RS;
    02C4 9895      CBI	0x12,5
(0182) 	DELAY();
    02C5 0000      NOP
    02C6 0000      NOP
    02C7 0000      NOP
    02C8 0000      NOP
    02C9 0000      NOP
    02CA 0000      NOP
    02CB 0000      NOP
    02CC 0000      NOP
(0183) 	CLR_RW;
    02CD 9896      CBI	0x12,6
(0184) 	DELAY();
    02CE 0000      NOP
    02CF 0000      NOP
    02D0 0000      NOP
    02D1 0000      NOP
    02D2 0000      NOP
    02D3 0000      NOP
    02D4 0000      NOP
    02D5 0000      NOP
(0185) 	if(bdat4)
    02D6 90200111  LDS	R2,bdat
    02D8 FE24      SBRS	R2,4
    02D9 C002      RJMP	0x02DC
(0186) 		SET_D4;
    02DA 9ADC      SBI	0x1B,4
    02DB C001      RJMP	0x02DD
(0187) 	else
(0188) 		CLR_D4;
    02DC 98DC      CBI	0x1B,4
(0189) 	if(bdat5)
    02DD 90200111  LDS	R2,bdat
    02DF FE25      SBRS	R2,5
    02E0 C002      RJMP	0x02E3
(0190) 		SET_D5;
    02E1 9ADD      SBI	0x1B,5
    02E2 C001      RJMP	0x02E4
(0191) 	else
(0192) 		CLR_D5;
    02E3 98DD      CBI	0x1B,5
(0193) 	if(bdat6)
    02E4 90200111  LDS	R2,bdat
    02E6 FE26      SBRS	R2,6
    02E7 C002      RJMP	0x02EA
(0194) 		SET_D6;
    02E8 9ADE      SBI	0x1B,6
    02E9 C001      RJMP	0x02EB
(0195) 	else
(0196) 		CLR_D6;
    02EA 98DE      CBI	0x1B,6
(0197) 	if(bdat7)
    02EB 90200111  LDS	R2,bdat
    02ED FE27      SBRS	R2,7
    02EE C002      RJMP	0x02F1
(0198) 		SET_D7;
    02EF 9ADF      SBI	0x1B,7
    02F0 C001      RJMP	0x02F2
(0199) 	else
(0200) 		CLR_D7;
    02F1 98DF      CBI	0x1B,7
(0201) 	DELAY();
    02F2 0000      NOP
    02F3 0000      NOP
    02F4 0000      NOP
    02F5 0000      NOP
    02F6 0000      NOP
    02F7 0000      NOP
    02F8 0000      NOP
    02F9 0000      NOP
(0202) 	SET_E;	
    02FA 9A97      SBI	0x12,7
(0203) 	DELAY();
    02FB 0000      NOP
    02FC 0000      NOP
    02FD 0000      NOP
    02FE 0000      NOP
    02FF 0000      NOP
    0300 0000      NOP
    0301 0000      NOP
    0302 0000      NOP
(0204) 	CLR_E;
    0303 9897      CBI	0x12,7
(0205) 	DELAY(); 
    0304 0000      NOP
    0305 0000      NOP
    0306 0000      NOP
    0307 0000      NOP
    0308 0000      NOP
    0309 0000      NOP
    030A 0000      NOP
    030B 0000      NOP
(0206) 
(0207) 	if(bdat0)
    030C 90200111  LDS	R2,bdat
    030E FE20      SBRS	R2,0
    030F C002      RJMP	0x0312
(0208) 		SET_D4;
    0310 9ADC      SBI	0x1B,4
    0311 C001      RJMP	0x0313
(0209) 	else
(0210) 		CLR_D4;
    0312 98DC      CBI	0x1B,4
(0211) 	if(bdat1)
    0313 90200111  LDS	R2,bdat
    0315 FE21      SBRS	R2,1
    0316 C002      RJMP	0x0319
(0212) 		SET_D5;
    0317 9ADD      SBI	0x1B,5
    0318 C001      RJMP	0x031A
(0213) 	else
(0214) 		CLR_D5;
    0319 98DD      CBI	0x1B,5
(0215) 	if(bdat2)
    031A 90200111  LDS	R2,bdat
    031C FE22      SBRS	R2,2
    031D C002      RJMP	0x0320
(0216) 		SET_D6;
    031E 9ADE      SBI	0x1B,6
    031F C001      RJMP	0x0321
(0217) 	else
(0218) 		CLR_D6;
    0320 98DE      CBI	0x1B,6
(0219) 	if(bdat3)
    0321 90200111  LDS	R2,bdat
    0323 FE23      SBRS	R2,3
    0324 C002      RJMP	0x0327
(0220) 		SET_D7;
    0325 9ADF      SBI	0x1B,7
    0326 C001      RJMP	0x0328
(0221) 	else
(0222) 		CLR_D7;
    0327 98DF      CBI	0x1B,7
(0223) 	DELAY();
    0328 0000      NOP
    0329 0000      NOP
    032A 0000      NOP
    032B 0000      NOP
    032C 0000      NOP
    032D 0000      NOP
    032E 0000      NOP
    032F 0000      NOP
(0224) 	SET_E;		
    0330 9A97      SBI	0x12,7
(0225) 	DELAY();
    0331 0000      NOP
    0332 0000      NOP
    0333 0000      NOP
    0334 0000      NOP
    0335 0000      NOP
    0336 0000      NOP
    0337 0000      NOP
    0338 0000      NOP
(0226) 	CLR_E;
    0339 9897      CBI	0x12,7
(0227) 	DELAY();
    033A 0000      NOP
    033B 0000      NOP
    033C 0000      NOP
    033D 0000      NOP
    033E 0000      NOP
    033F 0000      NOP
    0340 0000      NOP
    0341 0000      NOP
    0342 940E07C8  CALL	pop_gset2
    0344 9508      RET
_LCD1602_setCGRAM:
  i                    --> R20
  buf                  --> R22
  adr                  --> R20
    0345 940E07D7  CALL	push_gset2
    0347 01B9      MOVW	R22,R18
    0348 2F40      MOV	R20,R16
(0228) }
(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 + =
减小字号Ctrl + -
显示快捷键?