📄 lcd_19264_main.lst
字号:
.................... }/*上半个字符输出结束*/
0B88: INCF x61,F
0B8A: GOTO 0B0C
....................
.................... col=x; /*列对齐*/
0B8E: MOVFF 5D,05
.................... row=y+1; /*指向下半个字符行*/
0B92: MOVLW 01
0B94: ADDWF 5E,W
0B96: MOVWF 06
.................... /****************下半个字符输出****************/
.................... for(i=0;i<widthw;i++)
0B98: CLRF x61
0B9A: MOVF x60,W
0B9C: SUBWF x61,W
0B9E: BTFSC FD8.0
0BA0: GOTO 0C22
.................... { if(widthw==8) cbyte=Ezk[xi]; //从8X16点阵字符中取英文点阵码;
0BA4: MOVF x60,W
0BA6: SUBLW 08
0BA8: BTFSS FD8.2
0BAA: GOTO 0BD0
0BAE: MOVFF 63,03
0BB2: MOVF x62,W
0BB4: MOVFF FF2,66
0BB8: BCF FF2.7
0BBA: MOVFF 63,FF7
0BBE: CALL 0276
0BC2: BTFSC x66.7
0BC4: BSF FF2.7
0BC6: MOVWF 01
0BC8: MOVFF 01,07
.................... else cbyte=Hzk[xi]; //从16X16点阵字符中取汉字点阵码;
0BCC: GOTO 0BEE
0BD0: MOVFF 63,03
0BD4: MOVF x62,W
0BD6: MOVFF FF2,66
0BDA: BCF FF2.7
0BDC: MOVFF 63,FF7
0BE0: CALL 0004
0BE4: BTFSC x66.7
0BE6: BSF FF2.7
0BE8: MOVWF 01
0BEA: MOVFF 01,07
.................... Wrdata(cbyte); //将数据X的值,写入到坐标为(col,row)的存储单元;
0BEE: MOVFF 07,66
0BF2: CALL 0A0C
....................
.................... xi++; //修改"字符点阵码"的偏移量,为取下一个字节做准备;
0BF6: INCF x62,F
0BF8: BTFSC FD8.2
0BFA: INCF x63,F
.................... col++; //修改DDRAM的列地址,为指向下一个DDRAM地址单元做准备;
0BFC: INCF 05,F
.................... if(col==LCMLIMIT){col=0;row+=2;}; //如果列越界,则换行,因为每个字符占2页,所以row要加2;
0BFE: MOVF 05,W
0C00: SUBLW C0
0C02: BTFSS FD8.2
0C04: GOTO 0C0E
0C08: CLRF 05
0C0A: MOVLW 02
0C0C: ADDWF 06,F
.................... if(row>7) row=1; //如果行越界,则返回首行;
0C0E: MOVF 06,W
0C10: SUBLW 07
0C12: BTFSC FD8.0
0C14: GOTO 0C1C
0C18: MOVLW 01
0C1A: MOVWF 06
.................... }/*下半个字符输出结束*/
0C1C: INCF x61,F
0C1E: GOTO 0B9A
....................
.................... row=y; //恢复DDRAM的行地址,为写"下一个字符"做准备;
0C22: MOVFF 5E,06
.................... }/*整个字符输出结束*/
0C26: RETLW 00
....................
.................... /****************************************/
.................... /* 一个字串的输出 */
.................... /****************************************/
.................... //输入参数:(x,y)分别为DDRAM的列地址和行地址,x只能取8的倍数值,y只能取2的倍数值;
.................... //输入参数:array表示数组,即待显示的汉字内码或ASCII内码;
.................... //输入参数:i,表示数组array[]中,待显示的内码有i个;
.................... void Putstr(int x,int y,int *array,int i)
.................... { int j,wordx;
.................... for(j=0;j<i;j++)
0C28: CLRF 5A
0C2A: MOVF 59,W
0C2C: SUBWF 5A,W
0C2E: BTFSC FD8.0
0C30: GOTO 0C9E
.................... { wordx=array[j]; //取区码和位码,第1字节为区码,第2字节为位码;
0C34: CLRF 03
0C36: MOVF 5A,W
0C38: ADDWF 57,W
0C3A: MOVWF FE9
0C3C: MOVF 58,W
0C3E: ADDWFC 03,W
0C40: MOVWF FEA
0C42: MOVF FEF,W
0C44: MOVWF 5B
.................... delay_ms(2); //延时2ms;
0C46: MOVLW 02
0C48: MOVWF 5C
0C4A: CALL 0878
.................... if(wordx>=0x80) Putedot(x,y,wordx&0x7f,16); //区码小于0x80的为ASCII码字符;
0C4E: MOVF 5B,W
0C50: SUBLW 7F
0C52: BTFSC FD8.0
0C54: GOTO 0C76
0C58: MOVF 5B,W
0C5A: ANDLW 7F
0C5C: MOVWF 5C
0C5E: MOVFF 55,5D
0C62: MOVFF 56,5E
0C66: MOVFF 5C,5F
0C6A: MOVLW 10
0C6C: MOVWF x60
0C6E: CALL 0AE0
.................... else Putedot(x,y,wordx-0x20,8); //因为ascii码表是从0x20开始的,所以wordx-0x20
0C72: GOTO 0C90
0C76: MOVLW 20
0C78: SUBWF 5B,W
0C7A: MOVWF 5C
0C7C: MOVFF 55,5D
0C80: MOVFF 56,5E
0C84: MOVFF 5C,5F
0C88: MOVLW 08
0C8A: MOVWF x60
0C8C: CALL 0AE0
.................... x=col; //更新(x,y)坐标;
0C90: MOVFF 05,55
.................... y=row;
0C94: MOVFF 06,56
.................... }
0C98: INCF 5A,F
0C9A: GOTO 0C2A
.................... }
0C9E: RETLW 00
....................
.................... /****************************************/
.................... /* 画点 */
.................... /****************************************/
.................... //函数功能:在DDRAM中,位于(col,row)处的点单元点亮;
.................... //输入参数:col为DDRAM的列地址,row为DDRAM的行号,同DDRAM的页地址是有差别的;
.................... void point(void)
.................... { int x1,y1,y;
.................... x1=col; //将DDRAM的列地址col保存到暂态变量x1,为恢复列地址做准备;
.................... y1=row; //DDRAM的行号row保存到暂态变量y1,为恢复DDRAM的行号做准备;
.................... row=y1>>3; //将DDRAM的行号y1除以8,就得到页地址,保存到row中;
.................... Rddata(); //从LCM中读取地址为(col,row)处的内容,结果保存在cPbyte中;
.................... y=y1&0x07; //求y1在页地址(y1/8)中,位于第几位;
.................... Wrdata(cbyte|1<<y); //在DDRAM地址(x1,y1/8)处,将其单元的第y位设置为1显示,并点亮该点;
.................... col=x1; //恢复DDRAM的列地址;
.................... row=y1; //恢复DDRAM的行号;
.................... }
....................
.................... // UCDOS软件中的文件HZK16和文件ASC16分别为16×16的国标汉字点阵文件
.................... //和8×16的ASCII码点阵文件,以二进制格式存储。在文件HZK16中,按汉
.................... //字区位码从小到大依次存有国标区位码表中的所有汉字,每个汉字占用32
.................... //个字节,每个区为94个汉字。在文件ASC16中按ASCII码从小到大依次存
.................... //有8×16的ASCII码点阵,每个ASCII码占用16个字节。
.................... // 在PC机的文本文件中,汉字是以机内码的形式存储的,每个汉字占用两个
.................... //字节:第一个字节为区码,为了与ASCII码区别,范围从十六进制的0A1H开始
.................... //(小于80H的为ASCII码字符),对应区位码中区码的第一区;第二个字节为位
.................... //码,范围也是从0A1H开始,对应某区中的第一个位码。这样,将汉字机内码减
.................... //去0A0AH就得该汉字的区位码,每个有94个汉字。
.................... /*
.................... UCDOS软件中的文件HZK16和文件ASC16分别为16×16的国标汉字点阵文件
.................... 和8×16的ASCII码点阵文件,以二进制格式存储。在文件HZK16中,按汉
.................... 字区位码从小到大依次存有国标区位码表中的所有汉字,每个汉字占用32
.................... 个字节,每个区为94个汉字。在文件ASC16中按ASCII码从小到大依次存
.................... 有8×16的ASCII码点阵,每个ASCII码占用16个字节。
.................... 在PC机的文本文件中,汉字是以机内码的形式存储的,每个汉字占用两个
.................... 字节:第一个字节为区码,为了与ASCII码区别,范围从十六进制的0A1H开始
.................... (小于80H的为ASCII码字符),对应区位码中区码的第一区;第二个字节为位
.................... 码,范围也是从0A1H开始,对应某区中的第一个位码。这样,将汉字机内码减
.................... 去0A0AH就得该汉字的区位码。
.................... 例如汉字“房”的机内码为十六进制的“B7BF”,其中“B7”表示区码,
.................... “BF”表示位码。所以“房”的区位码为0B7BFH-0A0A0H=171FH。将区码和位
.................... 码分别转换为十进制得汉字“房”的区位码为“2331”,即“房”的点阵位于
.................... 第23区的第31个字的位置,相当于在文件HZK16中的位置为:
.................... 第32×[(23-1) ×94+(31-1)]=67136以后的32个字节为“房”的显示点阵。
.................... HZK16.BIN是16X16点阵的ASCII码;
.................... 下面是个“房”字(地址67136=0x10640):
.................... 00010640 02 00 01 08 3F FC 20 08 3F F8 21 00 20 84 3F FE ....?? .??!. .??
.................... 00010650 22 00 22 10 23 F8 22 10 44 10 44 10 88 A0 10 40 ".".#.".D.D....@
.................... 0x0200 0000001000000000
.................... 0x0108 0000000100001000
.................... 0x3ffc 0011111111111100
.................... 0x2008 0010000000001000
.................... 0x3ff8 0011111111111000
.................... 0x2100 0010000100000000
.................... 0x2084 0010000010000100
.................... 0x3ffe 0011111111111110
.................... 0x2200 0010001000000000
.................... 0x2210 0010001000010000
.................... 0x23f8 0010001111111000
.................... 0x2210 0010001000010000
.................... 0x4410 0100010000010000
.................... 0x4410 0100010000010000
.................... 0x88a0 1000100010100000
.................... 0x1040 0001000001000000
.................... ASC16.BIN是8X16点阵的ASCII码;
.................... ASC16的第55行为:'7',(地址55=0x037)点阵代码如下:
.................... 00000370 00 00 FE C6 06 06 0C 18 30 30 30 30 00 00 00 00 ........0000....
.................... 0x00 00000000
.................... 0x00 00000000
.................... 0xfe 11111110
.................... 0xc6 11000110
.................... 0x06 00000110
.................... 0x06 00000110
.................... 0x0c 00001100
.................... 0x18 00011000
.................... 0x30 00110000
.................... 0x30 00110000
.................... 0x30 00110000
.................... 0x30 00110000
.................... 0x00 00000000
.................... 0x00 00000000
.................... 0x00 00000000
.................... 0x00 00000000
.................... */
....................
.................... //LCD19264的命令:
.................... //1 显示开关控制命令:
.................... // R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
.................... // 0 0 0 0 1 1 1 1 1 D
.................... // D=1,命令打开LCD显示;D=0,命令关闭LCD显示;
....................
.................... //2 显示起始行设置命令:
.................... // R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
.................... // 0 0 1 1 A5 A4 A3 A2 A1 A0
.................... //0xc0+z,其中0<=z<=63,设置DDRAM的第z行作为显示的第1行;
.................... //当z=62时,则显示起始行与DDRAM的对应关系如下:
.................... //DDRAM地址为0xc0+62表示为显示的第1行,DDRAM地址为0xc0+63表示为显示的第2行;
.................... //DDRAM地址为0xc0+0表示为显示的第3行,DDRAM地址为0xc0+1表示为显示的第4行;
.................... //DDRAM地址为0xc0+31表示为显示的第28行,DDRAM地址为0xc0+32表示为显示的第29行;
....................
.................... //3 页地址设置命令:
.................... // R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
.................... // 0 0 1 0 1 1 1 A2 A1 A0
.................... //0xb8+x,其中0<=x<=7;
.................... //所谓"页地址"就是DDRAM的行地址,8行为1页,本模块共有64行,即8页;
.................... //4 设置Y地址命令:
.................... // R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
.................... // 0 0 0 1 A5 A4 A3 A2 A1 A0
.................... //0x40+y,其中0<=y<63;
.................... //DDRAM地址表:
.................... // CS1=1(当模块为19264A01时,CS1=0)| CS2=1(当模块为19264A01时,CS2=0)| CS3=1(当模块为19264A01时,CS3=0)
.................... // Y= | 0 1 2 3 4 5 6 7 8 ......62 63 | 0 1 2 3 4 5 6 7 8 ......62 63 | 0 1 2 3 4 5 6 7 8 ......62 63 |行号
.................... // ____|________________________________|________________________________|________________________________|____
.................... // X=0 | DB0 DB0 DB0 DB0 ...DB0 DB0 DB0 | DB0 DB0 DB0 DB0 ...DB0 DB0 DB0 | DB0 DB0 DB0 DB0 ...DB0 DB0 DB0 | 0
.................... // | DB1 DB1 DB1 DB1 ...DB1 DB1 DB1 | DB1 DB1 DB1 DB1 ...DB1 DB1 DB1 | DB1 DB1 DB1 DB1 ...DB1 DB1 DB1 | 1
.................... // | DB2 DB2 DB2 DB2 ...DB2 DB2 DB2 | DB2 DB2 DB2 DB2 ...DB2 DB2 DB2 | DB2 DB2 DB2 DB2 ...DB2 DB2 DB2 | 2
...............
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -