求助 12864+ds1302 显示问题
时间:10-02
整理:3721RD
点击:
主要问题是readclock();这个子程序加上后12864无显示,怕1302的程序写错,特意写了个数码管的程序,能够正常读取数值,所以readclock();这个没有问题,请哪位高手帮忙看看。冲突或者在那。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define writeaddr_nian 0x8c
#define writeaddr_yue 0x88
#define writeaddr_zhou 0x8a
#define writeaddr_ri 0x86
#define writeaddr_shi 0x84
#define writeaddr_feng 0x82
#define writeaddr_miao 0x80
#define writeaddr_wp 0x8e
#define readaddr_nian 0x8d
#define readaddr_yue 0x89
#define readaddr_zhou 0x8b
#define readaddr_ri 0x87
#define readaddr_shi 0x85
#define readaddr_feng 0x83
#define readaddr_miao 0x81
uchar nian,yue,ri,zhou,miao;
char shi,feng,shi1,feng1;
uchar code dis[] = {"年月日时分秒星期定时: ℃"};
uchar dis1[2];
uchar shijian[15];
uchar riqi[12];
uchar dingshi[10];
uchar xingqi[5];
sbit LCD_RS = P2^6; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCD_PSB = P3^2; //串/并方式控制
sbit LCD_RST = P3^7; //液晶复位端口
sbit sclk=P3^6; //时钟信号
sbit ce=P3^5; //使能信号
sbit io=P3^4; //1302信号
sbit ACC_7=ACC^7;
void delayms(int x)
{ uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
//延时程序
void write1302( uchar addr ,uchar dat) //写入1302
{uchar i ,temp;
ce=0;
sclk=0;
ce=1;
for(i=8;i>0;i--) //写地址
{sclk=0;
temp=addr;
io=(bit)(temp&0x01);
addr>>=1;
sclk=1;
}
for(i=8;i>0;i--) //写数据
{sclk=0;
temp=dat;
io=(bit)(temp&0x01);
dat>>=1;
sclk=1;
}
ce=0;
}
uchar read1302(uchar addr) //读1302
{uchar i,temp,dat1,dat2;
ce=0;
sclk=0;
ce=1;
for(i=8;i>0;i--) //写地址
{sclk=0;
temp=addr;
io=(bit)(temp&0x01);
addr>>=1;
sclk=1;
}
for (i=8;i>0;i--)
{
ACC_7=io;
sclk=1;
ACC>>=1;
sclk=0;
}
ce=0;
dat1=ACC;
dat2=dat1/16;
dat1=dat1%16;
dat1=dat1+dat2*10;
return(dat1) ;
void lcd_wcmd(uchar cmd) //写指令数据到LCD RS=L,RW=L,E=高脉冲,D0-D7=指令码。
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = cmd;
delayms(5);
LCD_EN = 1;
delayms(5);
LCD_EN = 0;
}
void lcd_wdat(uchar dat) //写显示数据到LCD RS=H,RW=L,E=高脉冲,D0-D7=数据。
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayms(5);
LCD_EN = 1;
delayms(5);
LCD_EN = 0;
}
void lcd_init() //液晶初始化
{
LCD_PSB = 1; //并口方式
delayms(5);
lcd_wcmd(0x30); //基本指令操作
delayms(5);
lcd_wcmd(0x0C); //显示开,关光标
delayms(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delayms(5);
}
void zh (uchar dat)
{ dis1[0]=dat/10+0x30;
dis1[1]=dat%10+0x30;
}
void display()
{uchar i;
zh(nian);
riqi[0]=dis1[0] ;
riqi[1]=dis1[1] ;
riqi[2]=dis[0] ;
riqi[3]=dis[1] ;
zh(yue);
riqi[4]=dis1[0] ;
riqi[5]=dis1[1] ;
riqi[6]=dis[2] ;
riqi[7]=dis[3] ;
zh(ri);
riqi[8]=dis1[0] ;
riqi[9]=dis1[1] ;
riqi[10]=dis[2] ;
riqi[11]=dis[3] ;
lcd_wcmd(0x80);
for(i=0;i<12;i++)
{ lcd_wdat(riqi);
}
//日期显示 xx年xx月xx日
zh(shi);
shijian[0]=dis1[0] ;
shijian[1]=dis1[1] ;
shijian[2]=dis[20];
zh(feng);
shijian[3]=dis1[0] ;
shijian[4]=dis1[1] ;
shijian[5]=dis[20];
zh(miao);
shijian[6]=dis1[0] ;
shijian[7]=dis1[1] ;
shijian[8]=dis[21] ;
shijian[9]=dis[21] ;
shijian[10]=dis[12] ;
shijian[11]=dis[13] ;
shijian[12]=dis[14] ;
shijian[13]=dis[15] ;
zh(zhou);
shijian[14]=dis1[1] ;
lcd_wcmd(0x90);
for(i=0;i<15;i++)
{ lcd_wdat(shijian);
}
//时间显示 xx时xx分xx 星期x
dingshi[0]=dis[16] ;
dingshi[1]=dis[17] ;
dingshi[2]=dis[18] ;
dingshi[3]=dis[19] ;
dingshi[4]=dis[21] ;
zh(shi1);
dingshi[5]=dis1[0] ;
dingshi[6]=dis1[1] ;
dingshi[7]=dis[20];
zh(feng1);
dingshi[8]=dis1[0] ;
dingshi[9]=dis1[1] ;
lcd_wcmd(0x88);
for(i=0;i<10;i++)
{ lcd_wdat(dingshi);
}
//定时显示 xx时xx分 星期x
}
void c51init()
{ TMOD = 0x02;
TH0 = 0x06;
TL0 = 0x06;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void readclock()
{miao=read1302(readaddr_miao);
nian=read1302(readaddr_nian);
yue=read1302(readaddr_yue);
ri=read1302(readaddr_ri);
zhou=read1302(readaddr_zhou);
feng=read1302(readaddr_feng);
shi=read1302(readaddr_shi);
}
void main()
{
delayms(10); //上电,等待稳定
lcd_init();
c51init();
//初始化LCD
while(1)
{ anjian();
display();
if(xscs>=40000)
{
xscs=0;
readclock();
}
}
}
void Timer0Interrupt(void) interrupt 1
{ xscs++;
}
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define writeaddr_nian 0x8c
#define writeaddr_yue 0x88
#define writeaddr_zhou 0x8a
#define writeaddr_ri 0x86
#define writeaddr_shi 0x84
#define writeaddr_feng 0x82
#define writeaddr_miao 0x80
#define writeaddr_wp 0x8e
#define readaddr_nian 0x8d
#define readaddr_yue 0x89
#define readaddr_zhou 0x8b
#define readaddr_ri 0x87
#define readaddr_shi 0x85
#define readaddr_feng 0x83
#define readaddr_miao 0x81
uchar nian,yue,ri,zhou,miao;
char shi,feng,shi1,feng1;
uchar code dis[] = {"年月日时分秒星期定时: ℃"};
uchar dis1[2];
uchar shijian[15];
uchar riqi[12];
uchar dingshi[10];
uchar xingqi[5];
sbit LCD_RS = P2^6; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCD_PSB = P3^2; //串/并方式控制
sbit LCD_RST = P3^7; //液晶复位端口
sbit sclk=P3^6; //时钟信号
sbit ce=P3^5; //使能信号
sbit io=P3^4; //1302信号
sbit ACC_7=ACC^7;
void delayms(int x)
{ uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
//延时程序
void write1302( uchar addr ,uchar dat) //写入1302
{uchar i ,temp;
ce=0;
sclk=0;
ce=1;
for(i=8;i>0;i--) //写地址
{sclk=0;
temp=addr;
io=(bit)(temp&0x01);
addr>>=1;
sclk=1;
}
for(i=8;i>0;i--) //写数据
{sclk=0;
temp=dat;
io=(bit)(temp&0x01);
dat>>=1;
sclk=1;
}
ce=0;
}
uchar read1302(uchar addr) //读1302
{uchar i,temp,dat1,dat2;
ce=0;
sclk=0;
ce=1;
for(i=8;i>0;i--) //写地址
{sclk=0;
temp=addr;
io=(bit)(temp&0x01);
addr>>=1;
sclk=1;
}
for (i=8;i>0;i--)
{
ACC_7=io;
sclk=1;
ACC>>=1;
sclk=0;
}
ce=0;
dat1=ACC;
dat2=dat1/16;
dat1=dat1%16;
dat1=dat1+dat2*10;
return(dat1) ;
void lcd_wcmd(uchar cmd) //写指令数据到LCD RS=L,RW=L,E=高脉冲,D0-D7=指令码。
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = cmd;
delayms(5);
LCD_EN = 1;
delayms(5);
LCD_EN = 0;
}
void lcd_wdat(uchar dat) //写显示数据到LCD RS=H,RW=L,E=高脉冲,D0-D7=数据。
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayms(5);
LCD_EN = 1;
delayms(5);
LCD_EN = 0;
}
void lcd_init() //液晶初始化
{
LCD_PSB = 1; //并口方式
delayms(5);
lcd_wcmd(0x30); //基本指令操作
delayms(5);
lcd_wcmd(0x0C); //显示开,关光标
delayms(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delayms(5);
}
void zh (uchar dat)
{ dis1[0]=dat/10+0x30;
dis1[1]=dat%10+0x30;
}
void display()
{uchar i;
zh(nian);
riqi[0]=dis1[0] ;
riqi[1]=dis1[1] ;
riqi[2]=dis[0] ;
riqi[3]=dis[1] ;
zh(yue);
riqi[4]=dis1[0] ;
riqi[5]=dis1[1] ;
riqi[6]=dis[2] ;
riqi[7]=dis[3] ;
zh(ri);
riqi[8]=dis1[0] ;
riqi[9]=dis1[1] ;
riqi[10]=dis[2] ;
riqi[11]=dis[3] ;
lcd_wcmd(0x80);
for(i=0;i<12;i++)
{ lcd_wdat(riqi);
}
//日期显示 xx年xx月xx日
zh(shi);
shijian[0]=dis1[0] ;
shijian[1]=dis1[1] ;
shijian[2]=dis[20];
zh(feng);
shijian[3]=dis1[0] ;
shijian[4]=dis1[1] ;
shijian[5]=dis[20];
zh(miao);
shijian[6]=dis1[0] ;
shijian[7]=dis1[1] ;
shijian[8]=dis[21] ;
shijian[9]=dis[21] ;
shijian[10]=dis[12] ;
shijian[11]=dis[13] ;
shijian[12]=dis[14] ;
shijian[13]=dis[15] ;
zh(zhou);
shijian[14]=dis1[1] ;
lcd_wcmd(0x90);
for(i=0;i<15;i++)
{ lcd_wdat(shijian);
}
//时间显示 xx时xx分xx 星期x
dingshi[0]=dis[16] ;
dingshi[1]=dis[17] ;
dingshi[2]=dis[18] ;
dingshi[3]=dis[19] ;
dingshi[4]=dis[21] ;
zh(shi1);
dingshi[5]=dis1[0] ;
dingshi[6]=dis1[1] ;
dingshi[7]=dis[20];
zh(feng1);
dingshi[8]=dis1[0] ;
dingshi[9]=dis1[1] ;
lcd_wcmd(0x88);
for(i=0;i<10;i++)
{ lcd_wdat(dingshi);
}
//定时显示 xx时xx分 星期x
}
void c51init()
{ TMOD = 0x02;
TH0 = 0x06;
TL0 = 0x06;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void readclock()
{miao=read1302(readaddr_miao);
nian=read1302(readaddr_nian);
yue=read1302(readaddr_yue);
ri=read1302(readaddr_ri);
zhou=read1302(readaddr_zhou);
feng=read1302(readaddr_feng);
shi=read1302(readaddr_shi);
}
void main()
{
delayms(10); //上电,等待稳定
lcd_init();
c51init();
//初始化LCD
while(1)
{ anjian();
display();
if(xscs>=40000)
{
xscs=0;
readclock();
}
}
}
void Timer0Interrupt(void) interrupt 1
{ xscs++;
}
已复制保存查看了等待结果
谢谢,调了好久了的
有结果跟我讲啊
把原理图看下!有可能是DS1302和12864 的管脚共用了
我以前碰到这样过
谢谢大家,问题找到了的,犯了一个低级错误,P34这个脚复用了的,没仔细看开发板。给大家添麻烦了的