一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: sdf15937
收起左侧

分享一个32*80 LED点阵万年历程序

[复制链接]
 楼主| 发表于 2015-6-3 12:05 | 显示全部楼层
benli 发表于 2015-6-3 11:45
c才方便学习,移植

对于编程来说,C简单,但是想要知道单片机内部的原理,还是汇编方便
发表于 2015-6-3 17:31 | 显示全部楼层
sdf15937 发表于 2015-6-2 20:40
没那,都是DIY的,手工焊接

我下载来看看吧,瞅瞅啊能仿一个
发表于 2015-6-11 10:26 来自手机 | 显示全部楼层
我有一个老沈的16x80单色的屏,我不熟悉c,请问你这个程序怎么改可以使用呢?引脚排列见图。
IMG_20150611_094934-1.jpg
 楼主| 发表于 2015-6-11 10:46 | 显示全部楼层
快活丞 发表于 2015-6-11 10:26
我有一个老沈的16x80单色的屏,我不熟悉c,请问你这个程序怎么改可以使用呢?引脚排列见图。

可以保留的内容:自动亮度调节和误差修正
但是显示只能显示一半了,因为分辨率只有一半。
不过可以做成切换显示的。
发表于 2015-7-29 09:37 | 显示全部楼层
好东西,争取读懂。
发表于 2015-8-5 17:20 | 显示全部楼层
资料不错,就是手里一乐币太少啊。
 楼主| 发表于 2015-9-24 23:49 | 显示全部楼层
384065902 发表于 2015-6-2 19:02
读i2c放定时器中断里面.....不用严格按照i2c时序,自己按照1000位每秒读i2c都可以.读全0的的话蛋疼点..... ...

最近又遇到类似的问题,经过试验发现,STC12C5A60S2在24Mhz以下时能正确识别3231,27MHZ就不行了。具体分水岭是多少MHZ我不知道。但是多次试验应该是和晶振有关。27Mhz下就算在读取函数中加入大量延时也不起作用,不知道是啥原因
发表于 2015-10-3 16:27 | 显示全部楼层
sdf15937 发表于 2015-9-24 23:49
最近又遇到类似的问题,经过试验发现,STC12C5A60S2在24Mhz以下时能正确识别3231,27MHZ就不行了。具体分 ...

某两个位之间的延时太短了吧,拿示波器抓数据瞅瞅?要不然试一试我那通用i2c读取函数?
 楼主| 发表于 2015-10-3 18:15 | 显示全部楼层
384065902 发表于 2015-10-3 16:27
某两个位之间的延时太短了吧,拿示波器抓数据瞅瞅?要不然试一试我那通用i2c读取函数?

会加的都加了。搞不来了。最近工作忙也没时间折腾。不想搞了。你那通用的IIC函数有试过在高频STC上运行不?
很久以前就听说STC的1T单片机高频下IO速度跟不上,然后我的延时加的没有到点上,估计 就是这个原因。
手头没有示波器,也没有逻辑分析仪,搞不了了
发表于 2015-10-4 01:34 | 显示全部楼层
sdf15937 发表于 2015-10-3 18:15
会加的都加了。搞不来了。最近工作忙也没时间折腾。不想搞了。你那通用的IIC函数有试过在高频STC上运行不 ...

发上来参考一下,i2c_delay()里面是延时,调整ii初值即可.我是用rtx系统的,一般往里面放个系统等待就行了

#include  <stc15f.h>       /*头文件的包含*/
//#include <rtx51tny.h>



/*端口位定义*/

sbit SCL=P3^3;/*模拟I2C数据传送位*/
sbit SDA=P3^4;/*模拟I2C时钟控制位*/           

void i2c_delay()
{
unsigned char ii=50;
while(ii--);
}

#define true  1
#define false 0

bit I2CStart(void)
{
SDA=1; i2c_delay();
if(!SDA) i2c_delay();
if(!SDA) i2c_delay();
if(!SDA) i2c_delay();
if(!SDA) i2c_delay();
if(!SDA) i2c_delay();

SCL=1; i2c_delay();
if(!SDA) return false;        //SDA线为低电平则总线忙,退出
SDA=0; i2c_delay();
while(SDA) return false;//SDA线为高电平则总线出错,退出
SCL=0;
return true;
}

void I2CStop(void)
{        SDA=0;i2c_delay();
SCL=0;i2c_delay();
SCL=1;i2c_delay();
SDA=1;
if(!SDA)         {        SCL=0;i2c_delay();        SCL=1;i2c_delay(); }
if(!SDA)         {        SCL=0;i2c_delay();        SCL=1;i2c_delay(); }
if(!SDA)         {        SCL=0;i2c_delay();        SCL=1;i2c_delay(); }
if(!SDA)         {        SCL=0;i2c_delay();        SCL=1;i2c_delay(); }
if(!SDA)         {        SCL=0;i2c_delay();        SCL=1;i2c_delay(); }

}
//*********发送 ACK********
void I2CAck(void)
{        SDA=0;i2c_delay(); SCL=0;i2c_delay(); SCL=1;i2c_delay(); SCL=0;i2c_delay(); }
//*********发送NO ACK********
void I2CNoAck(void)
{        SDA=1;i2c_delay(); SCL=0;i2c_delay();        SCL=1;i2c_delay(); SCL=0;i2c_delay(); }
//*********读取ACK信号********
bit I2CWaitAck(void)                   //返回为:1=有ACK,0=无ACK
{        SCL=0;i2c_delay(); SDA=1;i2c_delay();        //设置SDA为输入
SCL=1;i2c_delay();
while(SDA)         { SCL=0; return false; }
SCL=0;
return true;
}
void I2CSendByte(unsigned char demand) //数据从高位到低位//
{       
xdata unsigned char i=8;
while(i--) { SCL=0;         i2c_delay();
SDA=(bit)(demand&0x80);
demand<<=1; i2c_delay();
SCL=1;         i2c_delay();
}
SCL=0;
}
unsigned char I2CReceiveByte(void)  //数据从高位到低位//
{
xdata unsigned char i=8;
xdata unsigned char ddata=0;

SDA=1;         //设置SDA为输入
while(i--)        { ddata<<=1;               //数据从高位开始读取
  SCL=0;         i2c_delay();
  SCL=1;         i2c_delay(); //从高位开始 ddata|=SDA;ddata<<=1
if(SDA)         {        ddata|=0x01; }
}
SCL=0;
return ddata;
}


/*******************************************************************
向无子地址器件发送字节数据函数               
函数原型: bit  ISendByte(unsigned char sla,ucahr c);  
功能:从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla。如果
返回1表示操作成功,否则操作有误。
********************************************************************/
bit ISendByte(unsigned char sla,unsigned char c)
{
  I2CStart();               /*启动总线*/
  I2CSendByte(sla);            /*发送器件地址*/
  if(!(I2CWaitAck()))return 0;
  I2CSendByte(c);               /*发送数据*/
  if(!(I2CWaitAck()))return 0;
  I2CStop();                 /*结束总线*/
         return 1;
}



/*******************************************************************
向有子地址器件发送多字节数据函数               
函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  
功能:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,
子地址suba,发送内容是s指向的内容,发送no个字节。如果返回1表示
操作成功,否则操作有误。
********************************************************************/
bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
  xdata unsigned char i;



  I2CStart();               /*启动总线*/
  I2CSendByte(sla);            /*发送器件地址*/
  if(!(I2CWaitAck()))return 0;
  I2CSendByte(suba);               /*发送数据*/
  if(!(I2CWaitAck()))return 0;




  for(i=0;i<no;i++)
  {   
    I2CSendByte(*s);               /*发送数据*/
    if(!(I2CWaitAck()))return 0;
    s++;
  }
  I2CStop(); /*结束总线*/

  return 1;
}



/*******************************************************************
向无子地址器件读字节数据函数               
函数原型: bit  IRcvByte(unsigned char sla,ucahr *c);  
功能:从启动总线到发送地址,读数据,结束总线的全过程,从器件地址sla,返
回值在c。如果返回1表示操作成功,否则操作有误。
********************************************************************/
bit IRcvByte(unsigned char sla,unsigned char *s,unsigned char no)
{
  I2CStart();               /*启动总线*/
  I2CSendByte(sla+1);            /*发送器件地址*/
  if(!(I2CWaitAck()))return 0;
    while(no!=1)
  {
   *s=I2CReceiveByte();/*发送数据*/
   I2CAck();  /*发送就答位*/   
    s++;
   no--;
  }
  *s=I2CReceiveByte();
  I2CNoAck();
  I2CStop();                             /*结束总线*/
  return 1;
}



/**********************************************************************
向有子地址器件读取多字节数据函数               
函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  
功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,
子地址suba,读出的内容放入s指向的存储区,读no个字节。如果返回1
表示操作成功,否则操作有误。
**********************************************************************/
bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
  I2CStart();               /*启动总线*/
  I2CSendByte(sla);            /*发送器件地址*/
  if(!(I2CWaitAck()))return 0;

  I2CSendByte(suba);            /*发送器件子地址*/
  if(!(I2CWaitAck()))return 0;



  I2CStart();               /*启动总线*/
  I2CSendByte(sla+1);

   if(!(I2CWaitAck()))return 0;



  while(no!=1)
  {
   *s=I2CReceiveByte();/*发送数据*/
   I2CAck();  /*发送就答位*/   
    s++;
   no--;
  }
  *s=I2CReceiveByte();
  I2CNoAck();
  I2CStop();                  /*结束总线*/
  return(1);
}

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-2 14:17 , Processed in 0.053370 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表