📄 lcd_19264_main.lst
字号:
09EA: BCF F8D.5
.................... lcd_clear_rw(); // R/W=0,发送写允许信号;
09EC: BCF F96.6
09EE: BCF F8D.6
.................... delay_us(1); //延时1us;
09F0: NOP
09F2: NOP
.................... set_tris_d(0x00); //改变RD口的状态,作为输出口;
09F4: MOVLW 00
09F6: MOVWF F95
.................... Datalcm=x; //将"Y地址命令"的值x发送到DDRAM的"列地址寄存器"中;
09F8: MOVFF 67,F83
.................... lcd_set_e(); //E=1,发送使能信号;
09FC: BCF F96.7
09FE: BSF F8D.7
.................... delay_us(1); //延时1us;
0A00: NOP
0A02: NOP
.................... lcd_clear_e(); //E=0,发送不使能信号;
0A04: BCF F96.7
0A06: BCF F8D.7
.................... }
0A08: GOTO 0A10 (RETURN)
....................
.................... /****************************************/
.................... /* 从液晶片上读数据,保留在全局变量中 */
.................... /****************************************/
.................... //从LCM中读取地址为(col,row)处的内容,结果保存在cPbyte中;
.................... void Rddata(void)
.................... { Locatexy(); //将坐标(col,row)转换为"命令x"和"命令y",并选中DDRAM中的"列地址"和"行地址";
.................... set_tris_d(0xff); //改变RD口的状态,作为输入口;
.................... //Datalcm=0xFF;
.................... lcd_set_di(); // D/I=1,选择数据寄存器;
.................... lcd_set_rw(); // R/W=1,发送读允许信号
.................... lcd_set_e(); //E=1,发送使能信号;
.................... delay_us(1); //延时1us;
.................... cbyte=Datalcm; /*虚读一次*/
.................... lcd_clear_e(); //E=0,发送不使能信号;
....................
.................... Locatexy(); //将坐标(col,row)转换为"命令x"和"命令y",并选中DDRAM中的"列地址"和"行地址";
.................... set_tris_d(0xff); //改变RD口的状态,作为输入口;
.................... //Datalcm=0xFF;
.................... lcd_set_di(); // D/I=1,选择数据寄存器;
.................... lcd_set_rw(); // R/W=1,发送读允许信号
.................... lcd_set_e(); //E=1,发送使能信号;
.................... delay_us(1); //延时1us;
.................... cbyte=Datalcm; /*从数据口读数据,真读 */
.................... lcd_clear_e(); //E=0,发送不使能信号;//E=0,发送不使能信号;
.................... delay_us(1); //延时1us;
.................... set_tris_d(0x00); //改变RD口的状态,作为输出口;
.................... }
....................
.................... /****************************************/
.................... /*将数据X的值,写入到坐标为(col,row)的存储单元*/
.................... /****************************************/
.................... void Wrdata(int X)
.................... { Locatexy(); //将坐标(col,row)转换为"命令x"和"命令y",并选中DDRAM中的"列地址"和"行地址"
0A0C: GOTO 0972
.................... wtcom(); //等待LCD使能;
0A10: CALL 08A6
.................... lcd_set_di(); // D/I=1,选择数据寄存器;
0A14: BCF F96.5
0A16: BSF F8D.5
.................... lcd_clear_rw(); // R/W=0,发送写允许信号;
0A18: BCF F96.6
0A1A: BCF F8D.6
.................... delay_us(1); //延时1us;
0A1C: NOP
0A1E: NOP
.................... set_tris_d(0x00); //改变RD口的状态,作为输出口;
0A20: MOVLW 00
0A22: MOVWF F95
.................... Datalcm=X; //将数据X的值写入数据存储器;
0A24: MOVFF 66,F83
.................... lcd_set_e(); //E=1,发送使能信号;
0A28: BCF F96.7
0A2A: BSF F8D.7
.................... delay_us(1); //延时1us;
0A2C: NOP
0A2E: NOP
.................... lcd_clear_e(); //E=0,发送不使能信号;
0A30: BCF F96.7
0A32: BCF F8D.7
.................... }
0A34: RETLW 00
....................
.................... /****************************************/
.................... /* 屏幕滚动定位 */
.................... /****************************************/
.................... void Rollscreen(int x)
.................... { cbyte=DISPFIRST|x; //显示起始行定义,DISPFIRST=0xc0,设置显示的第1行,为DDRAM的第x行;
.................... WrcmdL(cbyte); //将命令(0xc0+x)的值输出到左区控制口,告诉LCM,左区显示的第1行,为左区DDRAM的第x行;
.................... WrcmdM(cbyte); //将命令(0xc0+x)的值输出到中区控制口,告诉LCM,中区显示的第1行,为中区DDRAM的第x行;
.................... WrcmdR(cbyte); //将命令(0xc0+x)的值输出到右区控制口,告诉LCM,右区显示的第1行,为右区DDRAM的第x行;
.................... }
....................
.................... /****************************************/
.................... /* 清屏,全屏幕清零 */
.................... /****************************************/
.................... void Lcmcls( void )
.................... { for(row=0;row<8;row++) //共计8页,192字节/页;
0A36: CLRF 06
0A38: MOVF 06,W
0A3A: SUBLW 07
0A3C: BTFSS FD8.0
0A3E: GOTO 0A60
.................... { for(col=0;col<LCMLIMIT;col++) Wrdata(0);}
0A42: CLRF 05
0A44: MOVF 05,W
0A46: SUBLW BF
0A48: BTFSS FD8.0
0A4A: GOTO 0A5A
0A4E: CLRF x66
0A50: CALL 0A0C
0A54: INCF 05,F
0A56: GOTO 0A44
0A5A: INCF 06,F
0A5C: GOTO 0A38
.................... }
0A60: GOTO 0ABC (RETURN)
....................
.................... /********************************/
.................... /*液晶屏初始化 */
.................... /********************************/
.................... //函数功能:第1步:关闭显示屏,第2步:打开显示屏,第3步:定义行号0为显示起始行,第4步:全屏幕清零;
.................... void Lcminit(void)
.................... { cbyte=DISPOFF; /*关闭显示屏,定义DISPOFF=0x3e*/
0A64: MOVLW 3E
0A66: MOVWF 07
.................... WrcmdL(cbyte); //将命令0x3e输出到左区控制口,告诉LCM关闭左区显示;
0A68: MOVFF 07,53
0A6C: CALL 08DC
.................... WrcmdM(cbyte); //将命令0x3e输出到中区控制口,告诉LCM关闭中区显示;
0A70: MOVFF 07,53
0A74: CALL 0914
.................... WrcmdR(cbyte); //将命令0x3e输出到右区控制口,告诉LCM关闭右区显示;
0A78: MOVFF 07,53
0A7C: CALL 094C
....................
.................... cbyte=DISPON; /* 打开显示屏,定义DISPON=0x3f */
0A80: MOVLW 3F
0A82: MOVWF 07
.................... WrcmdL(cbyte); //将命令0x3f输出到左区控制口,告诉LCM打开左区显示;
0A84: MOVFF 07,53
0A88: CALL 08DC
.................... WrcmdM(cbyte); //将命令0x3f输出到中区控制口,告诉LCM打开中区显示;
0A8C: MOVFF 07,53
0A90: CALL 0914
.................... WrcmdR(cbyte); //将命令0x3f输出到右区控制口,告诉LCM打开右区显示;
0A94: MOVFF 07,53
0A98: CALL 094C
....................
.................... cbyte=DISPFIRST; /*显示起始行定义,DISPFIRST=0xc0*/
0A9C: MOVLW C0
0A9E: MOVWF 07
.................... WrcmdL(cbyte); //将命令0xc0输出到左区控制口,告诉LCM,左区显示的第1行,为左区DDRAM的第0行;
0AA0: MOVFF 07,53
0AA4: CALL 08DC
.................... WrcmdM(cbyte); //将命令0xc0输出到中区控制口,告诉LCM,中区显示的第1行,为中区DDRAM的第0行;
0AA8: MOVFF 07,53
0AAC: CALL 0914
.................... WrcmdR(cbyte); //将命令0xc0输出到右区控制口,告诉LCM,右区显示的第1行,为右区DDRAM的第0行;
0AB0: MOVFF 07,53
0AB4: CALL 094C
....................
.................... Lcmcls(); //清屏,全屏幕清零;
0AB8: GOTO 0A36
.................... }
0ABC: GOTO 0DFA (RETURN)
....................
.................... /****************************************/
.................... /* 字符点阵码数据输出 */
.................... /****************************************/
.................... //函数功能:将Order的值所对应的ASCII码点阵或汉字点阵写入DDRAM中,DDRAM的起始地址为(x,y);
.................... //输入参数:(x,y)为DDRAM的列地址和页地址,x只能取8的倍数值,y只能取2的倍数值;
.................... //输入参数:Order表示"字符"在字库中的偏移量;
.................... //输入参数:widthw表示"字符"的宽度,8/16列;
.................... //若widthw=8,表示8X16点阵字符,则Order*16;
.................... //若widthw=16,表示16X16点阵字符,则Order*32;
.................... void Putedot(int x,int y,int Order,int widthw)
.................... { int i;
.................... long xi,temp; //偏移量,字符量少的可以定义为int;
.................... col = x; /*暂存x,y坐标,已备下半个字符使用*/
*
0AE0: MOVFF 5D,05
.................... row = y;
0AE4: MOVFF 5E,06
.................... temp=(long)(widthw<<1);
0AE8: BCF FD8.0
0AEA: RLCF x60,W
0AEC: CLRF x65
0AEE: MOVWF x64
.................... xi=(long)(temp*Order); //计算"字符点阵码"在字库中的偏移量;
0AF0: MOVFF 65,67
0AF4: MOVFF 64,66
0AF8: CLRF x69
0AFA: MOVFF 5F,68
0AFE: GOTO 0AC0
0B02: MOVFF 02,63
0B06: MOVFF 01,62
.................... //若widthw=8,表示8X16点阵字符,则Order*16;
.................... //若widthw=16,表示16X16点阵字符,则Order*32;
.................... /****************上半个字符输出**************/
.................... for(i=0;i<widthw;i++)
0B0A: CLRF x61
0B0C: MOVF x60,W
0B0E: SUBWF x61,W
0B10: BTFSC FD8.0
0B12: GOTO 0B8E
.................... { if(widthw==8) cbyte=Ezk[xi]; //从8X16点阵字符中取英文点阵码;
0B16: MOVF x60,W
0B18: SUBLW 08
0B1A: BTFSS FD8.2
0B1C: GOTO 0B42
0B20: MOVFF 63,03
0B24: MOVF x62,W
0B26: MOVFF FF2,66
0B2A: BCF FF2.7
0B2C: MOVFF 63,FF7
0B30: CALL 0276
0B34: BTFSC x66.7
0B36: BSF FF2.7
0B38: MOVWF 01
0B3A: MOVFF 01,07
.................... else cbyte=Hzk[xi]; //从16X16点阵字符中取汉字点阵码;
0B3E: GOTO 0B60
0B42: MOVFF 63,03
0B46: MOVF x62,W
0B48: MOVFF FF2,66
0B4C: BCF FF2.7
0B4E: MOVFF 63,FF7
0B52: CALL 0004
0B56: BTFSC x66.7
0B58: BSF FF2.7
0B5A: MOVWF 01
0B5C: MOVFF 01,07
.................... Wrdata(cbyte); //将数据X的值,写入到坐标为(col,row)的存储单元;
0B60: MOVFF 07,66
0B64: CALL 0A0C
....................
.................... xi++; //修改"字符点阵码"的偏移量,为取下一个字节做准备;
0B68: INCF x62,F
0B6A: BTFSC FD8.2
0B6C: INCF x63,F
.................... col++; //修改DDRAM的列地址,为指向下一个DDRAM地址单元做准备;
0B6E: INCF 05,F
.................... if(col==LCMLIMIT){col=0;row+=2;}; //如果列越界,则换行,因为每个字符占2页,所以row要加2;
0B70: MOVF 05,W
0B72: SUBLW C0
0B74: BTFSS FD8.2
0B76: GOTO 0B80
0B7A: CLRF 05
0B7C: MOVLW 02
0B7E: ADDWF 06,F
.................... if (row>7) row=0; //如果行越界,则返回首行;
0B80: MOVF 06,W
0B82: SUBLW 07
0B84: BTFSS FD8.0
0B86: CLRF 06
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -