1、单片机控制12864液晶显示程序/*/= 函数原型: Pixel(unsigned char PointX,unsigned char PointY, bit Mode)/= 功 能: 在指定坐标位置显示一个点/= 参 数: 坐标,显示点或清除点/= 返 回 值:/= 函数性质:私有函数/= 如果显示屏超过了256*256,请修改这个函数 PointX,PointY的类型/= Mode 1:显示 0:清除该点*/Pixel(unsigned char PointX,unsigned char PointY, bit Mode) unsigned int StartAddr; unsigned
2、char dat; StartAddr=(uint)PointX*30 + PointY/8 + grhome; dat=LC_BIT_OP+7-PointY%8; /生产位操作命令画点的数据 if(Mode) dat=dat|0x08; wr_cmd_2(LC_ADD_POS,StartAddr);/设置该点所在单元地址 wr_cmd_0(dat); / 利用位操作命令画点/*/= 函数原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)/= 功 能:
3、划线函数/= 参 数: 坐标1,坐标2,显示点或清除点/= 返 回 值:/= 函数性质:私有函数/= 其它:显示点阵不超过255*255/*/void line( unsigned char y1,unsigned char x1, unsigned char y2,unsigned char x2, bit Mode) unsigned char x,y; float k,b; if( abs(y1-y2) = abs(x1-x2) ) / |k|=1 k=(float)y2-y1) / (float)x2-x1) ; b=y1-k*x1; if( x1 = x2 ) for(x=x1;x=
4、x2;x+) y=(uchar)(k*x+b); Pixel(x, y, Mode); else for(x=x2;x abs(x1-x2) |K|1 k=(float)x2-x1) / (float)y2-y1) ; b=x1-k*y1; if( y1 = y2 ) for(y=y1;y=y2;y+) x=(uchar)(k*y+b); Pixel( x , y,Mode ); else for(y=y2;y0;i-) if(LCMCP & 0x03) = 0x03) break; return i; / 若返回零,说明错误/*/= 函数原型: uchar check_ar_st/= 功 能
5、: 查询是否可数据自动读状态/= 参 数:/= 返 回 值: 非0不忙,否则忙/= 函数性质:私有函数*/uchar check_ar_st(void) / 状态位ST2 判断(数据自动读状态) uchar i; for(i=100;i0;i-) if(LCMCP & 0x04) = 0x04) break; return i; / 若返回零,说明错误/*/= 函数原型: uchar check_aw_st/= 功 能: 查询是否可数据自动写状态/= 参 数:/= 返 回 值: 非0不忙,否则忙/= 函数性质:私有函数*/uchar check_aw_st(void) / 状态位ST3 判断(
6、数据自动写状态) uchar i; for(i=100;i0;i-) if(LCMCP & 0x08) = 0x08) break; return i; / 若返回零,说明错误/*/= 函数原型: uchar check_scrPeek_st()/= 功 能: 查询是否可屏读/屏拷贝状态状态/= 参 数:/= 返 回 值: 非0不忙,否则忙/= 函数性质:私有函数*/uchar check_scrPeek_st(void) / 状态位ST6 判断(屏读/屏拷贝状态) uchar i; for(i=100;i0;i-) if(LCMCP & 0x40) = 0x40) break; return
7、 i; / 若返回零,说明错误/*/= 函数原型: uchar wr_cmd_2(uchar uCmd,uint uPar)/= 功 能: 给T6963C写带双参数的指令/= 参 数:/= 返 回 值: 返回0 成功,否则忙/= 函数性质:私有函数*/uchar wr_cmd_2(uchar uCmd,uint uPar) / 写双参数的指令 if(check_cmd_st() = 0) return 1; LCMDP = (uchar)(uPar& 0xFF);/先写低字节,再写高字节 if(check_cmd_st() = 0) return 2; LCMDP = (uchar)(uPar
8、8); if(check_cmd_st() = 0) return 3; LCMCP = uCmd; return 0; / 返回0 成功/*/= 函数原型: uchar wr_cmd_1(uchar uCmd,uchar uPar1)/= 功 能: 给T6963C写带单参数的指令/= 参 数:/= 返 回 值: 返回0 成功,否则忙/= 函数性质:私有函数*/uchar wr_cmd_1(uchar uCmd,uchar uPar) / 写单参数的指令 if(check_cmd_st() = 0) return 1; LCMDP = uPar; if(check_cmd_st() = 0)
9、return 2; LCMCP = uCmd; return 0; / 返回0 成功/*/= 函数原型: uchar wr_cmd_0(uchar uCmd)/= 功 能: 给T6963C写无参数的指令/= 参 数:/= 返 回 值: 返回0 成功,否则忙/= 函数性质:私有函数*/uchar wr_cmd_0(uchar uCmd) / 写无参数的指令 if(check_cmd_st() = 0) return 1; LCMCP = uCmd; return 0; / 返回0 成功/*/= 函数原型: uchar wr_data(uchar uData)/= 功 能: 给T6963C写一次数
10、据/= 参 数:/= 返 回 值: 返回0 成功,否则忙/= 函数性质:私有函数*/uchar wr_data(uchar uData) / 写一次数据 if(check_cmd_st() = 0) return 1; LCMDP = uData; return 0; / 返回0 成功/*/= 函数原型: uchar awr_data(uchar uData)/= 功 能: 给T6963C写一个地址增加自动连续数据/= 参 数:/= 返 回 值: 返回0 成功,否则忙/= 函数性质:私有函数*/uchar awr_data(uchar uData) / 自动写数据 if(check_aw_st
11、() = 0) return 1; LCMDP = uData; return 0; / 返回0 成功/*/= 函数原型: uchar ard_data(uchar uData)/= 功 能: 从T6963C读一个地址增加自动连续数据/= 参 数:/= 返 回 值: 返回0 成功,否则忙/= 函数性质:私有函数*/uchar ard_data(void) / 自动读数据 if(check_ar_st() = 0) return 1; return LCMDP;/*/= 函数原型: void char_addr_Pointer_Set(uchar urow, uchar ucol)/= 功 能:
12、 根据字符的行列设置vram地址/= 参 数:/= 返 回 值:/= 函数性质:私有函数*/void char_addr_Pointer_Set(uchar urow, uchar ucol) uint iPos; iPos = urow * 30 + ucol + txthome; wr_cmd_2(LC_ADD_POS,iPos);/*/= 函数原型: Clr_char_Scr(void)/= 功 能: 清除当前文本屏幕/= 参 数:/= 返 回 值:/= 函数性质:公有函数*/void Clr_char_Scr(void)/文本屏可以在内存中保持很多屏 uint i;/ char_add
13、r_Pointer_Set(0,0);/从0行0列开始 char_addr_Pointer_Set(2,0);/从0行0列开始 wr_cmd_0(LC_AUT_WR); / 自动写/ for(i=0;i16*30;i+) /16行30列字符 for(i=0;i14*30;i+) /16行30列字符 awr_data(0x00); / 写数据空白 wr_cmd_0(LC_AUT_OVR); / 自动写结束 char_addr_Pointer_Set(0,0); / 重置地址指针/*/= 函数原型: Clr_lcdram(void)/= 功 能: 清除所有的显示内存/= 参 数:/= 返 回 值:
14、/= 函数性质:私有函数*/void Clr_lcdram(void) uint i; wr_cmd_2(LC_ADD_POS,0x0000); / 设置地址指针0 wr_cmd_0(LC_AUT_WR); / 自动写 for(i=0;i 11);/CGRAM 偏移地址设置 wr_cmd_0(LC_MOD_XOR|0x08); / 显示方式设置,异或,字符全部用RAM区域生成 wr_cmd_0(LC_DIS_SW |0x0c); / 显示开关设置,图文混和模式 Clr_lcdram();/清除内存/*/= 函数原型: Pixel(unsigned char PointX,unsigned ch
15、ar PointY, bit Mode)/= 功 能: 在指定坐标位置显示一个点/= 参 数: 坐标,显示点或清除点/= 返 回 值:/= 函数性质:私有函数/= 如果显示屏超过了256*256,请修改这个函数 PointX,PointY的类型/= Mode 1:显示 0:清除该点*/Pixel(unsigned char PointX,unsigned char PointY, bit Mode) unsigned int StartAddr; unsigned char dat; StartAddr=(uint)PointX*30 + PointY/8 + grhome; dat=LC_B
16、IT_OP+7-PointY%8; /生产位操作命令画点的数据 if(Mode) dat=dat|0x08; wr_cmd_2(LC_ADD_POS,StartAddr);/设置该点所在单元地址 wr_cmd_0(dat); / 利用位操作命令画点/*/= 函数原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)/= 功 能: 划线函数/= 参 数: 坐标1,坐标2,显示点或清除点/= 返 回 值:/= 函数性质:私有函数/= 其它:显示点阵不超过255*
17、255/*/void line( unsigned char y1,unsigned char x1, unsigned char y2,unsigned char x2, bit Mode) unsigned char x,y; float k,b; if( abs(y1-y2) = abs(x1-x2) ) / |k|=1 k=(float)y2-y1) / (float)x2-x1) ; b=y1-k*x1; if( x1 = x2 ) for(x=x1;x=x2;x+) y=(uchar)(k*x+b); Pixel(x, y, Mode); else for(x=x2;x abs(x
18、1-x2) |K|1 k=(float)x2-x1) / (float)y2-y1) ; b=x1-k*y1; if( y1 = y2 ) for(y=y1;y=y2;y+) x=(uchar)(k*y+b); Pixel( x , y,Mode ); else for(y=y2;y=y1;y+) x=(uchar)(k*y+b); Pixel( x , y,Mode ); /*/= 函数原型: void ShowChar(uchar row,uchar col,uchar ch)/= 功 能: 在指定行列显示8*16字符/= 参 数: 坐标行,坐标列,字符串指针/= 返 回 值:/= 函数性
19、质:公有函数/=其它:所有可显示字符不超过128个,否则本函数有溢出的可能*/void showchar(uchar col,uchar row,uchar *chp) #define hzp chp uchar char_sequence_number; uchar ascii_num; row/=8;col/=8; while (*chp != 0) if (*chp0x80)/西文 for (char_sequence_number=0;ASCII_SUB_INDEXchar_sequence_number!=0;char_sequence_number+) if (ASCII_SUB_
20、INDEXchar_sequence_number=*chp) chp+; break; if(ASCII_SUB_INDEXchar_sequence_number=0)chp+;char_sequence_number=1; char_sequence_number*=2;/一个ASCII字符占两个8*8字符 /写字符上半部分 char_addr_Pointer_Set(row,col);/设置Vram地址 wr_data(char_sequence_number); /写数据 wr_cmd_0(LC_UNCHANGED_WR); /写命令 /写字符下半部分 row+=1;/下半部分在下一行 char_addr_Pointer_Set(row,col);/设置Vram地址 wr_data(char_sequence_number+1); /写数据 wr_cmd_0(LC_UNCHANGED_WR); /写命令 /行列地址自动指向下个字符位
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1