打印

请大神帮看看程序是不是有问题,显示一直闪

[复制链接]
1426|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
斗转乾坤|  楼主 | 2013-11-3 12:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

/***************************************************************************/
/***********               单片机引脚定义                       ************/
/***************************************************************************/

sbit sda=P1^0;              //I2C 数据传送位
sbit scl=P1^1;              //I2C 时钟传送位
//
sbit rs=P2^2;                                //12864RS控制位
sbit rw=P2^1;                                //12864RW控制位
sbit e =P2^0;                                //12864E 控制位

/******************************************************************************/
/**********                     数据部分                            ***********/
/******************************************************************************/
#define IIC_READ  0x1D      //定义读指令
#define IIC_WRITE 0x1D      //定义写指令


uchar table4[10]="0123456789";
uchar table6[10]="hulala制作";
uchar table5[10] ="检测地平线";


/**************************************************************************/
/************                  各延时程序                    **************/
/**************************************************************************/
void iic_delay()        //5us延时
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}

void delay_50us(uint t)
{
    uchar j;
        for(;t>0;t--)
        for(j=19;j>0;j--);
}

void delay_50ms(uchar t)
{
    uint j;
        for(;t>0;t--)
        for(j=6000;j>0;j--);
}

/************************************************************************/
/**************                12864显示部分           *****************/
/************************************************************************/
void  write_cmd(uchar cmd)           //函数功能:写指令
{

        rs=0;
        rw=0;
        e=0;
        P0=cmd;
        delay_50us(1);
        e=1;
        delay_50us(1);
        e=0;
}

void write_data(uchar dat)           //函数功能:写数据
{
   
        rs=1;
        rw=0;
    e=0;
        P0=dat;
        delay_50us(1);
        e=1;
        delay_50us(1);
        e=0;
}

void lcd_pos(uchar X,uchar Y)
{
  uchar pos;
  if(X==0)
  {X=0x80;}
  else if(X==1)          
  {X=0x90;}
  else if(X==2)               
  {X=0x88;}
  else if(X==3)
  {X=0x98;}
  pos=X+Y;
  write_cmd(pos);
}
void init()
{
// LCD_PSB = 1;
// delay_1(5);
// LCD_RES = 0;
// delay_1(5);
// LCD_RES = 1;
// delay_1(5);
  write_cmd(0x30);
  delay_50us(10);
  write_cmd(0x0C);
  delay_50us(10);
  write_cmd(0x01);
  delay_50us(10);
}
/*********************************************************************/
/**************               I2C通信部分              ***************/
/*********************************************************************/
void iic_start()               //函数功能:I2C通信开始
{
        sda=1;
    iic_delay();
        scl=1;
    iic_delay();
        sda=0;
        iic_delay();       
}

void iic_stop()                //函数功能:I2C通信停止
{
        sda=0;
        iic_delay();
        scl=1;
        iic_delay();
        sda=1;
        iic_delay();       
}

void iic_ack()                 //函数功能:I2C通信查应答位
{       
        sda=0;
        scl=1;
        iic_delay();
        scl=0;          
}

void iic_write_byte(uchar wdata)        //函数功能:向I2C从机写入一个字节
{
        uchar i,temp;
        temp=wdata;
        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                scl = 0;
                iic_delay();
                sda=CY;
                iic_delay();
                scl=1;
                iic_delay();                       
        }
        scl=0;
        iic_delay();
        sda=1;
        iic_delay();
}

char iic_read_byte(void)        //函数功能:从I2C从机中读出一个字节
{
        uchar x;
        char data_data;
        scl=0;
        iic_delay();
        sda=1;
        for(x=0;x<8;x++)
        {       
                scl=1;
                iic_delay();
                data_data=(data_data<<1)|sda;
                scl=0;
                iic_delay();
        }
        return data_data;
}

void iic_write(uchar byte_add,uchar wdata)        //函数功能:按地址写入一字节数据
{         iic_start();
         iic_write_byte(0x3a);
         iic_ack();
         iic_write_byte(byte_add);
         iic_ack();
         iic_write_byte(wdata);
         iic_ack();
}

char iic_read(uchar byte_add)        //函数功能:按地址读出一字节数据
{
         char x;
         iic_start();
         iic_write_byte(0x3a);
         iic_ack();
         iic_write_byte(byte_add);
         iic_ack();
         iic_start();
         iic_write_byte(0x3b);
         iic_ack();
         x=iic_read_byte();
         iic_stop();
         return x;
}
void self_test7455()                                         //函数功能:检测7455有没有插好
{                                                                         //          如果没有插好,1602将会显示
        int j;                                                         //                         “No acceleration!"
        char t;

        delay_50us(10);
        iic_write(0x16,0x05);
        delay_50us(20);
        t=iic_read(0x16);
        if(t!=0x05)
        {        lcd_pos(2,0);
                for(j=0;j<10;j++)
                {
                        write_data(table6[j]);
                        delay_50us(10);
                }
           while(1);
        }               
}

void sendx()        //函数功能:向12864发送x轴测量数据
{       
        uchar x1,x2,x3,xsign;
        char x;

        x=iic_read(0x06);
        if((x&0x80)==0x00)
        {
                xsign=0x2b;        //+
        }
        else
        {
                xsign=0x2d;        //-
                x=x-0x01;
                x=~x;
        }

        x1=(x/63);
        x2=((x*100/63)%100)/10;
        x3=(x*100/63)%10;

        lcd_pos(0,0);
        write_data('x');
        write_data(xsign);
        write_data(table4[x1]);
        write_data(table4[x2]);
        write_data(table4[x3]);
}

void sendy()        //函数功能:向12864发送y轴测量数据
{
        uchar y1,y2,y3,ysign;
        char y;

        y=iic_read(0x07);
        if((y&0x80)==0x00)
        {
                ysign=0x2b;        //+
        }
        else
        {
                ysign=0x2d;        //-
                y=y-0x01;
                y=~y;
        }

        y1=(y/63);
        y2=((y*100/63)%100)/10;
        y3=(y*100/63)%10;

        lcd_pos(1,0);
        write_data('y');
        write_data(ysign);
        write_data(table4[y1]);
        write_data(table4[y2]);
        write_data(table4[y3]);
}

void sendz()        //函数功能:向12864发送z轴测量数据
{
        uchar z1,z2,z3,zsign;
        char z;

        z=iic_read(0x08);
        if((z&0x80)==0x00)
        {
                zsign=0x2b;        //+
        }
        else
        {
                zsign=0x2d;        //-
                z=z-0x01;
                z=~z;
        }

        z1=(z/63);
        z2=((z*100/63)%100)/10;
        z3=(z*100/63)%10;

        lcd_pos(2,0);
        write_data('z');
        write_data(zsign);
        write_data(table4[z1]);
        write_data(table4[z2]);
        write_data(table4[z3]);
}

/***********************************************************/
/****************          主函数           ****************/
/***********************************************************/
void ma7455_init()
{
        iic_write(0x16,0x05);
}
void main()
{       
        uchar j;
        init();
       
        //self_test7455();
        delay_50ms(2);
          lcd_pos(2,0);
        for(j=0;j<10;j++)
        {
                write_data(table6[j]);
                delay_50us(10);
        }
        lcd_pos(3,0);
        for(j=0;j<10;j++)
        {
                write_data(table5[j]);
                delay_50us(10);
        }ma7455_init();
        while(1)
        {        iic_write(0x10,0x15);//校正X值
                iic_write(0x12,0x25);//校正Y值
        //        iic_write(0x14,0x10);//校正Z值
               
               
                        sendx();
                        delay_50ms(1);
                        sendy();       
                        delay_50ms(1);                }
}               

显示屏一直闪不稳定

相关帖子

沙发
zhangmangui| | 2013-11-3 12:44 | 只看该作者
可能是你一直在send   所以一直闪烁
等有数据改变了你再去send

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
斗转乾坤 + 1 赞一个!
板凳
斗转乾坤|  楼主 | 2013-11-3 17:07 | 只看该作者
zhangmangui 发表于 2013-11-3 12:44
可能是你一直在send   所以一直闪烁
等有数据改变了你再去send

谢谢,我去试试

使用特权

评论回复
地板
zhangmangui| | 2013-11-8 12:51 | 只看该作者
斗转乾坤 发表于 2013-11-3 17:07
谢谢,我去试试

问题解决了吗

使用特权

评论回复
5
斗转乾坤|  楼主 | 2013-11-8 12:55 | 只看该作者
解决了

使用特权

评论回复
6
斗转乾坤|  楼主 | 2013-11-8 12:56 | 只看该作者
zhangmangui 发表于 2013-11-8 12:51
问题解决了吗

就解决了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

70

帖子

2

粉丝