⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcddrive.s

📁 ssd1325控制器液晶的驱动程序
💻 S
📖 第 1 页 / 共 3 页
字号:
	.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 + -