📄 lcddrive.lis
字号:
.module lcddrive.c
.area text(rom, con, rel)
0000 .dbfile G:\IccPro\mega128_lcd\lcddrive.c
0000 .dbfunc e LCD_WriteCommand _LCD_WriteCommand fV
0000 ; comd0 -> R20
.even
0000 _LCD_WriteCommand::
0000 0E940000 xcall push_gset1
0004 402F mov R20,R16
0006 .dbline -1
0006 .dbline 80
0006 ; /****************************************************************************************
0006 ; * 文件名:LCDDRIVE.C
0006 ; * 功能:图形液晶240*128驱动(型号为SMG240128A)。32K显示存,0000H-7FFFH地址。显示是横向字节,高位
0006 ; * 在前。
0006 ; * 说明:图形液晶采用T6963C为LCD控制芯片,内带负压产生器,单5伏供电,并行接口(使用LPC2210驱动)。
0006 ; * 硬件连接: D0--D7 <===> D0--D7
0006 ; * /WR <===> nWE
0006 ; * /RD <===> nOE
0006 ; * /CE <===> nCS3_1
0006 ; * C/D <===> A1
0006 ; *
0006 ; * /RST <===> VCC
0006 ; ****************************************************************************************/
0006 ; #include "config.h"
0006 ;
0006 ; TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8]; // 声明GUI显示缓冲区
0006 ;
0006 ; /* 定义LCM地址 */
0006 ; //#define TG240128_COM (*((volatile unsigned short *) 0x83000002))
0006 ; //#define TG240128_DAT (*((volatile unsigned short *) 0x83000000))
0006 ;
0006 ;
0006 ; /* 以下为LCM的驱动层,主要负责发送T6963的各种命令,提供设置显示地址等功能,在发送命令前会检测其状态字。带参数命令模式:先参数,后命令;操作模式:先命令,后数据 */
0006 ;
0006 ; /* T6963C 命令定义 */
0006 ; #define LCD_CUR_POS 0x21 /* 光标位置设置(只有设置到有效显示地址并打开显示时才看到) */
0006 ; #define LCD_CGR_POS 0x22 /* CGRAM偏置地址设置(可以增加自已的符号) */
0006 ; #define LCD_ADR_POS 0x24 /* 地址指针位置(设置读写操作指针) */
0006 ;
0006 ; #define LCD_TXT_STP 0x40 /* 文本区首址(从此地址开始向屏幕左上角显示字符) */
0006 ; #define LCD_TXT_WID 0x41 /* 文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
0006 ; #define LCD_GRH_STP 0x42 /* 图形区首址(从此地址开始向屏幕左上角显示点) */
0006 ; #define LCD_GRH_WID 0x43 /* 图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
0006 ;
0006 ; #define LCD_MOD_OR 0x80 /* 显示方式:逻辑或 */
0006 ; #define LCD_MOD_XOR 0x81 /* 显示方式:逻辑异或 */
0006 ; #define LCD_MOD_AND 0x82 /* 显示方式:逻辑与 */
0006 ; #define LCD_MOD_TCH 0x83 /* 显示方式:文本特征 */
0006 ;
0006 ; #define LCD_DIS_SW 0x90 /* 显示开关:D0=1/0,光标闪烁启用/禁用 */
0006 ; /* D1=1/0,光标显示启用/禁用 */
0006 ; /* D2=1/0,文本显示启用/禁用(打开后再使用) */
0006 ; /* D3=1/0,图形显示启用/禁用(打开后再使用) */
0006 ;
0006 ; #define LCD_CUR_SHP 0xA0 /* 光标形状选择:0xA0-0xA7表示光标占的行数 */
0006 ;
0006 ; #define LCD_AUT_WR 0xB0 /* 自动写设置 */
0006 ; #define LCD_AUT_RD 0xB1 /* 自动读设置 */
0006 ; #define LCD_AUT_OVR 0xB2 /* 自动读/写结束 */
0006 ;
0006 ; #define LCD_INC_WR 0xC0 /* 数据一次写,地址加1 */
0006 ; #define LCD_INC_RD 0xC1 /* 数据一次读,地址加1 */
0006 ; #define LCD_DEC_WR 0xC2 /* 数据一次写,地址减1 */
0006 ; #define LCD_DEC_RD 0xC3 /* 数据一次读,地址减1 */
0006 ; #define LCD_NOC_WR 0xC4 /* 数据一次写,地址不变 */
0006 ; #define LCD_NOC_RD 0xC5 /* 数据一次读,地址不变 */
0006 ;
0006 ; #define LCD_SCN_RD 0xE0 /* 屏读 */
0006 ;
0006 ; #define LCD_SCN_CP 0xE8 /* 屏拷贝 */
0006 ;
0006 ; #define LCD_BIT_OP 0xF0 /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 */
0006 ;
0006 ; #define CMD_MODE (PORTD|=0X04)
0006 ; #define DATA_MODE (PORTD&=0XFB)
0006 ; #define CLOSE_READ (PORTD|0X02)
0006 ; #define WRITE_MODE (PORTD&0XFE)
0006 ; #define CLOSE_WRITE (PORTD|0X01)
0006 ; #define READ_MODE (PORTD&0XFD)
0006 ; #define ENABLE_LCD (PORTD&=0XF7)
0006 ; #define DISABLE_LCD (PORTD|=0X08)
0006 ; /***********************************************************************
0006 ; * 名称:LCD_WriteCommand()
0006 ; * 功能:写命令子程序。(发送命令前,不检查液晶模块的状态)
0006 ; * 入口参数:command 要写入LCM的命令字
0006 ; * 出口参数:无
0006 ; * 说明:函数会设置LCM数据总线为输出方式
0006 ; ***********************************************************************/
0006 ; void LCD_WriteCommand(unsigned char comd0)
0006 ; {
0006 .dbline 81
0006 ; LCD_TestStaBit01();
0006 33D0 xcall _LCD_TestStaBit01
0008 .dbline 82
0008 ; DDRB=0xff; //A口方向为输出
0008 8FEF ldi R24,255
000A 87BB out 0x17,R24
000C .dbline 83
000C ; PORTB=comd0; //送数据到A口寄存器
000C 48BB out 0x18,R20
000E .dbline 84
000E ; DDRD|=(1<<7);
000E 8F9A sbi 0x11,7
0010 .dbline 85
0010 ; PORTD&=~(1<<7); // /WR=0
0010 9798 cbi 0x12,7
0012 .dbline 86
0012 ; NOP();
0012 0000 nop
0014 .dbline 87
0014 ; PORTD|=(1<<7); // /WR=1
0014 979A sbi 0x12,7
0016 .dbline -2
0016 L7:
0016 0E940000 xcall pop_gset1
001A .dbline 0 ; func end
001A 0895 ret
001C .dbsym r comd0 20 c
001C .dbend
001C .dbfunc e LCD_WriteData _LCD_WriteData fV
001C ; dat -> R20
.even
001C _LCD_WriteData::
001C 0E940000 xcall push_gset1
0020 402F mov R20,R16
0022 .dbline -1
0022 .dbline 98
0022 ; }
0022 ;
0022 ; /***********************************************************************
0022 ; * 名称:LCD_WriteData()
0022 ; * 功能:写数据子程序。(发送数据前,不检查液晶模块的状态)
0022 ; * 入口参数:dat 要写入LCM的数据
0022 ; * 出口参数:无
0022 ; * 说明:函数会设置LCM数据总线为输出方式
0022 ; ***********************************************************************/
0022 ; void LCD_WriteData(unsigned char dat)
0022 ; {
0022 .dbline 99
0022 ; LCD_TestStaBit01();
0022 25D0 xcall _LCD_TestStaBit01
0024 .dbline 100
0024 ; DDRD|=(1<<3);
0024 8B9A sbi 0x11,3
0026 .dbline 101
0026 ; PORTD&=~(1<<3); // C/D=0,数据通道
0026 9398 cbi 0x12,3
0028 .dbline 102
0028 ; DDRB=0xff; //A口方向为输出
0028 8FEF ldi R24,255
002A 87BB out 0x17,R24
002C .dbline 103
002C ; PORTB=dat; //送数据到A口寄存器
002C 48BB out 0x18,R20
002E .dbline 104
002E ; DDRD|=(1<<7);
002E 8F9A sbi 0x11,7
0030 .dbline 105
0030 ; PORTD&=~(1<<7); // /WR=0
0030 9798 cbi 0x12,7
0032 .dbline 106
0032 ; NOP();
0032 0000 nop
0034 .dbline 107
0034 ; PORTD|=(1<<7); // /WR=1
0034 979A sbi 0x12,7
0036 .dbline -2
0036 L8:
0036 0E940000 xcall pop_gset1
003A .dbline 0 ; func end
003A 0895 ret
003C .dbsym r dat 20 c
003C .dbend
003C .dbfunc e LCD_ReadState _LCD_ReadState fi
003C ; lcd_state -> R16
.even
003C _LCD_ReadState::
003C .dbline -1
003C .dbline 120
003C ; }
003C ;
003C ;
003C ;
003C ; /***********************************************************************
003C ; * 名称:LCD_ReadState()
003C ; * 功能:读取状态字子程序。
003C ; * 入口参数:无
003C ; * 出口参数:返回值即为读出的状态字
003C ; * 说明:函数会设置LCM数据总线为输入方式
003C ; ***********************************************************************/
003C ; unsigned LCD_ReadState(void)
003C ; {
003C .dbline 122
003C ; unsigned char lcd_state;
003C ; DDRB=0x00;
003C 2224 clr R2
003E 27BA out 0x17,R2
0040 .dbline 123
0040 ; DDRD|=(1<<3);
0040 8B9A sbi 0x11,3
0042 .dbline 124
0042 ; DDRD|=(1<<6);
0042 8E9A sbi 0x11,6
0044 .dbline 125
0044 ; PORTD|=(1<<3); // C/D=1
0044 939A sbi 0x12,3
0046 .dbline 126
0046 ; PORTD&=~(1<<6); // /RD=0
0046 9698 cbi 0x12,6
0048 .dbline 127
0048 ; lcd_state=PINB&0xff; // 读取引脚A物理电平
0048 06B3 in R16,0x16
004A 0F7F andi R16,255
004C .dbline 128
004C ; NOP();
004C 0000 nop
004E .dbline 129
004E ; NOP();
004E 0000 nop
0050 .dbline 130
0050 ; PORTD|=(1<<6); // /RD=1
0050 969A sbi 0x12,6
0052 .dbline 131
0052 ; return lcd_state;
0052 1127 clr R17
0054 .dbline -2
0054 L9:
0054 .dbline 0 ; func end
0054 0895 ret
0056 .dbsym r lcd_state 16 c
0056 .dbend
0056 .dbfunc e LCD_ReadData _LCD_ReadData fc
0056 ; lcd_state -> R16
.even
0056 _LCD_ReadData::
0056 .dbline -1
0056 .dbline 143
0056 ; }
0056 ;
0056 ;
0056 ; /***********************************************************************
0056 ; * 名称:LCD_ReadData()
0056 ; * 功能:读取数据子程序。
0056 ; * 入口参数:无
0056 ; * 出口参数:返回值即为读出的数据
0056 ; * 说明:函数会设置LCM数据总线为输入方式
0056 ; ***********************************************************************/
0056 ; unsigned char LCD_ReadData()
0056 ; {
0056 .dbline 145
0056 ; unsigned char lcd_state;
0056 ; DDRB=0x00;
0056 2224 clr R2
0058 27BA out 0x17,R2
005A .dbline 146
005A ; DDRD|=(1<<3);
005A 8B9A sbi 0x11,3
005C .dbline 147
005C ; DDRD|=(1<<6);
005C 8E9A sbi 0x11,6
005E .dbline 148
005E ; PORTD&=~(1<<3); // C/D=0
005E 9398 cbi 0x12,3
0060 .dbline 149
0060 ; PORTD&=~(1<<6); // /RD=0
0060 9698 cbi 0x12,6
0062 .dbline 150
0062 ; lcd_state=PINB&0xff; // 读取引脚A物理电平
0062 06B3 in R16,0x16
0064 0F7F andi R16,255
0066 .dbline 151
0066 ; NOP();
0066 0000 nop
0068 .dbline 152
0068 ; NOP();
0068 0000 nop
006A .dbline 153
006A ; PORTD|=(1<<6); // /RD=1
006A 969A sbi 0x12,6
006C .dbline 154
006C ; return lcd_state;
006C .dbline -2
006C L10:
006C .dbline 0 ; func end
006C 0895 ret
006E .dbsym r lcd_state 16 c
006E .dbend
006E .dbfunc e LCD_TestStaBit01 _LCD_TestStaBit01 fc
.even
006E _LCD_TestStaBit01::
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -