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

📄 lcd_19264_main.lst

📁 LCM19264的测试程序,用于PIC单片机,已经测试通过 可写汉字和英文字符,支持画点
💻 LST
📖 第 1 页 / 共 5 页
字号:
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 + -