📄 128_lcd.lst
字号:
08C8 F019 BEQ 0x08CC
(0154) {
(0155) //Hex2Ascii(KeyNew);
(0156) //GUI_PutString(0,0,p);
(0157)
(0158) KeyDown = 0;
08C9 2422 CLR R2
08CA 9220014C STS KeyDown,R2
08CC CFF7 RJMP 0x08C4
08CD 962E ADIW R28,0xE
08CE 9508 RET
_LCD_WriteCommand:
comd0 --> R20
08CF 940E3BA9 CALL push_gset1
08D1 2F40 MOV R20,R16
FILE: G:\IccPro\mega128_lcd\lcddrive.c
(0001) /****************************************************************************************
(0002) * 文件名:LCDDRIVE.C
(0003) * 功能:图形液晶240*128驱动(型号为SMG240128A)。32K显示存,0000H-7FFFH地址。显示是横向字节,高位
(0004) * 在前。
(0005) * 说明:图形液晶采用T6963C为LCD控制芯片,内带负压产生器,单5伏供电,并行接口(使用LPC2210驱动)。
(0006) * 硬件连接: D0--D7 <===> D0--D7
(0007) * /WR <===> nWE
(0008) * /RD <===> nOE
(0009) * /CE <===> nCS3_1
(0010) * C/D <===> A1
(0011) *
(0012) * /RST <===> VCC
(0013) ****************************************************************************************/
(0014) #include "config.h"
(0015)
(0016) TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8]; // 声明GUI显示缓冲区
(0017)
(0018) /* 定义LCM地址 */
(0019) //#define TG240128_COM (*((volatile unsigned short *) 0x83000002))
(0020) //#define TG240128_DAT (*((volatile unsigned short *) 0x83000000))
(0021)
(0022)
(0023) /* 以下为LCM的驱动层,主要负责发送T6963的各种命令,提供设置显示地址等功能,在发送命令前会检测其状态字。带参数命令模式:先参数,后命令;操作模式:先命令,后数据 */
(0024)
(0025) /* T6963C 命令定义 */
(0026) #define LCD_CUR_POS 0x21 /* 光标位置设置(只有设置到有效显示地址并打开显示时才看到) */
(0027) #define LCD_CGR_POS 0x22 /* CGRAM偏置地址设置(可以增加自已的符号) */
(0028) #define LCD_ADR_POS 0x24 /* 地址指针位置(设置读写操作指针) */
(0029)
(0030) #define LCD_TXT_STP 0x40 /* 文本区首址(从此地址开始向屏幕左上角显示字符) */
(0031) #define LCD_TXT_WID 0x41 /* 文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
(0032) #define LCD_GRH_STP 0x42 /* 图形区首址(从此地址开始向屏幕左上角显示点) */
(0033) #define LCD_GRH_WID 0x43 /* 图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
(0034)
(0035) #define LCD_MOD_OR 0x80 /* 显示方式:逻辑或 */
(0036) #define LCD_MOD_XOR 0x81 /* 显示方式:逻辑异或 */
(0037) #define LCD_MOD_AND 0x82 /* 显示方式:逻辑与 */
(0038) #define LCD_MOD_TCH 0x83 /* 显示方式:文本特征 */
(0039)
(0040) #define LCD_DIS_SW 0x90 /* 显示开关:D0=1/0,光标闪烁启用/禁用 */
(0041) /* D1=1/0,光标显示启用/禁用 */
(0042) /* D2=1/0,文本显示启用/禁用(打开后再使用) */
(0043) /* D3=1/0,图形显示启用/禁用(打开后再使用) */
(0044)
(0045) #define LCD_CUR_SHP 0xA0 /* 光标形状选择:0xA0-0xA7表示光标占的行数 */
(0046)
(0047) #define LCD_AUT_WR 0xB0 /* 自动写设置 */
(0048) #define LCD_AUT_RD 0xB1 /* 自动读设置 */
(0049) #define LCD_AUT_OVR 0xB2 /* 自动读/写结束 */
(0050)
(0051) #define LCD_INC_WR 0xC0 /* 数据一次写,地址加1 */
(0052) #define LCD_INC_RD 0xC1 /* 数据一次读,地址加1 */
(0053) #define LCD_DEC_WR 0xC2 /* 数据一次写,地址减1 */
(0054) #define LCD_DEC_RD 0xC3 /* 数据一次读,地址减1 */
(0055) #define LCD_NOC_WR 0xC4 /* 数据一次写,地址不变 */
(0056) #define LCD_NOC_RD 0xC5 /* 数据一次读,地址不变 */
(0057)
(0058) #define LCD_SCN_RD 0xE0 /* 屏读 */
(0059)
(0060) #define LCD_SCN_CP 0xE8 /* 屏拷贝 */
(0061)
(0062) #define LCD_BIT_OP 0xF0 /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 */
(0063)
(0064) #define CMD_MODE (PORTD|=0X04)
(0065) #define DATA_MODE (PORTD&=0XFB)
(0066) #define CLOSE_READ (PORTD|0X02)
(0067) #define WRITE_MODE (PORTD&0XFE)
(0068) #define CLOSE_WRITE (PORTD|0X01)
(0069) #define READ_MODE (PORTD&0XFD)
(0070) #define ENABLE_LCD (PORTD&=0XF7)
(0071) #define DISABLE_LCD (PORTD|=0X08)
(0072) /***********************************************************************
(0073) * 名称:LCD_WriteCommand()
(0074) * 功能:写命令子程序。(发送命令前,不检查液晶模块的状态)
(0075) * 入口参数:command 要写入LCM的命令字
(0076) * 出口参数:无
(0077) * 说明:函数会设置LCM数据总线为输出方式
(0078) ***********************************************************************/
(0079) void LCD_WriteCommand(unsigned char comd0)
(0080) {
(0081) LCD_TestStaBit01();
08D2 D033 RCALL _LCD_TestStaBit01
(0082) DDRB=0xff; //A口方向为输出
08D3 EF8F LDI R24,0xFF
08D4 BB87 OUT 0x17,R24
(0083) PORTB=comd0; //送数据到A口寄存器
08D5 BB48 OUT 0x18,R20
(0084) DDRD|=(1<<7);
08D6 9A8F SBI 0x11,7
(0085) PORTD&=~(1<<7); // /WR=0
08D7 9897 CBI 0x12,7
(0086) NOP();
08D8 0000 NOP
(0087) PORTD|=(1<<7); // /WR=1
08D9 9A97 SBI 0x12,7
08DA 940E3BAC CALL pop_gset1
08DC 9508 RET
_LCD_WriteData:
dat --> R20
08DD 940E3BA9 CALL push_gset1
08DF 2F40 MOV R20,R16
(0088) }
(0089)
(0090) /***********************************************************************
(0091) * 名称:LCD_WriteData()
(0092) * 功能:写数据子程序。(发送数据前,不检查液晶模块的状态)
(0093) * 入口参数:dat 要写入LCM的数据
(0094) * 出口参数:无
(0095) * 说明:函数会设置LCM数据总线为输出方式
(0096) ***********************************************************************/
(0097) void LCD_WriteData(unsigned char dat)
(0098) {
(0099) LCD_TestStaBit01();
08E0 D025 RCALL _LCD_TestStaBit01
(0100) DDRD|=(1<<3);
08E1 9A8B SBI 0x11,3
(0101) PORTD&=~(1<<3); // C/D=0,数据通道
08E2 9893 CBI 0x12,3
(0102) DDRB=0xff; //A口方向为输出
08E3 EF8F LDI R24,0xFF
08E4 BB87 OUT 0x17,R24
(0103) PORTB=dat; //送数据到A口寄存器
08E5 BB48 OUT 0x18,R20
(0104) DDRD|=(1<<7);
08E6 9A8F SBI 0x11,7
(0105) PORTD&=~(1<<7); // /WR=0
08E7 9897 CBI 0x12,7
(0106) NOP();
08E8 0000 NOP
(0107) PORTD|=(1<<7); // /WR=1
08E9 9A97 SBI 0x12,7
08EA 940E3BAC CALL pop_gset1
08EC 9508 RET
(0108) }
(0109)
(0110)
(0111)
(0112) /***********************************************************************
(0113) * 名称:LCD_ReadState()
(0114) * 功能:读取状态字子程序。
(0115) * 入口参数:无
(0116) * 出口参数:返回值即为读出的状态字
(0117) * 说明:函数会设置LCM数据总线为输入方式
(0118) ***********************************************************************/
(0119) unsigned LCD_ReadState(void)
(0120) {
(0121) unsigned char lcd_state;
(0122) DDRB=0x00;
_LCD_ReadState:
lcd_state --> R16
08ED 2422 CLR R2
08EE BA27 OUT 0x17,R2
(0123) DDRD|=(1<<3);
08EF 9A8B SBI 0x11,3
(0124) DDRD|=(1<<6);
08F0 9A8E SBI 0x11,6
(0125) PORTD|=(1<<3); // C/D=1
08F1 9A93 SBI 0x12,3
(0126) PORTD&=~(1<<6); // /RD=0
08F2 9896 CBI 0x12,6
(0127) lcd_state=PINB&0xff; // 读取引脚A物理电平
08F3 B306 IN R16,0x16
08F4 7F0F ANDI R16,0xFF
(0128) NOP();
08F5 0000 NOP
(0129) NOP();
08F6 0000 NOP
(0130) PORTD|=(1<<6); // /RD=1
08F7 9A96 SBI 0x12,6
(0131) return lcd_state;
08F8 2711 CLR R17
08F9 9508 RET
(0132) }
(0133)
(0134)
(0135) /***********************************************************************
(0136) * 名称:LCD_ReadData()
(0137) * 功能:读取数据子程序。
(0138) * 入口参数:无
(0139) * 出口参数:返回值即为读出的数据
(0140) * 说明:函数会设置LCM数据总线为输入方式
(0141) ***********************************************************************/
(0142) unsigned char LCD_ReadData()
(0143) {
(0144) unsigned char lcd_state;
(0145) DDRB=0x00;
_LCD_ReadData:
lcd_state --> R16
08FA 2422 CLR R2
08FB BA27 OUT 0x17,R2
(0146) DDRD|=(1<<3);
08FC 9A8B SBI 0x11,3
(0147) DDRD|=(1<<6);
08FD 9A8E SBI 0x11,6
(0148) PORTD&=~(1<<3); // C/D=0
08FE 9893 CBI 0x12,3
(0149) PORTD&=~(1<<6); // /RD=0
08FF 9896 CBI 0x12,6
(0150) lcd_state=PINB&0xff; // 读取引脚A物理电平
0900 B306 IN R16,0x16
0901 7F0F ANDI R16,0xFF
(0151) NOP();
0902 0000 NOP
(0152) NOP();
0903 0000 NOP
(0153) PORTD|=(1<<6); // /RD=1
0904 9A96 SBI 0x12,6
(0154) return lcd_state;
0905 9508 RET
(0155) }
(0156) /***********************************************************************
(0157) * 名称:LCD_TestStaBit01()
(0158) * 功能:判断读写指令和读写数据是否允许。
(0159) * 入口参数:无
(0160) * 出口参数:返回0表示禁止,否则表示允许
(0161) ***********************************************************************/
(0162) uint8 LCD_TestStaBit01(void)
(0163) { /*uint8 i;
(0164)
(0165) for(i=100; i>0; i--)
(0166) { if( (LCD_ReadState()&0x03)==0x03 ) break;
(0167) }
(0168)
(0169) return(i);*/
(0170) while((LCD_ReadState()&0x03)!=3);
_LCD_TestStaBit01:
0906 DFE6 RCALL _LCD_ReadState
0907 01C8 MOVW R24,R16
0908 7083 ANDI R24,3
0909 7090 ANDI R25,0
090A 3083 CPI R24,3
090B E0E0 LDI R30,0
090C 079E CPC R25,R30
090D F7C1 BNE 0x0906
090E 9508 RET
_LCD_TestStaBit3:
i --> R20
090F 940E3BA9 CALL push_gset1
(0171) }
(0172)
(0173) /***********************************************************************
(0174) * 名称:LCD_TestStaBit3()
(0175) * 功能:数据自动写状态是否允许。
(0176) * 入口参数:无
(0177) * 出口参数:返回0表示禁止,否则表示允许
(0178) ***********************************************************************/
(0179) uint8 LCD_TestStaBit3(void)
(0180) { uint8 i;
(0181)
(0182) for(i=100; i>0; i--)
0911 E644 LDI R20,0x64
0912 C00A RJMP 0x091D
(0183) { if( (LCD_ReadState()&0x08)==0x08 ) break;
0913 DFD9 RCALL _LCD_ReadState
0914 01C8 MOVW R24,R16
0915 7088 ANDI R24,0x8
0916 7090 ANDI R25,0
0917 3088 CPI R24,0x8
0918 E0E0 LDI R30,0
0919 079E CPC R25,R30
091A F409 BNE 0x091C
091B C004 RJMP 0x0920
091C 954A DEC R20
091D 2422 CLR R2
091E 1624 CP R2,R20
091F F398 BCS 0x0913
(0184) }
(0185)
(0186) return(i);
0920 2F04 MOV R16,R20
0921 940E3BAC CALL pop_gset1
0923 9508 RET
_LCD_WriteTCommand1:
command --> R20
0924 940E3BA9 CALL push_gset1
0926 2F40 MOV R20,R16
(0187) }
(0188)
(0189)
(0190) /***********************************************************************
(0191) * 名称:LCD_WriteTCommand1()
(0192) * 功能:写无参数命令子程序。会先判断LCM状态字。
(0193) * 入口参数:command 要写入LCM的命令字
(0194) * 出口参数:操作出错返回0,否则返回1
(0195) ***********************************************************************/
(0196) uint8 LCD_WriteTCommand1(uint8 command)
(0197) { if( LCD_TestStaBit01()==0 ) return(0);
0927 DFDE RCALL _LCD_TestStaBit01
0928 2300 TST R16
0929 F411 BNE 0x092C
092A 2700 CLR R16
092B C003 RJMP 0x092F
(0198) LCD_WriteCommand(command); // 发送命令字
092C 2F04 MOV R16,R20
092D DFA1 RCALL _LCD_WriteCommand
(0199)
(0200) return(1);
092E E001 LDI R16,1
092F 940E3BAC CALL pop_gset1
0931 9508 RET
_LCD_WriteTCommand3:
dat2 --> Y+4
dat1 --> R22
command --> R20
0932 940E3BA7 CALL push_gset2
0934 2F62 MOV R22,R18
0935 2F40 MOV R20,R16
(0201) }
(0202)
(0203)
(0204) /***********************************************************************
(0205) * 名称:LCD_WriteTCommand3()
(0206) * 功能:写双参数命令子程序。会先判断LCM状态字。
(0207) * 入口参数:command 要写入LCM的命令字
(0208) * dat1 参数1
(0209) * dat2 参数2
(0210) * 出口参数:操作出错返回0,否则返回1
(0211) * 说明:先发送两字节参数据数据,再发送命令字
(0212) ***********************************************************************/
(0213) uint8 LCD_WriteTCommand3(uint8 command, uint8 dat1, uint8 dat2)
(0214) { if( LCD_TestStaBit01()==0 ) return(0);
0936 DFCF RCALL _LCD_TestStaBit01
0937 2300 TST R16
0938 F411 BNE 0x093B
0939 2700 CLR R16
093A C011 RJMP 0x094C
(0215) LCD_WriteData(dat1); // 发送数据1
093B 2F06 MOV R16,R22
093C DFA0 RCALL _LCD_WriteData
(0216)
(0217) if( LCD_TestStaBit01()==0 ) return(0);
093D DFC8 RCALL _LCD_TestStaBit01
093E 2300 TST R16
093F F411 BNE 0x0942
0940 2700 CLR R16
0941 C00A RJMP 0x094C
(0218) LCD_WriteData(dat2); // 发送数据2
0942 810C LDD R16,Y+4
0943 DF99 RCALL _LCD_WriteData
(0219)
(0220) if( LCD_TestStaBit01()==0 ) return(0);
0944 DFC1 RCALL _LCD_TestStaBit01
0945 2300 TST R16
0946 F411 BNE 0x0949
0947 2700 CLR R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -