chunmu126 发表于 2011-4-4 18:15:48

傻孩子,请你帮我解决一下,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 ) ;
}

pancake 发表于 2011-8-10 22:43:23

看来傻孩子一直在忙。

albert_w 发表于 2011-8-10 23:38:57

这人怕出名啊,点名抓捕你伤不起。
页: [1]
查看完整版本: 傻孩子,请你帮我解决一下,12864的送显问题.谢谢!!