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 + -
显示快捷键?