傻孩子,请你帮我解决一下,12864的送显问题.谢谢!!
傻孩子,你好,刚刚接触12864,c语言学的也不好,有好多东西不会,所以有问题就来请教你了,请你在不忙的时候,帮我一下!!下面是我弄的入门的一个很简单的显示,程序中注释为★的地方就是我的问题了,我想通过统一的写函数(注释有■的地方),来显示汉字和变化的数字,但是
v_Lcd12864PutString_f( 4,1,1,shi,"0123456789") 中的shi在变化,但是显示出来的确实不变的一个定值(一直是0);但是下面通过
v_Lcd12864SendData_com(1,tab);直接送显,就正常着.
我指针学的不好,找不到问题,请你帮帮我.谢谢!
----------------------------------------------------------------------------------------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
#define uintunsigned int
#define uchar unsigned char
sbit io_LCD12864_CS = P1^0 ;
sbit io_LCD12864_STD = P1^1 ;
sbit io_LCD12864_SCLK = P1^2 ;
sbit io_LCD12864_PSB= P1^3; //H=并口; L=串口;
sbit io_LCD12864_RST= P1^4; //Reset Signal 低电平有效
#define comm0//指令
#define dat 1//数据
uchartab[]={"0123456789"};
void v_DelayMs_f( uint nDelay ) //延时
{
unsigned int i ;
for( ; nDelay > 0 ; nDelay-- )
{
for( i = 125 ; i > 0 ; i-- ) ;
}
}
/*-------------写函数------------------*/
void v_Lcd12864SendData_com(uchar dat_comm,uchar content)
{
uchar a,i,j;
v_DelayMs_f(80);
a=content;//要写如的值
io_LCD12864_CS=1; //片选 -----------制造写入的时序
io_LCD12864_SCLK=0; //给低电平------准备发送串行数据
io_LCD12864_STD=1; //串行数据--置高---连续5次高位,--[这里选择为高不变]
for(i=0;i<5;i++)//随后两位选择--[读/写]和[数据/指令]
{
io_LCD12864_SCLK=1;
//v_DelayMs_f( 50 ) ;
io_LCD12864_SCLK=0;
}
io_LCD12864_STD=0;//选择写状态
io_LCD12864_SCLK=1;
//v_DelayMs_f( 50 ) ;
io_LCD12864_SCLK=0;
if(dat_comm)//选择是[数据/指令]
io_LCD12864_STD=1; //data
else
io_LCD12864_STD=0; //command
io_LCD12864_SCLK=1;
//v_DelayMs_f( 50 ) ;
io_LCD12864_SCLK=0; //控制字发送完毕----第八位为0,之后开始数据
io_LCD12864_STD=0; //第八位
//v_DelayMs_f( 50 ) ;
io_LCD12864_SCLK=1;
//v_DelayMs_f( 50 ) ;
io_LCD12864_SCLK=0;
for(j=0;j<2;j++) //数据四个一发[先高位],间隔四个零
{
for(i=0;i<4;i++) //循环四次发数据
{
a=a<<1; //左移高位置进位位
io_LCD12864_STD=CY;
io_LCD12864_SCLK=1;
//v_DelayMs_f( 50 ) ;
io_LCD12864_SCLK=0;
}
io_LCD12864_STD=0; //循环发送四个零
for(i=0;i<4;i++)
{
io_LCD12864_SCLK=1;
//v_DelayMs_f( 50 ) ;
io_LCD12864_SCLK=0;
}
}
}
/*------------------初始化-----------------*/
void v_Lcd12864Init_f( void ) //初始化
{
io_LCD12864_PSB=0; //H=并口; L=串口;
io_LCD12864_RST=1; //Reset Signal 低电平有效
v_Lcd12864SendData_com(comm,0x30); //选定基本指令集
v_DelayMs_f( 50 ) ;
v_Lcd12864SendData_com( comm,0x01 ); //清屏
v_DelayMs_f( 50 ) ;
v_Lcd12864SendData_com( comm,0x06 ); //光标右移
v_DelayMs_f( 50 ) ;
v_Lcd12864SendData_com( comm,0x0c ); //开显示
}
/*------------------地址转换-----------------*/
void v_Lcd12864SetAddress_f( uchar x,uchar y )//地址转换---》x是水平坐标,y是垂直坐标
{ //y:0~3,分别选中4行
uchar byAddress ;
switch( y )
{
case 0 : byAddress=0x80+x ; //X表示在某一行中的第几个二级单元
break;
case 1 : byAddress=0x90+x ; //注意:如果在#define中定义了0X80为x1,则下面就不能在出先0X80这个原数,否则错误!!!!!
break;
case 2 : byAddress=0x88+x ;
break;
case 3 : byAddress=0x98+x ;
break;
default :
break;
}
v_Lcd12864SendData_com( comm,byAddress ) ;
}
/*------------------写字符-----------------*///■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
void v_Lcd12864PutString_f( uchar x, uchar y, uchar z,uchar w,uchar *pData ) //z=0连续显示,z=1显示单个字符,z=2显示单个汉字
{ //w用于存放要显示字符串中的起始字符
uchar tuichu;
v_Lcd12864SetAddress_f( x,y );
while( *pData != '\0'&tuichu==0 )
{
switch(z)
{
case 0 : v_Lcd12864SendData_com( dat,*pData++ ) ; //连续显示
break;
case 1: pData=pData+w;
v_Lcd12864SendData_com( dat,*pData ) ;//显示单个字符
tuichu=1;
break;
case 2 : pData=pData+w;
v_Lcd12864SendData_com( dat,*pData ) ;
v_Lcd12864SendData_com( dat,*(pData+1) ) ;
tuichu=1;
break;
default :
break;
}
}
}
/*------------------主函数-----------------*/
void main()
{
uchar ge,shi;
v_Lcd12864Init_f() ;
v_Lcd12864PutString_f( 0,0,0,0,"本次测量的值是:") ;//这种送显的方式很独特--》可以逐字显示,可以在指定的地方显示,指定数量的字
v_Lcd12864PutString_f( 0,1,0,0,"---- 毫米") ;
for(ge=0;ge<=10;ge++)
{
if(ge==10)
{
shi++;
ge=0;
if(shi==9&ge==9)
shi=ge=0;
}
v_DelayMs_f( 50 ) ;
v_Lcd12864PutString_f( 4,1,1,shi,"0123456789") ; //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
v_Lcd12864SendData_com(0,0x95);
v_Lcd12864SendData_com(1,tab);
v_DelayMs_f( 50 ) ;
}
while( 1 ) ;
} 看来傻孩子一直在忙。 这人怕出名啊,点名抓捕你伤不起。
页:
[1]