求哪位大侠看一下我的程序 ,是不是存在问题???不显示
附上程序:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
#define er 0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)
//液晶与51之间的连接定义
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P1^0;
sbit en=P2^5;
sbit rw=P1^1;
//按键引脚定义
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;
//DS1302时钟
芯片与C51之间的引脚连接定义
sbit IO=P2^0;//数据线
sbit SCLK=P2^1;
sbit RST=P2^4;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
uchar num,count,h,m,s,day,month,year;
uchar code table[]="20 - - ";
uchar code table1[]=" : : ";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//读命令函数
{
rs=0;
en=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_date(uchar date)//写命令函数
{
rs=1;
en=0;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void lcd1602_init()//液晶初始化函数
{
rw=0;
dula=0;
wela=0;
en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(yh+1);
for(num=0;num<14;num++)
{
write_date(table[num]);
delay(5);
}
write_com(yh+er+2);
for(num=0;num<11;num++)
{
write_date(table1[num]);
delay(5);
}
}
void init()//定时器初始化函数
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void write_byte(uchar date)//写一个字节
{
ACC=date;
RST=1;
for(num=8;num>0;num--)
{
IO=ACC0;
SCLK=0; //产生上升沿写入数据,从低位写入
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte()//读一个字节
{
RST=1;
for(num=8;num>0;num--)
{
ACC7=IO;
SCLK=1; //产生下降沿输出数据,先输出低位,保存到ACC中
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
void write_1302(uchar add,uchar dat)//向1302芯片写函数,指定写入地址,数据
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
void ds1302_init() //1302芯片初始化子函数(2012-06-18,12:00:00,week7)
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00
write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00
write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12
write_1302(0x8a,0x07);//向DS1302内写周寄存器8aH写入初始周数据4
write_1302(0x86,0x17);//向DS1302内写日期寄存器86H写入初始日期数据18
write_1302(0x88,0x06);//向DS1302内写月份寄存器88H写入初始月份数据06
write_1302(0x8c,0x12);//向DS1302内写年份寄存器8cH写入初始年份数据12
write_1302(0x8e,0x80); //打开写保护
}
void main()
{
init();
lcd1602_init();
ds1302_init();
while(1);
}
附上电路图
一周热门 更多>