📄 lcd_240128.lst
字号:
__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 + -