单片机的点阵滚动程序 Y=TAB[i+1]*256+TAB[i]; 是什么意思呢?

单片机的点阵滚动程序 Y=TAB[i+1]*256+TAB[i]; 是什么意思呢?,第1张

uchar的Y不就只是8位吗?你这TAB[i+1]*256不是超出范围了吗?这有作用吗?Y=TAB[i+1]*256+TAB[i]跟Y=TAB[i]效果不一样吗 ??我很怀疑。。若是不一样的,可能我也还是太菜了。。。

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中读出送到点阵上,滚动其实就是将点阵的地址左移或右移。很简单的。建议你自己动手做一下,比拿别人的程序跑更有意义。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11998136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存