搜索
bottom↓
回复: 2

一个简单的TLC2543程序请教马老师!!!!

[复制链接]

出75入8汤圆

发表于 2012-7-11 16:50:36 | 显示全部楼层 |阅读模式
第一次发贴,TLC2543+ATMEGA16+PROTEUS,寻求帮助!!环境:ICCAVR.


#include <iom16v.h>
#include <macros.h>


#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80

#define CLKH      PORTB |=BIT1   //CLK高
#define CLKL      PORTB &=~BIT1   //CLK低
#define DATAH     PORTB |=BIT2   //DATA高
#define DATAL     PORTB &=~BIT2   //DATA低

#define CSH       PORTB |=BIT4   //CS高
#define CSL       PORTB &=~BIT4   //CS低


#define uchar unsigned char
#define uint  unsigned int

#define X 5


uchar zhuanhuan[24];        //采到2543的值放这里转换一下










//**********************************************************************

//延时函数
void delay(unsigned int s){
                           while(s)s--;
}

//*********************************************************************

void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x3f;
PORTB = 0x00;
DDRB  = 0xf6;
PORTC = 0x00; //m103 output only
DDRC  = 0xff;  //P3口设置为输出
PORTD = 0x00;
DDRD  = 0xff;
}





























//*********************************************************************


//本程序没有使用tlc2543的EOC(转换结束标志)信号,片选一直处于选中,也可以自己加入片选信号
unsigned int tlc2543(unsigned char senddata)//这里把senddate改成recdata传递
{
unsigned int  recdata = 0;
  unsigned int  i = 0;
  
  recdata = 0;//接收到的转换结果数据
  PORTB &= 0B11101111;//片选使能(可选)以前的CS片选是PB1那么就是0B11111101,这里的B是二进制,第二位为低的时候选中
  //现在改成了PB4,那么这里要改成0B11101111
  NOP();
  NOP();NOP();
  NOP();
for(i=0;i<12;i++)//转换12个字节        ,因为需要的是12位,所以转换12字节                        
   {
        if(senddata & 0x80)//比如说吧,SENDDATA这个值现在是0x81,那么用0x81与上0X80肯定是1,那么就执行,PB5口高电平,否则就执行PB5口低电平。
//然后,1000 0001 也就是0X81,左移1位,变成,0000 0010
//就是0000 0010 和0X81再与,得的值应该是假,那么PB5口为低,这样重复八次,就得出八个PB5口的高低电
          PORTB |= 0B00000100;//以前的PB5口是DIN,现改成PB2,那么0B00100000改为0B00000100
        else  PORTB &= 0B11111011;//准备发送控制字,同上面一样改0B11111011
        senddata <<= 1;
        
        if(PINB & 0x08)//PB0口为高电平的话,那么recdata |= 0x01;这里的PB0为DO,那么改成现在应为PB3改为0x08
          recdata |= 0x0001;
        else  recdata &= 0xfffe;
        recdata <<= 1;//接收上次转换结果
        
        
        PORTB |= 0B00000010;//时钟上升沿,这里是时钟动作,以前的时钟是PB2,现在为PB1,0B00000100改为0B00000010
        NOP();NOP();NOP();NOP();//以前晶体8M
        PORTB &= 0B11111101;//时钟下降沿,同上0B11111011改为0B11111101
        NOP();NOP();NOP();NOP();
  }
  
// PORTB |= 0B00000010;//片选禁止(可选)
  NOP();NOP();NOP();NOP();
  recdata >>= 1;
  recdata &= 0x0fff;//截取低12位
  return(recdata);
}

//*********************************************************************







void main(void){
   

port_init();

while(1){

zhuanhuan[1]=tlc2543(0b00000000);//采到一个十二位的值,第0通道,12位选择,高位在前,无极性.
PORTC  = zhuanhuan[1]>>8;//高八位从C输出
PORTD  = zhuanhuan[1]&0x00ff;  //低四位从D输出
delay(65535);//延时
delay(65535);
delay(65535);
delay(65535);


}

}


搞了几天一直不成功,每次输出值都不一样.希望能得到帮助,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出75入8汤圆

 楼主| 发表于 2012-7-11 16:52:30 | 显示全部楼层
这个环境是ICCAVR,不知马老师能否关注一下初学者,现在论坛还没有出现TLC2543+ATMEGA16+PROTEUS,如能解决,不胜感激!!!

出0入0汤圆

发表于 2012-7-15 17:29:47 | 显示全部楼层
哎。。。。。。。。。。。。。。。。。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 09:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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