📄 12864_example.lst
字号:
(0185) /********************************************************
(0186) * 函数说明:虚拟端口处理程序 *
(0187) ********************************************************/
(0188) void VirtualPORTProccess(void)
(0189) {
(0190) if (IfPortChange)
_VirtualPORTProccess:
02CF 90200064 LDS R2,IfPortChange
02D1 2022 TST R2
02D2 F021 BEQ 0x02D7
(0191) {
(0192) refreshVirtualPORT();
02D3 D004 RCALL _refreshVirtualPORT
(0193) IfPortChange = False;
02D4 2422 CLR R2
02D5 92200064 STS IfPortChange,R2
(0194) }
02D7 9508 RET
_refreshVirtualPORT:
TempData --> R20
n --> R22
02D8 940E053D CALL push_gset2
(0195) }
(0196)
(0197) /********************************************************
(0198) * 函数说明:刷新虚拟端口函数 *
(0199) ********************************************************/
(0200) void refreshVirtualPORT(void)
(0201) {
(0202) char n = 0;
02DA 2766 CLR R22
(0203) char TempData = 0;
02DB 2744 CLR R20
(0204)
(0205) VRCK = 0;
02DC 91E00079 LDS R30,PORTD_BIT
02DE 91F0007A LDS R31,PORTD_BIT+1
02E0 8180 LDD R24,Z+0
02E1 7F87 ANDI R24,0xF7
02E2 8380 STD Z+0,R24
(0206) for (n=0;n<(VIRTUAL_BIT_COUNT>>3);n++)
02E3 C014 RJMP 0x02F8
(0207) {
(0208) TempData = (VPORT<<(n<<3))>>(VIRTUAL_BIT_COUNT-8);
02E4 2F26 MOV R18,R22
02E5 2733 CLR R19
02E6 0F22 LSL R18
02E7 1F33 ROL R19
02E8 0F22 LSL R18
02E9 1F33 ROL R19
02EA 0F22 LSL R18
02EB 1F33 ROL R19
02EC 91000060 LDS R16,VPORT
02EE 91100061 LDS R17,VPORT+1
02F0 940E0556 CALL lsl16
02F2 01A8 MOVW R20,R16
02F3 2F45 MOV R20,R21
02F4 2755 CLR R21
(0209) sendBITS(TempData);
02F5 2F04 MOV R16,R20
02F6 D010 RCALL _sendBITS
02F7 9563 INC R22
02F8 3062 CPI R22,2
02F9 F350 BCS 0x02E4
(0210) }
(0211) VRCK = 1;
02FA 91E00079 LDS R30,PORTD_BIT
02FC 91F0007A LDS R31,PORTD_BIT+1
02FE 8180 LDD R24,Z+0
02FF 6088 ORI R24,0x8
0300 8380 STD Z+0,R24
(0212) IfPortChange = False;
0301 2422 CLR R2
0302 92200064 STS IfPortChange,R2
0304 940E0531 CALL pop_gset2
0306 9508 RET
_sendBITS:
n --> R20
Data --> R22
0307 940E053D CALL push_gset2
0309 2F60 MOV R22,R16
(0213) }
(0214)
(0215) /********************************************************
(0216) * 函数说明:发送串行数据函数 *
(0217) * 输入: 要发送的字节 *
(0218) ********************************************************/
(0219) void sendBITS(char Data)
(0220) {
(0221) char n = 0;
030A 2744 CLR R20
(0222) for (n = 0;n<8;n++)
030B C025 RJMP 0x0331
(0223) {
(0224) VSCK = 0;
030C 91E00079 LDS R30,PORTD_BIT
030E 91F0007A LDS R31,PORTD_BIT+1
0310 8180 LDD R24,Z+0
0311 7E8F ANDI R24,0xEF
0312 8380 STD Z+0,R24
(0225) if (((Data<<n)& 0x80 )==0)
0313 2F06 MOV R16,R22
0314 2F14 MOV R17,R20
0315 940E055D CALL lsl8
0317 2F80 MOV R24,R16
0318 7880 ANDI R24,0x80
0319 F441 BNE 0x0322
(0226) {
(0227) VSI = 0;
031A 91E00079 LDS R30,PORTD_BIT
031C 91F0007A LDS R31,PORTD_BIT+1
031E 8180 LDD R24,Z+0
031F 7D8F ANDI R24,0xDF
0320 8380 STD Z+0,R24
(0228) }
0321 C007 RJMP 0x0329
(0229) else
(0230) {
(0231) VSI = 1;
0322 91E00079 LDS R30,PORTD_BIT
0324 91F0007A LDS R31,PORTD_BIT+1
0326 8180 LDD R24,Z+0
0327 6280 ORI R24,0x20
0328 8380 STD Z+0,R24
(0232) }
(0233) VSCK = 1; //拉高时钟线
0329 91E00079 LDS R30,PORTD_BIT
032B 91F0007A LDS R31,PORTD_BIT+1
032D 8180 LDD R24,Z+0
032E 6180 ORI R24,0x10
032F 8380 STD Z+0,R24
0330 9543 INC R20
0331 3048 CPI R20,0x8
0332 F408 BCC 0x0334
0333 CFD8 RJMP 0x030C
0334 940E0531 CALL pop_gset2
0336 9508 RET
FILE: G:\单片机\源程序\液晶12864驱动\CGM12864\LCD12864_Example\RD_LCD12864.h
(0001) /********************************************************
(0002) * 函数库说明:12864LCD显示基本驱动函数库 *
(0003) * 版本: v1.0 *
(0004) * 作者: 王卓然 *
(0005) * 日期: 2005年10月7日 *
(0006) * 修改: 王卓然 *
(0007) * 修改日期: 2006年2月16日 *
(0008) * *
(0009) * 说明: *
(0010) * 1、提供基本的现实函数。 *
(0011) * 2、支持小组编程规范0.9版的要求。 *
(0012) * 3、对外提供接口,支持位操作。 *
(0013) * 4、注意,这里的X/Y是屏幕竖方时候的坐标轴, *
(0014) * 如果使用字库,要使用转制过后竖向扫描的 *
(0015) * 字库。 *
(0016) * 5、为了兼容串行扫描方式,所以使用宏定义接口 *
(0017) * 的方法。同时也支持非位操作的方式。 *
(0018) ********************************************************/
(0019) #ifndef _Use_LCD12864
(0020) # define _Use_LCD12864
(0021)
(0022) /***********************
(0023) * 系 统 宏 定 义 *
(0024) ***********************/
(0025)
(0026) /*---------------------*
(0027) * 常 量 宏 定 义 *
(0028) *---------------------*/
(0029) #ifndef True
(0030) # define True 0x01
(0031) #endif
(0032) #ifndef False
(0033) # define False 0x00
(0034) #endif
(0035) #ifndef High
(0036) # define High 0x01
(0037) #endif
(0038) #ifndef Low
(0039) # define Low 0x00
(0040) #endif
(0041) #ifndef NULL
(0042) # define NULL 0x00
(0043) #endif
(0044)
(0045) # define LCD12864_BUSY 7
(0046) # define LCD12864_ON_OFF 5
(0047) # define LCD12864_RESET 4
(0048) # define LCD12864_ON 0x3f
(0049) # define LCD12864_OFF 0x3e
(0050)
(0051) #ifdef _LCD12864_WriteOnly
(0052) #ifndef LCD12864_WaitTime
(0053) # define LCD12864_WaitTime 5
(0054) #endif
(0055) #endif
(0056) /*---------------------*
(0057) * 动 作 宏 定 义 *
(0058) *---------------------*/
(0059) # define LCD12864_SetModel_Data SETBIT_RS;
(0060) # define LCD12864_SetModel_Command CLRBIT_RS;
(0061) # define LCD12864_SetModel_Read SETBIT_RW;SetDataPORTDirection_READ;
(0062) # define LCD12864_SetModel_Write CLRBIT_RW;SetDataPORTDirection_WRITE;
(0063) # define LCD12864_SetEnable SETBIT_E;
(0064) # define LCD12864_SetDisable CLRBIT_E;
(0065) # define LCD12864_ChooseCS1 SETBIT_CS1;CLRBIT_CS2;
(0066) # define LCD12864_ChooseCS2 SETBIT_CS2;CLRBIT_CS1;
(0067) # define LCD12864_ChooseBoth SETBIT_CS1;SETBIT_CS2;
(0068) # define LCD12864_Start CLRBIT_RST;
(0069) # define LCD12864_Reset SETBIT_RST;
(0070)
(0071) # define LCD12864_SetLCD_ON setLCDOnOFF(LCD12864_ON);
(0072) # define LCD12864_SetLCD_OFF setLCDOnOFF(LCD12864_OFF);
(0073)
(0074) /***********************
(0075) * 全局变量声明区 *
(0076) ***********************/
(0077)
(0078) /***********************
(0079) * 系统函数声明区 *
(0080) ***********************/
(0081) void sendDataToLCD(char Data);
(0082) void sendCommandToLCD(char Command);
(0083) void waitForLCDReady(void);
(0084) void setLCDOnOFF(char State);
(0085) void setX(char X);
(0086) void setStartLine(char Y);
(0087) void setY(char Y);
(0088) void ClearLCD(void);
(0089) void LCDDraw(char X,char Y,char Data);
(0090) void LCD12864DispPicture(flash char *PIC,char Width,char Height,char Top,char Left);
(0091)
(0092) /********************************************************
(0093) * 函数说明:检测LCD状态函数 *
(0094) ********************************************************/
(0095) void waitForLCDReady(void)
(0096) {
(0097) #ifndef _LCD12864_WriteOnly
(0098) LCD12864_SetModel_Command;
(0099) LCD12864_SetModel_Read;
(0100)
(0101) do
(0102) {
(0103) LCD12864_SetEnable;
(0104) }
(0105) while ((ReadDataPORT & (1<<LCD12864_BUSY)));
(0106) #else
(0107) char a = 0;
_waitForLCDReady:
a --> R16
0337 2700 CLR R16
(0108) for (a=0;a<LCD12864_WaitTime;a++)
0338 C002 RJMP 0x033B
(0109) {
(0110) asm("nop");
0339 0000 NOP
033A 9503 INC R16
033B 3001 CPI R16,1
033C F3E0 BCS 0x0339
033D 9508 RET
_sendDataToLCD:
Data --> R20
033E 940E053F CALL push_gset1
0340 2F40 MOV R20,R16
(0111) }
(0112) #endif
(0113) }
(0114)
(0115)
(0116) /********************************************************
(0117) * 函数说明:发送数据函数 *
(0118) * 输入: 需要发送的数据 *
(0119) ********************************************************/
(0120) void sendDataToLCD(char Data)
(0121) {
(0122) waitForLCDReady();
0341 DFF5 RCALL _waitForLCDReady
(0123)
(0124)
(0125) LCD12864_SetModel_Data;
0342 91E00062 LDS R30,VPORTBit
0344 91F00063 LDS R31,VPORTBit+1
0346 8180 LDD R24,Z+0
0347 6081 ORI R24,1
0348 8380 STD Z+0,R24
(0126) LCD12864_SetModel_Write;
0349 91E00062 LDS R30,VPORTBit
034B 91F00063 LDS R31,VPORTBit+1
034D 8180 LDD R24,Z+0
034E 7F8D ANDI R24,0xFD
034F 8380 STD Z+0,R24
(0127)
(0128) //DataPORT = Data;
(0129) LCD12864_DataTransfer(Data);
0350 91800060 LDS R24,VPORT
0352 91900061 LDS R25,VPORT+1
0354 7090 ANDI R25,0
0355 93900061 STS VPORT+1,R25
0357 93800060 STS VPORT,R24
0359 2E24 MOV R2,R20
035A 2433 CLR R3
035B 2C32 MOV R3,R2
035C 2422 CLR R2
035D 012C MOVW R4,R24
035E 2842 OR R4,R2
035F 2853 OR R5,R3
0360 92500061 STS VPORT+1,R5
0362 92400060 STS VPORT,R4
0364 DF73 RCALL _refreshVirtualPORT
(0130)
(0131)
(0132) LCD12864_SetEnable;
0365 91E00062 LDS R30,VPORTBit
0367 91F00063 LDS R31,VPORTBit+1
0369 8180 LDD R24,Z+0
036A 6084 ORI R24,4
036B 8380 STD Z+0,R24
036C DF6B RCALL _refreshVirtualPORT
(0133) LCD12864_SetDisable;
036D 91E00062 LDS R30,VPORTBit
036F 91F00063 LDS R31,VPORTBit+1
0371 8180 LDD R24,Z+0
0372 7F8B ANDI R24,0xFB
0373 8380 STD Z+0,R24
0374 DF63 RCALL _refreshVirtualPORT
0375 940E0542 CALL pop_gset1
0377 9508 RET
_sendCommandToLCD:
Command --> R20
0378 940E053F CALL push_gset1
037A 2F40 MOV R20,R16
(0134) }
(0135)
(0136) /********************************************************
(0137) * 函数说明:发送指令函数 *
(0138) * 输入: 需要发送的指令 *
(0139) ********************************************************/
(0140) void sendCommandToLCD(char Command)
(0141) {
(0142) waitForLCDReady();
037B DFBB RCALL _waitForLCDReady
(0143)
(0144) LCD12864_SetModel_Command;
037C 91E00062 LDS R30,VPORTBit
037E 91F00063 LDS R31,VPORTBit+1
0380 8180 LDD R24,Z+0
0381 7F8E ANDI R24,0xFE
0382 8380 STD Z+0,R24
(0145) LCD12864_SetModel_Write;
0383 91E00062 LDS R30,VPORTBit
0385 91F00063 LDS R31,VPORTBit+1
0387 8180 LDD R24,Z+0
0388 7F8D ANDI R24,0xFD
0389 8380 STD Z+0,R24
(0146)
(0147) //DataPORT = Command;
(0148)
(0149) LCD12864_DataTransfer(Command);
038A 91800060 LDS R24,VPORT
038C 91900061 LDS R25,VPORT+1
038E 7090 ANDI R25,0
038F 93900061 STS VPORT+1,R25
0391 93800060 STS VPORT,R24
0393 2E24 MOV R2,R20
0394 2433 CLR R3
0395 2C32 MOV R3,R2
0396 2422 CLR R2
0397 012C MOVW R4,R24
0398 2842 OR R4,R2
0399 2853 OR R5,R3
039A 92500061 STS VPORT+1,R5
039C 92400060 STS VPORT,R4
039E DF39 RCALL _refreshVirtualPORT
(0150)
(0151) LCD12864_SetEnable;
039F 91E00062 LDS R30,VPORTBit
03A1 91F00063 LDS R31,VPORTBit+1
03A3 8180 LDD R24,Z+0
03A4 6084 ORI R24,4
03A5 8380 STD Z+0,R24
03A6 DF31 RCALL _refreshVirtualPORT
(0152) LCD12864_SetDisable;
03A7 91E00062 LDS R30,VPORTBit
03A9 91F00063 LDS R31,VPORTBit+1
03AB 8180 LDD R24,Z+0
03AC 7F8B ANDI R24,0xFB
03AD 8380 STD Z+0,R24
03AE DF29 RCALL _refreshVirtualPORT
03AF 940E0542 CALL pop_gset1
03B1 9508 RET
_setX:
X --> R20
03B2 940E053F CALL push_gset1
03B4 2F40 MOV R20,R16
(0153) }
(0154)
(0155) /********************************************************
(0156) * 函数说明:设置显示列(竖向) *
(0157) * 输入: 列号(0~7) *
(0158) ********************************************************/
(0159) void setX(char X)
(0160) {
(0161) X &= 0x07;
03B5 7047 ANDI R20,7
(0162) X |= 0xb8;
03B6 6B48 ORI R20,0xB8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -