用DS12C887在LCD1602上显示时间为什么会出现乱码,求大神指导下?

地球不再转 2016-05-11 06:07:06


#include<reg52.h>
#include "boardinit.h"
#include "1602led.h"
#include "keyscan.h"
#include "delay.h"
#include "74hc595.h"
#include "ds12c887.h"
#define uchar unsigned char
#define uint unsigned int

sbit data_595si =P1^0; //595数据输入口
sbit clk_595srck =P1^4; //595数据写进移位寄存器时钟输入口
sbit e_595rck =P2^3; //595移位寄存器,数据送输出的时钟
sbit rs_1602=P2^5; //1602rs信号 数据1/指令0选择
sbit rw_1602=P2^6; //1602rw信号
sbit e=P2^4;
sbit data_595si =P1^0; //595数据输入口
sbit clk_595srck =P1^4; //595数据写进移位寄存器时钟输入口
sbit e_595rck =P2^3; //595移位寄存器,数据送输出的时钟
sbit duanxuan=P2^5; // 数码管,的段选使能,1 通 0关
sbit weixuan=P2^6; // 数码管,的位选使能,1 通 0关
sbit dsds_ds12c887=P1^0;
sbit dsrw_ds12c887=P1^1;
sbit dsas_ds12c887=P1^2;
//sbit dscs_ds12c887=P1^4; //该板卡的dscs 信号是通过74hc595提供 该使能信号需在下面子函数处理
sbit dsirq_ds12c887=P3^2; //中断

uchar num,time,moshi,moshi1,flag,kaiqi,c;
char shi,fen,miao,shiji,nian,yue,ri,xingqi,ashi,afen,amiao,kaiz;

char code table[]=" 20 - - "; // 20 - -
uchar code table1[]=" : : "; // : :

void write_ds(uchar add,uchar date);
void set_alarm(uchar nshi,uchar nfen,uchar nmiao);
uchar read_ds(uchar add);



void didi()
{
write_byte_74hc595(0x02); //蜂鸣器关
delay(500);
write_byte_74hc595(0x06); //蜂鸣器响
delay(500);
}

void main()
{
boardinit(); //XK-2板卡初始化
lcdinit_1602(); //1602液晶初始化
init_ds12c887();//ds12c887 初始化

EA=1;
IT0=1;
EX0=1;

c=read_ds_ds12c887(0x0c);
write_ds_ds12c887(0x0b,0x26);//如果开启设置 控制器B,数据为BCD码,时间为24小时制,产生闹钟中断
num=0;time=0;moshi=0;moshi1=0;flag=0;kaiqi=0;
write_order_1602(0x80);

//**************************************************************************
/* 该部分是调试程序时候使用,当出现时间日期乱码时候,可以尝试重新写入给定数据
判断是否是内部保存数据长时间未用导致出现乱码。
write_ds_ds12c887(4,9); //小时寄存器 写 9点
write_ds_ds12c887(2,27); //分钟寄存器 写 27分
write_ds_ds12c887(0,25); //秒钟寄存器 写 25秒
write_ds_ds12c887(6,7); //星期寄存器写 7 星期天
write_ds_ds12c887(9,11); //年寄存器 写 11年
write_ds_ds12c887(8,8); //月份寄存器 写 8月
write_ds_ds12c887(7,7); //日期寄存器 写 7号
// */
//***************************************************************************
//在1602上写时间的框架
Disp_1602(1,1," 20 - - ",16);
Disp_1602(1,2," 00 - - ",16);
while(1)
{

keyscan();
if(flag==1)
{
didi();
}

if(kaiqi==0)
{
//****************************************************************************************
//读出DS12C887芯片里的 时间,日期 数据


miao = read_ds_ds12c887(0); //读 秒
fen = read_ds_ds12c887(2); //读 分
shi = read_ds_ds12c887(4); //读 时
ri = read_ds_ds12c887(0x07); //读 日
yue = read_ds_ds12c887(0x08); //读 月
nian = read_ds_ds12c887(0x09); //读 年
xingqi= read_ds_ds12c887(0x06); //读 星期
shiji = read_ds_ds12c887(0x10); //读 实际 保存实际数据,内部不自加,只是当做存储器用
kaiz = read_ds_ds12c887(0x0e); //读 闹钟 标志位
ashi = read_ds_ds12c887(0x05); //读 闹钟 时
afen = read_ds_ds12c887(0x03); //读 闹钟 分
amiao = read_ds_ds12c887(0x01); //读 闹钟 秒

//****************************************************************************************
//把读出的时间,日期数据, 写到1602液晶显示
write_twoline_1602(5,shi); //写 时
write_twoline_1602(8,fen); //写 分
write_twoline_1602(11,miao); //写 秒
write_oneline_1602(10,ri); //写 日
write_oneline_1602(7,yue); //写 月
write_oneline_1602(4,nian); //写 年
write_oneline_1602(14,xingqi);//写 星期
write_oneline_1602(2,shiji); //写 世纪
write_twoline_1602(2,kaiz); //写 闹钟开启位
//*****************************************************************************************

}
}

}

void exter() interrupt 0
{

flag=1; //开外部中断 0

}
void write_byte_74hc595(uchar dat) //74hc164芯片写一字节数据函数
{
uchar i;
e_595rck=0; //给595RCK低电平
for(i=0;i<8;i++)
{
clk_595srck=0; //给595SRCK低电平
data_595si=(dat<<i)&0x80; //把我们要使用的数据进行左移处理,保证最终输出的数据与 我们 uchar dat 对应
clk_595srck=1; //给595SRCK高电平
}
e_595rck=1; //给595SRCK高电平,既把 DAT数据数据送到输出
data_595si=1; //因该数据口和别的电路共用,因此当74hc595使用完后,置“1”解除冲突
}
void write_order_1602(uchar order_data)//写指令地址
{
e=0;
rs_1602=0;
P0=order_data;
_nop_();
e=1;
delay(1);
e=0;
_nop_();
}

void write_data_1602(uchar data_1602)//
{
e=0;
rs_1602=1;
P0=data_1602;
_nop_();
e=1;
delay(1);
e=0;
_nop_();
}
void Disp_1602(unsigned char x_1602,unsigned char y_1602,unsigned char *p_1602,unsigned char count_1602)
{
unsigned char i;
for(i=0;i<count_1602;i++)
{
if (1 == y_1602) x_1602 |= 0x80;
else x_1602 |= 0xC0;
write_order_1602(x_1602-1);
write_data_1602(*p_1602);
x_1602++;
p_1602++;
}
}


void write_oneline_1602(uchar add_1602,uint date_1602)
{
uchar ge,shi;
shi=date_1602/10;
ge=date_1602%10;
write_order_1602(0x80+add_1602-1);
write_data_1602(0x30+shi);
write_order_1602(0x80+add_1602);
write_data_1602(0x30+ge);
}

void write_twoline_1602(uchar add_1602,uint date_1602)
{
uchar shi,ge;
shi=date_1602/10;
ge=date_1602%10;
// write_order_1602(0x80+0x40+add_1602-1);
write_order_1602(0xc0+add_1602);
write_data_1602(0x30+shi);
//write_order_1602(0x80+0x40+add_1602);
write_data_1602(0x30+ge);
}

void lcdinit_1602()
{
rw_1602=0;
e=0;
//write_byte_74hc595(0X02);
delay(15);
write_order_1602(0x38);
write_order_1602(0x0c);
write_order_1602(0x06);
write_order_1602(0x01);
delay(5);
}
void boardinit()
{
duanxuan=1;
weixuan=1;
P0=0x00;
duanxuan=0;
weixuan=0;
/write_byte_74hc595(0x40);
P1=0xff;
write_byte_74hc595(0x00);
}

void init_ds12c887() //初始化函数
{
write_ds_ds12c887(0x0a,0x20);
write_ds_ds12c887(0x0b,0x26);

amiao=read_ds_ds12c887(1);
afen=read_ds_ds12c887(3);
ashi=read_ds_ds12c887(5);

}

void set_alarm_ds12c887(uchar ashi,uchar afen,uchar amiao)
{
write_ds_ds12c887(1,amiao);
write_ds_ds12c887(3,afen);
write_ds_ds12c887(5,ashi); //在DS12C887闹钟寄存器中写入 闹钟时间 函数
}

void write_ds_ds12c887(uchar add_ds12c887,uchar data_ds12c887)
{
delay(1);
write_byte_74hc595(0X02);// ds12c887de 使能端 cs=0 1602背光打开
delay(1);
dsas_ds12c887=1;
dsds_ds12c887=1;
dsrw_ds12c887=1;
delay(1);
P0=add_ds12c887;
delay(1);
dsas_ds12c887=0;
dsrw_ds12c887=0;
P0=data_ds12c887;
dsrw_ds12c887=1;
dsas_ds12c887=1;
delay(1);
write_byte_74hc595(0X12);// ds12c887de 使能端 cs=1 1602背光打开
delay(1);
}

//ds12c887 写数据子函数
//------------------------------------------------------------------------------
uchar read_ds_ds12c887(uchar add_ds12c887)
{

uchar ds_date;
dsas_ds12c887=1;
dsds_ds12c887=1;
dsrw_ds12c887=1;
delay(1);
write_byte_74hc595(0X02);// ds12c887de 使能端 cs=0 1602背光打开
delay(1);
P0=add_ds12c887;
delay(1);
dsas_ds12c887=0;
dsds_ds12c887=0;
P0=0XFF;
ds_date=P0;
dsds_ds12c887=1;
dsas_ds12c887=1;
write_byte_74hc595(0X12); // ds12c887de 使能端 cs=1 1602背光打开
return ds_date;
}
...全文
1102 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
farmanlinuxer 2017-06-11
  • 打赏
  • 举报
回复
在测试仿真软件吗?
arm杀手 2017-05-31
  • 打赏
  • 举报
回复
玩啥仿真呀,板子都对了,还仿真干啥
jiqiang01234 2016-06-16
  • 打赏
  • 举报
回复
开发板都已经成功了,还怕什么?
zhujinqiang 2016-06-09
  • 打赏
  • 举报
回复
换仿真软件的高版本去试试
毕健 2016-05-14
  • 打赏
  • 举报
回复
很少用那个仿真软件。
侦探蜡笔小新 2016-05-12
  • 打赏
  • 举报
回复
我看只有时间是乱码,把uchar改成char看看呢?
地球不再转 2016-05-11
  • 打赏
  • 举报
回复
代码已经在开发板上测试过了,可以正常显示时间的,但是在仿真电路中就出现了乱码的问题,不知道要怎么解决,求支招!
dceacho 2016-05-11
  • 打赏
  • 举报
回复
时间表示方法有两种:一种用二进制数表示,一种用BCD码表示 你确定你弄对了编码方式?

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧