delta8921 发表于 2011-11-2 21:09:16

STC单片机12864显示时间。有些问题,显示的东西乱码。——大侠帮忙呀

#include <reg52.h>   
#include <intrins.h>
#include <Image.h>

#define uint unsigned int   
#define uchar unsigned char   
   
void delay(uchar x);
void send(uchar command_data,bit key) ;

   
/*12864(ST7920) pins define*/
   
sbit CS=P2^0;   
sbit SID=P2^1;   
sbit SCLK=P2^2;

sbit P35=P3^5;
sbit P32=P3^2;                       
sbit P33=P3^3;
sbit P34=P3^4;

uchar command_data;

uint m_sec;

int sec_1;
int sec_2;
int minu_1;
int minu_2;
int hour_1;
int hour_2;

uchar time[]={"00:00:00"};              //                hour:minute:second

void delay(uchar x)   
{   
        while(x--);
}

void delay1(uchar t)
{
        uchar i,j;
        for(i=0;i<t;i++)
                for(j=0;j<100;j++);       
}

void send(uchar command_data,bit key)
{   
        uchar i;   
        uchar i_data,temp_data2;
        if(key==0)
               i_data=0xf8;                    //11111000; control command
        else   
                i_data=0xfa;                       //11111010; data
        _nop_();        _nop_();
        CS=1;   
        SCLK=0;
        _nop_(); _nop_();
        for(i=0;i<8;i++)   
        {   
                SCLK=0;
                   _nop_();_nop_();
                SID=(bit)(i_data&0x80);            //hight bit first
                delay1(1);        
                SCLK=1;
                delay1(1);        
                SCLK=0;
                _nop_();         _nop_();
                i_data=(i_data<<1);
                _nop_();           _nop_();
        }   
       
        i_data=command_data;   
        i_data&=0xf0;                              // hight 4 bit
        for(i=0;i<8;i++)   
        {   
                SCLK=0;
                _nop_();           _nop_();
                SID=(bit)(i_data&0x80);        //hight bit first
                delay1(1);        
                SCLK=1;
                delay1(1);                      
                SCLK=0;
               _nop_();           _nop_();        
                i_data=(i_data<<1);
                _nop_();        _nop_();      
        }   

        i_data=command_data;   
        temp_data2=i_data&0x0f;   
        temp_data2=temp_data2<<4;   
        for(i=0;i<8;i++)   
        {   
                SCLK=0;
                _nop_();        _nop_();        _nop_();   
                SID=(bit)(temp_data2&0x80);            //hight bit first
                delay1(1);        
                SCLK=1;
                delay1(1);        
                SCLK=0;
                _nop_();         _nop_();        
                temp_data2=(temp_data2<<1);
                _nop_();         _nop_();
        }
        CS=0;
}
void time0_work() interrupt 1
{
        EA=0;
        TH0=0x00;
        TL0=0x00;

        m_sec++;
        if(m_sec>30)
        {
                sec_1++;
                m_sec=0;
        }
        if(sec_1>9)
        {
                sec_2++;
                sec_1=0;
        }
        if(sec_2>5)
        {
                minu_1++;
                sec_2=0;
        }

        if(minu_1>9)
        {
                minu_2++;
                minu_1=0;
        }
        if(minu_2>5)
        {
                hour_1++;
                minu_2=0;
        }

        if (hour_1>9)
        {
                hour_2++;
                hour_1=0;
        }
          if(hour_2>2)
         {
             hour_2=0;
            m_sec=0;
         }
        TR0=1;
        EA=1;
}

main()   
{   
        send(0x30,0);        //00110000                  "功能设定:基本指令集"
//        send(0x34,0);      //00110100                "功能设定:扩展指令集"
        send(0x0c,0);        //00001100                "显示状态:整体显示,游标OFF"“
        send(0x01,0);       //00000001                  "清除显示"
        delay1(1);
        send(0x02,0);        //00000010               ·"地址归位"
        send(0x80,0);       //10000000               "设定DDRAM的地址"

        TMOD=0x01;

        TH0=0x00;
        TL0=0X00;

        ET0=1;
        EA=1;
        TR0=1;


        while(1)
        {
                time=sec_1;
                time=sec_2;       
                time=minu_1;
                time=minu_2;

                time=hour_1;
                time=hour_2;

                send(0x90,0);
                send(time,1);
                send(time,1);
                send(time,1);
                send(time,1);
                send(time,1);
                send(time,1);
                send(time,1);
                send(time,1);

                delay1(1000);                       
        }   
}

这个程序编译也能通过,测试过,静态显示“00:00:00”是OK的,但是就是不能计数。
程序中没有严格按照现实中时间来,所以定时器的溢出周期为65536.

现在在12864上,是乱码,但是也是在按照大约1s跳一次的乱码。
不知道那里不对了?
请高手给个意见。。。

delta8921 发表于 2011-11-2 21:09:41

自己先顶顶了

ju748 发表于 2011-11-2 23:50:39

PSB管脚没处理好

或者全角半角没搞清

又或者碰到0xFD了

delta8921 发表于 2011-11-3 13:28:43

回复【2楼】ju748 持诚求真
-----------------------------------------------------------------------

PSB我实在硬件上直接拉low的。。


什么全角半角,我不太明白?
还有0xfd是什么呀?

高手,能力越大,责任越大……帮帮忙吧

xielong4183 发表于 2011-11-3 14:19:40

初始化后LCD会随机点亮一些点,必须清屏及关闭所有显示,当你每次更新数据的时候清一次。

chenzhenlindx 发表于 2011-11-4 13:31:01

每次写入之前把LCD的存储器清除一下,程序发的不是完整的

delta8921 发表于 2011-11-4 21:06:25

回复【4楼】xielong4183 梦灭
-----------------------------------------------------------------------

回复【5楼】chenzhenlindx
-----------------------------------------------------------------------

试试,每次发送新的数据都要清屏吗?

tamadeji303 发表于 2011-11-4 21:18:30

不懂帮顶

shizhijian 发表于 2011-11-5 13:53:18

以前做过的确实有的东西显示乱码,我总结有两种情况,第一种是上电延时不够,12864的驱动初始化没做好,还有就是有些字字库里没有,肯定显示的就是乱码,楼主参考下

liaihua1997 发表于 2011-11-5 19:19:50

STC的单片机没有问题吧,呵呵,我做的都是好的,

bg8wj 发表于 2011-11-14 23:27:48

stc是1t的单片机,你的程序是在at89c上用的,spi液晶读写时,三个nop时间是12t的 抄到stc上肯定用不了!我给你一个st7920驱动函数
/*******************************************************
                  LCD显示驱动操作模块
*******************************************************/
/*-----------写控制字到LCD12864------------*/
void write_cmd(unsigned char cmd)
{
        unsigned char i;
        unsigned char i_data;
        i_data=0xf8;                                                    //命令控制字:11111000写指令 11111010写数据 11111100读状态 11111110读数据
        CS=1;                                                                  //片选置高,才能进行读写操作
        SCLK=0;
/*----------写命令控制字-----------------*/
        for(i=0;i<8;i++)                                          //循环八次,每次读取一位数据
        {
                SID=(bit)(i_data&0x80);                          //bit表示取其最高位
                SCLK=0;
                SCLK=1;                                                          //正跳变写入指令
                i_data=i_data<<1;                                  //左移一位
        }                                               
/*---------------------------------------*/

/*----------写指令高四位-----------------*/
        i_data=cmd;
        i_data=i_data&0xf0;                                          //把低四位置0
        for(i=0;i<8;i++)                                          //循环八次,每次读取一位数据
        {
               
                SID=(bit)(i_data&0x80);                          //bit表示取其最高位
                SCLK=0;
                SCLK=1;                                                          //正跳变写入指令
                i_data=i_data<<1;                                  //左移一位
        }                                                                
/*---------------------------------------*/

/*----------写指令低四位-----------------*/
        i_data=cmd;
        i_data=i_data<<4;                                          //左移四位,把低四位的数据移到高四位,再把低四位置0
        for(i=0;i<8;i++)                                          //循环八次,每次读取一位数据
        {
                SID=(bit)(i_data&0x80);                          //bit表示取其最高位
                SCLK=0;
                SCLK=1;                                                       //正跳变写入指令
                i_data=i_data<<1;                               //左移一位
        }       
/*-----------------------------------------*/                       
        CS=0;                                                               //把片选置低
        delay5ms();                                               //延时是因为没有进行忙检测,适当的延时可以不进行忙检测
}
/*-----------------------------------------*/

/*------------写数据到LCD12864-------------*/
void write_dat(unsigned char dat)
{
        unsigned char i;
        unsigned char i_data;
        i_data=0xfa;
        CS=1;
        for(i=0;i<8;i++)
        {
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
        }

        i_data=dat;
        i_data=i_data&0xf0;
        for(i=0;i<8;i++)
        {
               
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
        }

        i_data=dat;
        i_data=i_data<<4;
        for(i=0;i<8;i++)
        {
               
                SID=(bit)(i_data&0x80);
                SCLK=0;
                SCLK=1;
                i_data=i_data<<1;
        }
        CS=0;
        delay5ms();
}

void delay5ms(void)   //误差 0.000000000000us
{
    unsigned char a,b;
    for(b=194;b>0;b--)
      for(a=141;a>0;a--);
}

delay5ms函数是针对22.1184mhz计算出来的 a b 值

christiny123 发表于 2011-11-17 16:58:54

有可能是写命令或者写数据函数时候,SID,SCLK,CS引脚电平变化之后没有加延时。我最开始用STC12C5A40S2做12864的,后来改成用STM32后发现不行,搞了很久原来是延时不够问题
页: [1]
查看完整版本: STC单片机12864显示时间。有些问题,显示的东西乱码。——大侠帮忙呀