P2=P2<<1|P2>>7Y=Y<<(7-Q)|Y>>Q 都大神级别的啊,这些都写的那么难高深那么难理解。。看到这我也觉得我真的太菜了,这会用简单易懂的移位,循环移位。。。。
你这个单片机是带I2C接口的那个SMBus就是,我用这个系列的单片机写过,模拟的还没有借口直接来的好。 我的空间里面有我调好的一篇247519442
你说的全部是0xff也是正常的,因为外部存储一般都是高电平为空,也就是说你的数据没有写进去
我给你一个模拟的看看
#include<reg51.h>
#include <Intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit pcf8563_scl=P0^5//时钟频率
sbit pcf8563_sda=P0^4//串行数据传输脚
bit busy=0
uchar sg//时高位
uchar sd//时低位
uchar fg//分高位
uchar fd//分低位
uchar mg//秒高位
uchar md//秒低位
uchar hou=0
uchar min=0
uchar sec=0
uchar subadd//地址
uchar dat//数据
uchar number
void start_pcf8563()//开始数据
void send_pcf8563_byte()//发送
void stop_pcf8563()//结束数据
void receive_pcf8563_byte()//接收
void spit_time()//分别计算时、分、秒的各位数字
void spit_time()//分别计算时、分、秒的各位数字
{
sg=(int)hou/10
sd=(int)hou%10
fg=(int)min/10
fd=(int)min%10
mg=(int)sec/10
md=(int)sec%10
}
void Send_pcf8563_byte(uchar bb) //向PCF8563发送一个字节
{
uchar aa
pcf8563_scl=0
for(aa=0aa<8aa++)
{
if((bb&0x80)==0x80)
{
pcf8563_sda=1
}
else
{
pcf8563_sda=0
}
pcf8563_scl=1
pcf8563_scl=0
bb=bb<<1
}
_nop_()
_nop_()
pcf8563_sda=1
pcf8563_scl=1
busy=0
if(pcf8563_sda)
{
busy=1
}
else
{
_nop_()
_nop_()
pcf8563_scl=0
busy=0
}
}
void write_pcf8563(uchar subadd,uchar dat)// 向PCF8563对应地址写数据
{
start_pcf8563()
Send_pcf8563_byte(0xa2)
if(!busy)
{
Send_pcf8563_byte(subadd)
if(!busy)
{
Send_pcf8563_byte(dat)
}
}
stop_pcf8563()
}
void read_pcf8563() //读当时的时,分,钞
{
start_pcf8563()
Send_pcf8563_byte(0xa2)
if(!busy)
{
Send_pcf8563_byte(0x02)
if(!busy)
{
start_pcf8563()
Send_pcf8563_byte(0xa3)
receive_pcf8563_byte()
sec=number&0x7f
start_pcf8563()
Send_pcf8563_byte(0xa3)
receive_pcf8563_byte()
min=number&0x7f
start_pcf8563()
Send_pcf8563_byte(0xa3)
receive_pcf8563_byte()
hou=number&0x3f
}
}
stop_pcf8563()
}
void receive_pcf8563_byte() //从PCF8563接受一个字节
{uchar cc
pcf8563_sda=1
number=0
for(cc=0cc<8cc++)
{
number<<=1
pcf8563_scl=0
pcf8563_scl=1
_nop_()
_nop_()
number= number|pcf8563_sda
}
pcf8563_scl=0
_nop_()
_nop_()
}
void start_pcf8563() //开启PCF8563IIC
{
pcf8563_sda=1
pcf8563_scl=1
pcf8563_sda=0//SCL为高,SDA执行一个下跳
pcf8563_scl=0//SCL为低,嵌住数据线
}
void stop_pcf8563() //关闭PCF8563IIC
{
pcf8563_sda=0
pcf8563_scl=1
pcf8563_sda=1//SCL为高,SDA执行一个上跳
pcf8563_scl=0//SCL为低,嵌住数据线
}
void main(void)
{
write_pcf8563(0x02,sec) //写钞
write_pcf8563(0x03,min) //写分
write_pcf8563(0x04,hou) //写时
while(1)
{
read_pcf8563()//读当前时间
spit_time() //切换时间,为显示做准备
}
}
如果还是不行,你把你的代码给我看看,看我能不能看出来
之前做过,但是程序找不到了。提供一个思路,将汉字用字符软件转成HEX数据,存在ROM中,然后FPGA从ROM中读出送到点阵上,滚动其实就是将点阵的地址左移或右移。很简单的。建议你自己动手做一下,比拿别人的程序跑更有意义。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)