📄 lcd1602.lst
字号:
(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 + -