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

📄 lcd_240128.lst

📁 基于AVR和51的240*128液晶显示模块驱动程序。很有用的喔~
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0036 E5CF      LDI	R28,0x5F
    0037 E0D4      LDI	R29,4
    0038 BFCD      OUT	0x3D,R28
    0039 BFDE      OUT	0x3E,R29
    003A 51C0      SUBI	R28,0x10
    003B 40D0      SBCI	R29,0
    003C EA0A      LDI	R16,0xAA
    003D 8308      STD	Y+0,R16
    003E 2400      CLR	R0
    003F E7E7      LDI	R30,0x77
    0040 E0F0      LDI	R31,0
    0041 E010      LDI	R17,0
    0042 37E7      CPI	R30,0x77
    0043 07F1      CPC	R31,R17
    0044 F011      BEQ	0x0047
    0045 9201      ST	R0,Z+
    0046 CFFB      RJMP	0x0042
    0047 8300      STD	Z+0,R16
    0048 E5E4      LDI	R30,0x54
    0049 E0F0      LDI	R31,0
    004A E6A0      LDI	R26,0x60
FILE: D:\RJ\Project\AVR\LCD_240128\LCM_240128.h
(0001) #include <iom16v.h>
(0002) #define _LCM_240128_
(0003) 
(0004) /*
(0005) #ifndef __stdio_h__
(0006) 	#include <stdio.h>
(0007) #endif
(0008) */
(0009) //以下头文件只在高级绘图函数中使用
(0010) /*
(0011) #ifndef __stdlib_h__
(0012) 	#include <stdlib.h>     // rand()
(0013) #endif
(0014) #ifndef __string_h__
(0015) 	#include <string.h>     // strlen()
(0016) #endif
(0017) #ifndef __math_h__
(0018) 	#include <math.h>       // cos(),sin()
(0019) #endif
(0020) */
(0021) 
(0022) //引脚定义
(0023) #define LCD_WR		0		//第0脚
(0024) #define LCD_RD		1		//第1脚
(0025) #define LCD_CE		2		//第2脚
(0026) #define LCD_CD		3		//第3脚
(0027) #define LCD_CTRL_DDR		DDRB		//控制线连接的端口
(0028) #define LCD_CTRL_PORT		PORTB
(0029) #define LCD_DATA_PORT 		PORTC		//数据线连接的端口
(0030) #define LCD_DATA_PIN		PINC
(0031) #define LCD_DATA_DDR		DDRC
(0032) 
(0033) /* ----- 定义液晶屏内部RAM  ------ */
(0034) #define LCD_TEXT_BASE 0x00            // 文本区内存首地址
(0035) #define LCD_GRAPH_BASE 0x300            // 图形区内存首地址
(0036) #define LCD_WIDTH 30         // 定义屏幕文本宽度为30字节
(0037) 
(0038) // 绘图坐标限制
(0039) #define LCD_X_MAX 240        
(0040) #define LCD_X_MIN 0
(0041) #define LCD_Y_MAX 128
(0042) #define LCD_Y_MIN 0
(0043) 
(0044) //液晶命令字
(0045) #define COMM_SET_CURPOS     0x21        //设置光标地址,双参数,x地址,y地址
(0046) #define COMM_SET_OFFSET     0x22        //设置偏移量寄存器,双参数,偏移量,0
(0047) #define COMM_SET_POSITION   0x24        //设置地址指针,双参数,低地址,高地址
(0048) #define COMM_SET_CBUFFER    0x40        //设置文本区起始地址,双参数,低地址,高地址
(0049) #define COMM_SET_CWIDTH     0x41        //设置文本区宽度,单参数,宽度
(0050) #define COMM_SET_GBUFFER    0x42        //设置图形区起始地址,双参数,低地址,高地址,可以实现滚屏效果
(0051) #define COMM_SET_GWIDTH     0x43        //设置图形区宽度,单参数,宽度
(0052) #define COMM_SET_MODE       0x80        //设置显示模式,将功能号与指令相或,无参数,功能:0-或;1-异或;3-与;4-文字属性
(0053) #define COMM_DISP_OFF       0x90        //显示开,无参数
(0054) #define COMM_CUR_SHOW       0x92        //显示光标,闪烁关,无参数
(0055) #define COMM_CUR_FLASH      0x93        //显示光标,闪烁开,无参数
(0056) #define COMM_TEXT_ONLY      0x94        //纯文本显示模式,无参数
(0057) #define COMM_GRAPH_ONLY     0x98        //纯图形显示模式,无参数
(0058) #define COMM_TEXT_GRAPH     0x9c        //文本+图形显示模式,无参数
(0059) #define COMM_CUR_MODE       0xa0        //光标高度,无参数,高度与指令相或,高度范围: 0~7
(0060) #define COMM_AUTO_WRITE     0xb0        //启动自动写模式,无参数
(0061) #define COMM_AUTO_READ      0xb1        //启动自动读模式,无参数
(0062) #define COMM_EXIT_AUTOMODE  0xb2        //退出自动模式,无参数
(0063) #define COMM_WRITE_PUP      0xc0        //写入一个字节,地址指针自动+1,单参数,待写入的数据
(0064) #define COMM_WRITE_PDOWN    0xc2        //写入一个字节,地址指针自动-1,单参数,待写入的数据
(0065) #define COMM_WRITE_PSTAY    0xc4        //写入一个字节,地址指针不变,单参数,待写入的数据
(0066) #define COMM_READ_PUP       0xc1        //读出一个字节,地址指针自动+1,无参数
(0067) #define COMM_READ_PDOWN     0xc3        //读出一个字节,地址指针自动-1,无参数
(0068) #define COMM_READ_PSTAY     0xc5        //读出一个字节,地址指针不变,无参数
(0069) #define COMM_SCREEN_PEEK    0xe0        //屏幕读取,无参数
(0070) #define COMM_SCREEN_COPY    0xe8        //屏幕复制,无参数
(0071) #define COMM_BIT_SET        0xf8        //设置位,将要清除的位号与指令相或,无参数,位:0~7
(0072) #define COMM_BIT_CLR        0xf0        //清除位,将要清除的位号与指令相或,无参数,位:0~7
(0073) 
(0074) 
(0075) //定义宏
(0076) #define Lcd_Set_WR() 	LCD_CTRL_DDR |=(0x01<<LCD_WR);		LCD_CTRL_PORT  |= (0x01<<LCD_WR)
(0077) #define Lcd_Clr_WR()  	LCD_CTRL_DDR |=(0x01<<LCD_WR);		LCD_CTRL_PORT  &= (~(0x01<<LCD_WR))
(0078) #define Lcd_Set_RD() 	LCD_CTRL_DDR |=(0x01<<LCD_RD);		LCD_CTRL_PORT  |= (0x01<<LCD_RD)
(0079) #define Lcd_Clr_RD()  	LCD_CTRL_DDR |=(0x01<<LCD_RD);		LCD_CTRL_PORT  &= (~(0x01<<LCD_RD))
(0080) #define Lcd_Set_CE() 	LCD_CTRL_DDR |=(0x01<<LCD_CE);		LCD_CTRL_PORT  |= (0x01<<LCD_CE)
(0081) #define Lcd_Clr_CE()  	LCD_CTRL_DDR |=(0x01<<LCD_CE);		LCD_CTRL_PORT  &= (~(0x01<<LCD_CE))
(0082) #define Lcd_Set_CD() 	LCD_CTRL_DDR |=(0x01<<LCD_CD);		LCD_CTRL_PORT  |= (0x01<<LCD_CD)
(0083) #define Lcd_Clr_CD()  	LCD_CTRL_DDR |=(0x01<<LCD_CD);		LCD_CTRL_PORT  &= (~(0x01<<LCD_CD))
(0084) #define Lcd_SET_DATADIR_OUT()	LCD_DATA_DDR = 0xff
(0085) #define Lcd_SET_DATADIR_IN()	LCD_DATA_DDR = 0x00
(0086) 
(0087) //声明函数
(0088) void Lcd_SendDat(unsigned char dat); 				// 写数据
(0089) void Lcd_RW_Check(void) ;  					// 读状态
(0090) void Lcd_SendCom0(unsigned char Comm);				// 写无参数命令
(0091) void Lcd_SendCom1(unsigned char dat,unsigned char Comm);//写单参数命令
(0092) void Lcd_SendCom2(unsigned char dat0,unsigned char dat1,unsigned char Comm);//写双参数命令
(0093) //unsigned char glcd_dget(void);    				// 读数据
(0094) 
(0095) void Lcd_Setup(void);			 					// 初始化控制线的电位
(0096) void Lcd_Init(void);     			 				// 初始化显存和显示方式
(0097) 
(0098) void Lcd_Locate(unsigned char x,unsigned char y); 			// 设置显示坐标(文本模式)
(0099) void Lcd_PrintText(unsigned char x,unsigned char y,unsigned char *string);  	// 显示字符串RAM
(0100) 
(0101) void Lcd_ClrScreen(void);
(0102) void Lcd_ClrText(void);  		 				// 文本清屏
(0103) void Lcd_ClrGraph(void) ;    					// 图形清屏
(0104) 
(0105) void Lcd_Point(unsigned char x, unsigned char y, char draw);	//画、清点
(0106) void Lcd_Line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char draw) ;	//画直线
(0107) void Lcd_Circle(unsigned char x, unsigned char y, unsigned char r, unsigned char draw);		//画圆
(0108) void Lcd_Box(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char draw, unsigned char fill);	//画矩形
(0109) 
(0110) void delay_us(unsigned char us)
(0111) {
(0112) 	while (--us);
(0113) }
(0114) 
(0115) //读取状态字节
(0116) void Lcd_RW_Check(void)  
(0117) {
(0118) 	unsigned char Status;
(0119) 	Lcd_SET_DATADIR_IN();
(0120) 	do
(0121) 	{	
_Lcd_Get_State:
  Status               --> R16
    004B E0B0      LDI	R27,0
    004C E010      LDI	R17,0
(0122) 		Lcd_Set_CD();		// C/D高,读状态字节
    004D 36EB      CPI	R30,0x6B
    004E 07F1      CPC	R31,R17
(0123) 		Lcd_Clr_CE();		// CE低,开片选信号
    004F F021      BEQ	0x0054
    0050 95C8      LPM
(0124) 		Lcd_Clr_RD();		// RD低,打开读信号
    0051 9631      ADIW	R30,1
    0052 920D      ST	R0,X+
(0125) 		Status = LCD_DATA_PIN;      // 读取状态字节
(0126) 		Lcd_Set_RD();         // 关闭读信号
    0053 CFF9      RJMP	0x004D
(0127) 		Lcd_Set_CE();         // CE高,关闭片选
    0054 940E0306  CALL	_main
(0128) 		Status &= 0x03;
_exit:
    0056 CFFF      RJMP	_exit
_delay_us:
    0057 2F80      MOV	R24,R16
(0129) 	}
    0058 5081      SUBI	R24,1
    0059 2F08      MOV	R16,R24
    005A 2388      TST	R24
    005B F7D9      BNE	0x0057
(0130) 	while (Status != 0x03);
(0131) }
(0132) //************************************************************************************************************//
(0133) // 写数据
(0134) void Lcd_SendDat(unsigned char dat) 
(0135) {
    005C 9508      RET
_Lcd_RW_Check:
    005D 2422      CLR	R2
    005E BA24      OUT	0x14,R2
    005F 9ABB      SBI	0x17,3
    0060 9AC3      SBI	0x18,3
(0136) 	Lcd_RW_Check(); // 等待屏幕可用
    0061 9ABA      SBI	0x17,2
    0062 98C2      CBI	0x18,2
(0137) 	Lcd_SET_DATADIR_OUT(); 		// 数据口转换为输出口
    0063 9AB9      SBI	0x17,1
    0064 98C1      CBI	0x18,1
(0138) 	Lcd_Clr_CD();
    0065 B303      IN	R16,0x13
    0066 9AB9      SBI	0x17,1
(0139) 	Lcd_Clr_CE();					// 低电平脉冲大于80ns
    0067 9AC1      SBI	0x18,1
(0140) 	LCD_DATA_PORT = dat;          // 写数据到数据口             	
    0068 9ABA      SBI	0x17,2
    0069 9AC2      SBI	0x18,2
(0141) 	Lcd_Clr_WR();         			
(0142) 	Lcd_Set_WR();                 // WR拉高
(0143) 	Lcd_Set_CE();                 // CE拉高
    006A 7003      ANDI	R16,3
    006B 3003      CPI	R16,3
(0144) }
    006C F791      BNE	0x005F
    006D 9508      RET
_Lcd_SendDat:
  dat                  --> R20
    006E 940E03EB  CALL	push_gset1
    0070 2F40      MOV	R20,R16
    0071 DFEB      RCALL	_Lcd_RW_Check
    0072 EF8F      LDI	R24,0xFF
    0073 BB84      OUT	0x14,R24
(0145) 
(0146) // 写无参数命令
(0147) void Lcd_SendCom0(unsigned char Comm) 
(0148) {
(0149) 	Lcd_RW_Check(); // 等待屏幕可用
(0150) 	Lcd_SET_DATADIR_OUT(); // 数据口转换为输出口
    0074 9ABB      SBI	0x17,3
    0075 98C3      CBI	0x18,3
    0076 9ABA      SBI	0x17,2
    0077 98C2      CBI	0x18,2
    0078 BB45      OUT	0x15,R20
(0151) 	Lcd_Set_CD();
    0079 9AB8      SBI	0x17,0
    007A 98C0      CBI	0x18,0
(0152) 	Lcd_Clr_CE();
    007B 9AB8      SBI	0x17,0
    007C 9AC0      SBI	0x18,0
(0153) 	LCD_DATA_PORT = Comm;  // 送数据到数据口
    007D 9ABA      SBI	0x17,2
    007E 9AC2      SBI	0x18,2
(0154) 	Lcd_Clr_WR();
    007F 940E03EE  CALL	pop_gset1
(0155) 	Lcd_Set_WR();         // WR置高
    0081 9508      RET
(0156) 	Lcd_Set_CE();         // CE置高
(0157) }
(0158) 
_Lcd_SendCom0:
  Comm                 --> R20
    0082 940E03EB  CALL	push_gset1
(0159) //写单参数命令
    0084 2F40      MOV	R20,R16
    0085 DFD7      RCALL	_Lcd_RW_Check
    0086 EF8F      LDI	R24,0xFF
    0087 BB84      OUT	0x14,R24
    0088 9ABB      SBI	0x17,3
    0089 9AC3      SBI	0x18,3
    008A 9ABA      SBI	0x17,2
    008B 98C2      CBI	0x18,2
    008C BB45      OUT	0x15,R20
(0160) void Lcd_SendCom1(unsigned char dat,unsigned char Comm)
(0161) {
(0162)  	 Lcd_SendDat(dat);
(0163) 	 Lcd_SendCom0(Comm); 	 
(0164) }
(0165) 
    008D 9AB8      SBI	0x17,0
    008E 98C0      CBI	0x18,0
(0166) //写双参数命令
    008F 9AB8      SBI	0x17,0
    0090 9AC0      SBI	0x18,0
    0091 9ABA      SBI	0x17,2
    0092 9AC2      SBI	0x18,2
    0093 940E03EE  CALL	pop_gset1
    0095 9508      RET
_Lcd_SendCom1:
  Comm                 --> R20
  dat                  --> R22
    0096 940E03E9  CALL	push_gset2
(0167) void Lcd_SendCom2(unsigned char dat0,unsigned char dat1,unsigned char Comm)
(0168) {
(0169)  	 Lcd_SendDat(dat0);
(0170) 	 Lcd_SendDat(dat1);
(0171) 	 Lcd_SendCom0(Comm); 	 
(0172) }
    0098 2F42      MOV	R20,R18
    0099 2F60      MOV	R22,R16
(0173) //*********************************************************************************************************//
    009A 2F06      MOV	R16,R22
    009B DFD2      RCALL	_Lcd_SendDat
(0174) 
    009C 2F04      MOV	R16,R20
    009D DFE4      RCALL	_Lcd_SendCom0
    009E 940E03DA  CALL	pop_gset2
    00A0 9508      RET
_Lcd_SendCom2:
  Comm                 --> Y+4
  dat1                 --> R20
  dat0                 --> R22
_Locate:
  addr                 --> R20
  y                    --> R22
  x                    --> R20
    00A1 940E03E9  CALL	push_gset2
    00A3 2F42      MOV	R20,R18
    00A4 2F60      MOV	R22,R16
    00A5 2F06      MOV	R16,R22
(0175) // 读数据
(0176) /*
(0177) unsigned char glcd_dget(void)      
(0178) {
(0179) 	unsigned char glcd_byte;
(0180) 	do {} while ((0x03 & glcd_sget()) != 0x03); // 等待屏幕可用
(0181) 	glcd_SET_DATADIR_IN(); // 设置数据口为输入口
(0182) 	glcd_cd_low();   // C/D置低
(0183) 	glcd_rd_low();   // 读置低

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -