打印

今天早上发现了12C887在液晶上显示的规律

[复制链接]
1683|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuanquan12345|  楼主 | 2010-9-29 07:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
john_light| | 2010-9-29 08:38 | 只看该作者
1、确定读出的实时时钟是否正常;
2、确定刷新显示的步骤是否正确。

使用特权

评论回复
板凳
yuanquan12345|  楼主 | 2010-9-29 11:22 | 只看该作者
又将程序修改了一遍,还不行。
我将程序贴上来:#include <reg51.h>
#include <intrins.h>
       
#define uchar unsigned char
#define uint  unsigned int

/*12864端口定义*/
#define LCD_data  P1             //数据口
sbit LCD_RS  =  P3^5;            //寄存器选择输入
sbit LCD_RW  =  P3^6;            //液晶读/写控制
sbit LCD_EN  =  P3^7;            //液晶使能控制
//sbit LCD_PSB =  P3^7;            //串/并方式控制
sbit dscs=P2^4;
sbit dsas=P2^5;
sbit dsrw=P2^6;
sbit dsds=P2^7;
uchar code dis1[] = {"  东滩矿欢迎您 "};
uchar code dis2[] = {"2010年09月09日  "};
uchar code dis3[] = {"  ::  ::  "};
//uchar code dis4[] = {"星期四  温度:20 C"};
uchar aa,shi,fen,miao,shi1,shi2,ge1,ge2;
bit flag=0;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void set_time();
uchar read_ds(uchar );
void write_ds(uchar ,uchar );
void lcd_pos(uchar X,uchar Y);  //确定显示位置
/*******************************************************************/
/*                                                                 */
/*  延时函数                                                       */
/*                                                                 */
/*******************************************************************/
void delay(int ms)
{
    while(ms--)
        {
      uchar i;
          for(i=0;i<250;i++)  
           {
            _nop_();                          
                _nop_();
                _nop_();
                _nop_();
           }
        }
}               
/*******************************************************************/
/*                                                                 */
/*检查LCD忙状态                                                    */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
/*                                                                 */
/*******************************************************************/
bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P1&0x80);
    LCD_EN = 0;
    return(result);
}
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P1 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P1 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}

/*******************************************************************/
/*                                                                 */
/*  LCD初始化设定                                                  */
/*                                                                 */
/*******************************************************************/
void write_sfm(uchar add,uchar date)
{
        uchar shi1,ge1;
        shi1=date/10;
        ge1=date%10;
        lcd_wcmd(0x88+add);
        lcd_wdat(0x30+shi1);
        lcd_wdat(0x30+ge1);
}

/*******初始化12864液晶*********/
/*void Ini_Lcd()
{   uchar i;
//    rd=0;
    write_ds(0x0a,0x21);//打开振荡器;
    write_ds(0x0b,0x75);
    write_ds(0,00);
    write_ds(2,4);
    write_ds(4,14);
   
  
    LCD_EN=0;
    LCD_RW=0;
    LCD_RS=0;
   
    write_cmd(0x30);   //基本指令集
    delay(5);
    write_cmd(0x02);   // 地址归位
    delay(5);
    write_cmd(0x0c);   //整体显示打开,游标关闭
    delay(5);
   // Write_Cmd(0x01);   //清除显示
    delay(5);
    write_cmd(0x06);   //游标右移
    delay(5);
    write_cmd(0x88);   //设定显示的起始地址
    write_cmd(0x88);
for(i = 0; i < 14; i++)
    Write_Data(table[i]);
write_cmd(0x90);
for(i = 0; i < 10; i++)
    Write_Data(table1[i]);
}*/
void lcd_init()
{
        uchar i;

    //LCD_PSB = 1;         //并口方式
     write_ds(0x0a,0x21);//打开振荡器;
    write_ds(0x0b,0x75);
   
    set_time();                        //向ds12c887写数据
        lcd_wcmd(0x02);      //地址归位
    delay(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay(5);
    lcd_wcmd(0x0C);      //显示开,关光标
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
    lcd_wcmd(0x06);      //游标右移
    delay(5);
    lcd_wcmd(0x80);      //设定显示起始地址
    delay(5);
        lcd_wcmd(0x88);
    for(i = 0; i < 10; i++)
            lcd_wdat(dis3[i]);
       
    /*lcd_wcmd(0x0C);      //显示开,关光标
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);*/
}

使用特权

评论回复
地板
yuanquan12345|  楼主 | 2010-9-29 11:23 | 只看该作者
/**************************************/
     /* DS12C887时钟芯片写指令*/
/**************************************/
void write_ds(uchar add,uchar date)
{
        dscs=0;
        dsas=1;
        dsds=1;
        dsrw=1;
        P0=add;
        dsas=0;
        dsrw=0;
        P0=date;
        dsrw=1;
        dsas=1;
        dscs=1;                               
}

/************************************/
      /* DS12C887读指令*/
/************************************/

uchar read_ds(uchar add)
{
        uchar ds_date;
        dsas=1;
        dsds=1;
        dsrw=1;
        dscs=0;
        P0=add;
        dsas=0;
        dsds=0;
        P0=0xff;
        ds_date=P0;
        dsds=1;
        dsas=1;
        dscs=1;
        return ds_date;       
}

void set_time()
{
        write_ds(4,11);
        write_ds(2,15);
        write_ds(0,20);
}

/*********************************************************/
/*                                                         */
/* 主程序*/
/*                                                       */
/*********************************************************/
void main(void)
{
         
     lcd_init();
         while(1)
           {
                shi=read_ds(4);   
                fen=read_ds(2);
        miao=read_ds(0);
            write_sfm(4,miao);
            //lcd_wdat(0x3a);
            write_sfm(2,fen);
                //lcd_wdat(0x3a);
            write_sfm(0,shi);
        }
}   

/*********************************************************/
/*                                                       */
/* 设定显示位置                                          */
/*                                                       */
/*********************************************************/
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 ;  
   lcd_wcmd(pos);     //显示地址
}

使用特权

评论回复
5
zkkov2000| | 2010-9-29 11:24 | 只看该作者
有时候板子做的不好对它也有干扰。
ds12c887假货多,建议换其他的片子。

使用特权

评论回复
6
yuanquan12345|  楼主 | 2010-9-29 11:25 | 只看该作者
我设定的时间怎么也写不进去?
等待指点。

使用特权

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

本版积分规则

75

主题

1155

帖子

3

粉丝