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

📄 128_lcd.lst

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