16×16的点阵,直接用单片机IO口,让点阵显示字符左右或上下滚动,程序应该怎么写呀

2024-12-26 04:51:00
推荐回答(3个)
回答1:

你这个单片机是带I2C接口的
那个SMBus就是,我用这个系列的单片机写过,模拟的还没有借口直接来的好。 我的空间里面有我调好的一篇247519442

你说的全部是0xff也是正常的,因为外部存储一般都是高电平为空,也就是说你的数据没有写进去

我给你一个模拟的看看
#include
#include

#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=0;aa<8;aa++)
{
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=0;cc<8;cc++)
{
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(); //切换时间,为显示做准备

}
}

如果还是不行,你把你的代码给我看看,看我能不能看出来

回答2:

推荐:75V2 点阵流动显示文字( http://ishare.iask.sina.com.cn/f/11319187.html )

回答3:

当年我写过这样的程序 很早了 我用的汇编 这时候想想 用C语言 会简单的多呀
推荐你用C 这个需要字库的 好好找下资料吧