打印
[复制链接]
1367|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuepeng09|  楼主 | 2014-2-25 14:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的pic32单片机,系统时钟40M,现在使用液晶驱动1621,全显后不能清除,但是部分显示后使用全清没有问题,哪位大神帮忙解决一下。

#include  "includes.h"

const  INT8U NUMCODE[16]={0xf5,0x60,0xd3,0xf2,0x66,
                          0xb6, 0xb7,0xe0,0xf7,0xf6,
                          0xe7,0x37,0x95,0x73,0x97,0x87};       // 0~f
void DelayMS(INT16U x)
{
    INT16U i;
    while(x--)
    {
        for(i=0;i<265;i++);
    }
}

void SendCmd(INT8U command)
{
    cs=0;
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    SendBit_1621(0x80,3);                       //写入标志码"100"和9位command命令,由于
    SendBit_1621(command,9);                        //为了编程方便,直接将command的最低位写"0"
    cs=1;                                       
}

/********************************************************
函数名称:void Ht1621_Init(void)
功能描述: HT1621初始化
全局变量:无
参数说明:无
返回说明:无
版 本:1.0
说 明:初始化后,液晶屏所有字段均不显示
********************************************************/
void Ht1621_Init(void)
{
    cs = 1;
    wr = 1;
    dat = 1;
    display_key = 1;
    mPORTBSetPinsDigitalOut(BIT_6);
    mPORTCSetPinsDigitalOut(BIT_5 | BIT_4 | BIT_3);
    mPORTASetPinsDigitalOut(BIT_9);
   
    DelayMS(2000); //延时使LCD工作电压稳定
    SendCmd(BIAS);
   
    SendCmd(RC256K);
    SendCmd(SYSEN);

    SendCmd(LCDON);
    SendCmd(TONEOFF);

    Nop();
    Nop();
    Nop();
    Nop();
    Nop();

    WriteClearAll_1621(0,16);
}

//===========================================================================//
//由高到低,发送数据位;用于发送地址,标志码
//===========================================================================//
void SendBit_1621(INT8U data,INT8U cnt)                //data的高cnt位写入HT1621,高位在前
{
    INT8U i=0;
    for(i=0; i < cnt; i++)
    {
        wr=0;
         Nop();
         Nop();
         Nop();
        // Nop();
        // Nop();
        if((data & 0x80) == 0)
           dat=0;
        else
           dat=1;              
        wr=1;
         Nop();
         Nop();
        // Nop();
        // Nop();
        data <<= 1;
    }
}

//===========================================================================//
//由低到高,发送数据位;用于发送数据
//===========================================================================//
void SendDataBit_1621(INT8U data,INT8U cnt)        //data的低cnt位写入HT1621,低位在前
{
    INT8U i=0;
    for(i=0; i < cnt; i ++)
    {
        wr=0;
             Nop();
         Nop();
         Nop();
        // Nop();
        // Nop();
        if((data & 0x01) == 0)
           dat = 0;
        else
           dat = 1;
       
            wr=1;
         Nop();
         Nop();
         Nop();
         Nop();
        data >>= 1;
   }
}

//===========================================================================//
//对某个地址写数据;
//===========================================================================//
void Write_1621(INT8U addr,INT8U data)
{
    addr<<=2;
    cs=0;
    Nop();
    Nop();
    Nop();
    Nop();
    SendBit_1621(0xa0,3);                //写入标志码"101"
    SendBit_1621(addr,6);                //写入addr的高6位
    SendDataBit_1621(data,4);                //写入data的低4位
    cs=1;
}
//===========================================================================//
//对某个连续地址写2个数据,即写一个字节
//===========================================================================//
void WriteByte_1621(INT8U addr,INT8U data)
{
    addr<<=2;
    cs=0;
    Nop();
    Nop();
    Nop();
    Nop();
    SendBit_1621(0xa0,3);                //写入标志码"101"
    SendBit_1621(addr,6);                //写入addr的高6位
    SendDataBit_1621(data,8);                //写入data的低8位
    cs=1;
}
//===========================================================================//
//对所有的地址写数据;
//===========================================================================//
void WriteAll_1621(INT8U addr,INT8U *p,INT8U cnt)
{
    INT8U i;
    cs=0;
    Nop();
    Nop();
    Nop();
    Nop();
    SendBit_1621(0xa0,3);                //写入标志码"101"
    SendBit_1621(addr<<2,6);                //写入addr的高6位
    for(i =0; i <cnt; i ++,p++)                //连续写入数据
    {
        SendDataBit_1621(*p,8);
    }
    cs=1;
}
//===========================================================================//
//对所有的地址写零数据;
//===========================================================================//
void WriteClearAll_1621(INT8U addr, INT8U cnt)
{
    INT8U i;
    cs=0;
    Nop();
         Nop();
         Nop();
         Nop();
    SendBit_1621(0xa0,3);                //写入标志码"101"
    SendBit_1621(addr<<2,6);                //写入addr的高6位
    for(i =0; i <cnt; i ++)                //连续写入数据
    {
        SendDataBit_1621(0,8);
    }
    cs=1;
}

//===========================================================================//
//对所有的地址写一数据;
//===========================================================================//
void WriteoneAll_1621(INT8U addr, INT8U cnt)
{
    INT8U i;
    cs=0;
    Nop();
         Nop();
         Nop();
         Nop();
    SendBit_1621(0xa0,3);                //写入标志码"101"
    SendBit_1621(addr<<2,6);                //写入addr的高6位
    for(i = 0; i < cnt; i ++)                //连续写入数据
    {
        SendDataBit_1621(0xff,8);
    }
    cs=1;
}

主函数
Ht1621_Init();
    WriteoneAll_1621(0,16);
    WriteClearAll_1621(0,16);
while(1)
    {
    Write_1621(0,0x08);
    for(i = 0; i < 1000000;i++);
    WriteClearAll_1621(0,16);
    for(i = 0; i < 1000000;i++);
    }
还是显示全部。。。
沙发
xuepeng09|  楼主 | 2014-2-25 14:21 | 只看该作者
qq 229301763

使用特权

评论回复
板凳
yewuyi| | 2014-2-26 08:57 | 只看该作者
你应该去看HT1621的数据手册,对着手册上的时序写代码

使用特权

评论回复
地板
ayb_ice| | 2014-2-26 15:23 | 只看该作者
都用32位了,一个模拟SPI应该轻松搞定

使用特权

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

本版积分规则

1

主题

9

帖子

0

粉丝