📄 lcddrive.s
字号:
.module lcddrive.c
.area text(rom, con, rel)
.dbfile G:\IccPro\mega128_lcd\lcddrive.c
.dbfunc e LCD_WriteCommand _LCD_WriteCommand fV
; comd0 -> R20
.even
_LCD_WriteCommand::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 80
; /****************************************************************************************
; * 文件名:LCDDRIVE.C
; * 功能:图形液晶240*128驱动(型号为SMG240128A)。32K显示存,0000H-7FFFH地址。显示是横向字节,高位
; * 在前。
; * 说明:图形液晶采用T6963C为LCD控制芯片,内带负压产生器,单5伏供电,并行接口(使用LPC2210驱动)。
; * 硬件连接: D0--D7 <===> D0--D7
; * /WR <===> nWE
; * /RD <===> nOE
; * /CE <===> nCS3_1
; * C/D <===> A1
; *
; * /RST <===> VCC
; ****************************************************************************************/
; #include "config.h"
;
; TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8]; // 声明GUI显示缓冲区
;
; /* 定义LCM地址 */
; //#define TG240128_COM (*((volatile unsigned short *) 0x83000002))
; //#define TG240128_DAT (*((volatile unsigned short *) 0x83000000))
;
;
; /* 以下为LCM的驱动层,主要负责发送T6963的各种命令,提供设置显示地址等功能,在发送命令前会检测其状态字。带参数命令模式:先参数,后命令;操作模式:先命令,后数据 */
;
; /* T6963C 命令定义 */
; #define LCD_CUR_POS 0x21 /* 光标位置设置(只有设置到有效显示地址并打开显示时才看到) */
; #define LCD_CGR_POS 0x22 /* CGRAM偏置地址设置(可以增加自已的符号) */
; #define LCD_ADR_POS 0x24 /* 地址指针位置(设置读写操作指针) */
;
; #define LCD_TXT_STP 0x40 /* 文本区首址(从此地址开始向屏幕左上角显示字符) */
; #define LCD_TXT_WID 0x41 /* 文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
; #define LCD_GRH_STP 0x42 /* 图形区首址(从此地址开始向屏幕左上角显示点) */
; #define LCD_GRH_WID 0x43 /* 图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
;
; #define LCD_MOD_OR 0x80 /* 显示方式:逻辑或 */
; #define LCD_MOD_XOR 0x81 /* 显示方式:逻辑异或 */
; #define LCD_MOD_AND 0x82 /* 显示方式:逻辑与 */
; #define LCD_MOD_TCH 0x83 /* 显示方式:文本特征 */
;
; #define LCD_DIS_SW 0x90 /* 显示开关:D0=1/0,光标闪烁启用/禁用 */
; /* D1=1/0,光标显示启用/禁用 */
; /* D2=1/0,文本显示启用/禁用(打开后再使用) */
; /* D3=1/0,图形显示启用/禁用(打开后再使用) */
;
; #define LCD_CUR_SHP 0xA0 /* 光标形状选择:0xA0-0xA7表示光标占的行数 */
;
; #define LCD_AUT_WR 0xB0 /* 自动写设置 */
; #define LCD_AUT_RD 0xB1 /* 自动读设置 */
; #define LCD_AUT_OVR 0xB2 /* 自动读/写结束 */
;
; #define LCD_INC_WR 0xC0 /* 数据一次写,地址加1 */
; #define LCD_INC_RD 0xC1 /* 数据一次读,地址加1 */
; #define LCD_DEC_WR 0xC2 /* 数据一次写,地址减1 */
; #define LCD_DEC_RD 0xC3 /* 数据一次读,地址减1 */
; #define LCD_NOC_WR 0xC4 /* 数据一次写,地址不变 */
; #define LCD_NOC_RD 0xC5 /* 数据一次读,地址不变 */
;
; #define LCD_SCN_RD 0xE0 /* 屏读 */
;
; #define LCD_SCN_CP 0xE8 /* 屏拷贝 */
;
; #define LCD_BIT_OP 0xF0 /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 */
;
; #define CMD_MODE (PORTD|=0X04)
; #define DATA_MODE (PORTD&=0XFB)
; #define CLOSE_READ (PORTD|0X02)
; #define WRITE_MODE (PORTD&0XFE)
; #define CLOSE_WRITE (PORTD|0X01)
; #define READ_MODE (PORTD&0XFD)
; #define ENABLE_LCD (PORTD&=0XF7)
; #define DISABLE_LCD (PORTD|=0X08)
; /***********************************************************************
; * 名称:LCD_WriteCommand()
; * 功能:写命令子程序。(发送命令前,不检查液晶模块的状态)
; * 入口参数:command 要写入LCM的命令字
; * 出口参数:无
; * 说明:函数会设置LCM数据总线为输出方式
; ***********************************************************************/
; void LCD_WriteCommand(unsigned char comd0)
; {
.dbline 81
; LCD_TestStaBit01();
xcall _LCD_TestStaBit01
.dbline 82
; DDRB=0xff; //A口方向为输出
ldi R24,255
out 0x17,R24
.dbline 83
; PORTB=comd0; //送数据到A口寄存器
out 0x18,R20
.dbline 84
; DDRD|=(1<<7);
sbi 0x11,7
.dbline 85
; PORTD&=~(1<<7); // /WR=0
cbi 0x12,7
.dbline 86
; NOP();
nop
.dbline 87
; PORTD|=(1<<7); // /WR=1
sbi 0x12,7
.dbline -2
L7:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r comd0 20 c
.dbend
.dbfunc e LCD_WriteData _LCD_WriteData fV
; dat -> R20
.even
_LCD_WriteData::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 98
; }
;
; /***********************************************************************
; * 名称:LCD_WriteData()
; * 功能:写数据子程序。(发送数据前,不检查液晶模块的状态)
; * 入口参数:dat 要写入LCM的数据
; * 出口参数:无
; * 说明:函数会设置LCM数据总线为输出方式
; ***********************************************************************/
; void LCD_WriteData(unsigned char dat)
; {
.dbline 99
; LCD_TestStaBit01();
xcall _LCD_TestStaBit01
.dbline 100
; DDRD|=(1<<3);
sbi 0x11,3
.dbline 101
; PORTD&=~(1<<3); // C/D=0,数据通道
cbi 0x12,3
.dbline 102
; DDRB=0xff; //A口方向为输出
ldi R24,255
out 0x17,R24
.dbline 103
; PORTB=dat; //送数据到A口寄存器
out 0x18,R20
.dbline 104
; DDRD|=(1<<7);
sbi 0x11,7
.dbline 105
; PORTD&=~(1<<7); // /WR=0
cbi 0x12,7
.dbline 106
; NOP();
nop
.dbline 107
; PORTD|=(1<<7); // /WR=1
sbi 0x12,7
.dbline -2
L8:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r dat 20 c
.dbend
.dbfunc e LCD_ReadState _LCD_ReadState fi
; lcd_state -> R16
.even
_LCD_ReadState::
.dbline -1
.dbline 120
; }
;
;
;
; /***********************************************************************
; * 名称:LCD_ReadState()
; * 功能:读取状态字子程序。
; * 入口参数:无
; * 出口参数:返回值即为读出的状态字
; * 说明:函数会设置LCM数据总线为输入方式
; ***********************************************************************/
; unsigned LCD_ReadState(void)
; {
.dbline 122
; unsigned char lcd_state;
; DDRB=0x00;
clr R2
out 0x17,R2
.dbline 123
; DDRD|=(1<<3);
sbi 0x11,3
.dbline 124
; DDRD|=(1<<6);
sbi 0x11,6
.dbline 125
; PORTD|=(1<<3); // C/D=1
sbi 0x12,3
.dbline 126
; PORTD&=~(1<<6); // /RD=0
cbi 0x12,6
.dbline 127
; lcd_state=PINB&0xff; // 读取引脚A物理电平
in R16,0x16
andi R16,255
.dbline 128
; NOP();
nop
.dbline 129
; NOP();
nop
.dbline 130
; PORTD|=(1<<6); // /RD=1
sbi 0x12,6
.dbline 131
; return lcd_state;
clr R17
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbsym r lcd_state 16 c
.dbend
.dbfunc e LCD_ReadData _LCD_ReadData fc
; lcd_state -> R16
.even
_LCD_ReadData::
.dbline -1
.dbline 143
; }
;
;
; /***********************************************************************
; * 名称:LCD_ReadData()
; * 功能:读取数据子程序。
; * 入口参数:无
; * 出口参数:返回值即为读出的数据
; * 说明:函数会设置LCM数据总线为输入方式
; ***********************************************************************/
; unsigned char LCD_ReadData()
; {
.dbline 145
; unsigned char lcd_state;
; DDRB=0x00;
clr R2
out 0x17,R2
.dbline 146
; DDRD|=(1<<3);
sbi 0x11,3
.dbline 147
; DDRD|=(1<<6);
sbi 0x11,6
.dbline 148
; PORTD&=~(1<<3); // C/D=0
cbi 0x12,3
.dbline 149
; PORTD&=~(1<<6); // /RD=0
cbi 0x12,6
.dbline 150
; lcd_state=PINB&0xff; // 读取引脚A物理电平
in R16,0x16
andi R16,255
.dbline 151
; NOP();
nop
.dbline 152
; NOP();
nop
.dbline 153
; PORTD|=(1<<6); // /RD=1
sbi 0x12,6
.dbline 154
; return lcd_state;
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbsym r lcd_state 16 c
.dbend
.dbfunc e LCD_TestStaBit01 _LCD_TestStaBit01 fc
.even
_LCD_TestStaBit01::
.dbline -1
.dbline 163
; }
; /***********************************************************************
; * 名称:LCD_TestStaBit01()
; * 功能:判断读写指令和读写数据是否允许。
; * 入口参数:无
; * 出口参数:返回0表示禁止,否则表示允许
; ***********************************************************************/
; uint8 LCD_TestStaBit01(void)
; { /*uint8 i;
L12:
.dbline 170
L13:
.dbline 170
;
; for(i=100; i>0; i--)
; { if( (LCD_ReadState()&0x03)==0x03 ) break;
; }
;
; return(i);*/
; while((LCD_ReadState()&0x03)!=3);
xcall _LCD_ReadState
movw R24,R16
andi R24,3
andi R25,0
cpi R24,3
ldi R30,0
cpc R25,R30
brne L12
.dbline -2
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_TestStaBit3 _LCD_TestStaBit3 fc
; i -> R20
.even
_LCD_TestStaBit3::
xcall push_gset1
.dbline -1
.dbline 180
; }
;
; /***********************************************************************
; * 名称:LCD_TestStaBit3()
; * 功能:数据自动写状态是否允许。
; * 入口参数:无
; * 出口参数:返回0表示禁止,否则表示允许
; ***********************************************************************/
; uint8 LCD_TestStaBit3(void)
; { uint8 i;
.dbline 182
;
; for(i=100; i>0; i--)
ldi R20,100
xjmp L19
L16:
.dbline 183
; { if( (LCD_ReadState()&0x08)==0x08 ) break;
.dbline 183
xcall _LCD_ReadState
movw R24,R16
andi R24,8
andi R25,0
cpi R24,8
ldi R30,0
cpc R25,R30
brne L20
.dbline 183
xjmp L18
L20:
.dbline 184
L17:
.dbline 182
dec R20
L19:
.dbline 182
clr R2
cp R2,R20
brlo L16
L18:
.dbline 186
; }
;
; return(i);
mov R16,R20
.dbline -2
L15:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e LCD_WriteTCommand1 _LCD_WriteTCommand1 fc
; command -> R20
.even
_LCD_WriteTCommand1::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 197
; }
;
;
; /***********************************************************************
; * 名称:LCD_WriteTCommand1()
; * 功能:写无参数命令子程序。会先判断LCM状态字。
; * 入口参数:command 要写入LCM的命令字
; * 出口参数:操作出错返回0,否则返回1
; ***********************************************************************/
; uint8 LCD_WriteTCommand1(uint8 command)
; { if( LCD_TestStaBit01()==0 ) return(0);
.dbline 197
xcall _LCD_TestStaBit01
tst R16
brne L23
.dbline 197
clr R16
xjmp L22
L23:
.dbline 198
; LCD_WriteCommand(command); // 发送命令字
mov R16,R20
xcall _LCD_WriteCommand
.dbline 200
;
; return(1);
ldi R16,1
.dbline -2
L22:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r command 20 c
.dbend
.dbfunc e LCD_WriteTCommand3 _LCD_WriteTCommand3 fc
; dat2 -> y+4
; dat1 -> R22
; command -> R20
.even
_LCD_WriteTCommand3::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 214
; }
;
;
; /***********************************************************************
; * 名称:LCD_WriteTCommand3()
; * 功能:写双参数命令子程序。会先判断LCM状态字。
; * 入口参数:command 要写入LCM的命令字
; * dat1 参数1
; * dat2 参数2
; * 出口参数:操作出错返回0,否则返回1
; * 说明:先发送两字节参数据数据,再发送命令字
; ***********************************************************************/
; uint8 LCD_WriteTCommand3(uint8 command, uint8 dat1, uint8 dat2)
; { if( LCD_TestStaBit01()==0 ) return(0);
.dbline 214
xcall _LCD_TestStaBit01
tst R16
brne L26
.dbline 214
clr R16
xjmp L25
L26:
.dbline 215
; LCD_WriteData(dat1); // 发送数据1
mov R16,R22
xcall _LCD_WriteData
.dbline 217
;
; if( LCD_TestStaBit01()==0 ) return(0);
xcall _LCD_TestStaBit01
tst R16
brne L28
.dbline 217
clr R16
xjmp L25
L28:
.dbline 218
; LCD_WriteData(dat2); // 发送数据2
ldd R16,y+4
xcall _LCD_WriteData
.dbline 220
;
; if( LCD_TestStaBit01()==0 ) return(0);
xcall _LCD_TestStaBit01
tst R16
brne L30
.dbline 220
clr R16
xjmp L25
L30:
.dbline 221
; LCD_WriteCommand(command); // 发送命令字
mov R16,R20
xcall _LCD_WriteCommand
.dbline 223
;
; return(1);
ldi R16,1
.dbline -2
L25:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l dat2 4 c
.dbsym r dat1 22 c
.dbsym r command 20 c
.dbend
.dbfunc e LCD_WriteTCommand2 _LCD_WriteTCommand2 fc
; dat1 -> R22
; command -> R20
.even
_LCD_WriteTCommand2::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 236
; }
;
;
; /***********************************************************************
; * 名称:LCD_WriteTCommand2()
; * 功能:写单参数命令子程序。会先判断LCM状态字。
; * 入口参数:command 要写入LCM的命令字
; * dat1 参数1
; * 出口参数:操作出错返回0,否则返回1
; * 说明:先发送参数据数据,再发送命令字
; ***********************************************************************/
; uint8 LCD_WriteTCommand2(uint8 command, uint8 dat1)
; { if( LCD_TestStaBit01()==0 ) return(0);
.dbline 236
xcall _LCD_TestStaBit01
tst R16
brne L33
.dbline 236
clr R16
xjmp L32
L33:
.dbline 237
; LCD_WriteData(dat1); // 发送数据1
mov R16,R22
xcall _LCD_WriteData
.dbline 239
;
; if( LCD_TestStaBit01()==0 ) return(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -