打印
[技术问答]

新唐单片机驱动tm1628点亮数码管怎么不行呢

[复制链接]
2291|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
张展豪123456|  楼主 | 2018-4-25 09:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 张展豪123456 于 2018-4-25 09:16 编辑

#include <N76E003.h>
#include "intrins.h"

#define uchar unsigned char

#define uint  unsigned int



//¶¨Òå¿ØÖƶ˿Ú

sbit DIO =P0^2;

sbit CLK =P0^1;

sbit STB =P0^0;





uchar const CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0xef,0x6f};

uchar KEY[4]={0};





void send_8bit(uchar dat)

{

   uchar i;

   for(i=0;i<8;i++)

   {

      if(dat&0x01)

       DIO=1;

    else DIO=0;

    CLK=0;

   // CLK=1;

    dat=dat>>1;

   }

}





void command(uchar com)

{

  STB=1;

  STB=0;

  send_8bit(com);

}





void read_key()

{

  uchar i,j;

  command(0x42);  //¶Á¼üÅÌÃüÁî

  DIO=1;      //½«DIOÖøß

  for(j=0;j<5;j++)

    for(i=0;i<8;i++)




    {

      KEY[j]=KEY[j]>>1;

      CLK=0;

      CLK=1;

      if(DIO)

         KEY[j]=KEY[j]|0X80;

    }

  STB=1;

}





void display()

{

  uchar i;

  command(0x03);   
  command(0x40);     

  command(0xc0);   

  for(i=0;i<14;i++)     

  {

        send_8bit(CODE);      
  send_8bit(0);  
}

  command(0x8F);      


  STB=1;

}





void key_process()

{

//ÓÉÓû§±àд

}





void main()

{

  display();  
  while(1)

  {

    read_key();     

    key_process();   
  }

}
沙发
小S咯| | 2018-4-25 15:07 | 只看该作者
send_8bit函数CLK=1,为啥要屏蔽掉啊??
read_key函数两个for有问题吧?
最好每次调用发送前把STB拉低

使用特权

评论回复
评论
张展豪123456 2018-4-26 15:56 回复TA
这个程序用51单片机可以将数码管点亮,用新塘的N76E003不行,不知道是哪里的差别 
板凳
123ycli| | 2018-4-26 16:53 | 只看该作者
51可以换过来不可以的话,注意延时和IO的初始化问题。

使用特权

评论回复
地板
lewhile| | 2019-2-16 21:32 | 只看该作者
楼主怎么解决的啊,我的也遇到了问题,

使用特权

评论回复
5
643757107| | 2019-2-16 23:23 | 只看该作者
IO配置成准双向就跟普通51一样了

使用特权

评论回复
6
稳稳の幸福| | 2019-2-17 14:30 | 只看该作者
没用过这个型号的,不过我想应该都差不多的

使用特权

评论回复
7
小灵通2018| | 2019-2-17 21:35 | 只看该作者
用的什么IO模式

使用特权

评论回复
8
小明的同学| | 2019-2-19 11:51 | 只看该作者
有啥不行的,没搞定时序吧

使用特权

评论回复
9
xuanhuanzi| | 2019-2-19 22:28 | 只看该作者
确认一下时序

使用特权

评论回复
10
xuanhuanzi| | 2019-2-19 22:30 | 只看该作者
本帖最后由 xuanhuanzi 于 2019-2-19 22:32 编辑
*文件名:     TM1628 

*单片机型号: AT89S52

*开发环境:   Keil uVision3

*晶震频率:   12M

*/

#include

#include

#define uchar unsigned char

#define uint  unsigned int



//定义控制端口

sbit DIO =P2^0;

sbit CLK =P2^1;

sbit STB =P2^2;



//定义数据

uchar const CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0xef,0x6f}; //共阴数码管0-9的编码

uchar KEY[5]={0};  //为存储按键值开辟的数组



//向TM1628发送8位数据,从低位开始------------------------

void send_8bit(uchar dat)

{

   uchar i;

   for(i=0;i<8;i++)

   {

      if(dat&0x01)

       DIO=1;

    else DIO=0;

    CLK=0;

    CLK=1;

    dat=dat>>1;

   }

}



//向TM1628发送命令--------------------------------------

void command(uchar com)

{

  STB=1;

  STB=0;

  send_8bit(com);

}



//读取按键值并存入KEY[]数组,从低字节开始,从低位开始----

void read_key()

{

  uchar i,j;

  command(0x42);  //读键盘命令

  DIO=1;      //将DIO置高

  for(j=0;j<5;j++)//连续读取5个字节

    for(i=0;i<8;i++)

    {

      KEY[j]=KEY[j]>>1;

      CLK=0;

      CLK=1;

      if(DIO)

         KEY[j]=KEY[j]|0X80;

    }

  STB=1;

}



//显示函数,1-7位数码管显示数字0-6----------------------------

void display()

{

  uchar i;

  command(0x03);      //设置显示模式,7位10段模式

  command(0x40);      //设置数据命令,采用地址自动加1模式

  command(0xc0);      //设置显示地址,从00H开始

  for(i=0;i<7;i++)     //发送显示数据

  {

        send_8bit(CODE[i]);      //从00H起,偶数地址送显示数据

  send_8bit(0);  //因为SEG9-14均未用到,所以奇数地址送全“0”

}

  command(0x8F);      //显示控制命令,打开显示并设置为最亮

  //read_key();       //读按键值

  STB=1;

}



//按键处理函数-------------------------------------------------

void key_process()

{

//由用户编写

}



//主函数-------------------------------------------------------

void main()

{

  display();  //显示

  while(1)

  {

    read_key();      //读按键值

    key_process();    //按键处理     

  }

}

使用特权

评论回复
11
xuanhuanzi| | 2019-2-19 22:31 | 只看该作者
你参考的上面这个吧。这个是标准51的,003是增强51,时钟频率不同,你要调整相关的延时

使用特权

评论回复
12
xuanhuanzi| | 2019-2-19 22:33 | 只看该作者
另外关于端口的特性不同,你确认一下你设置的IO的模式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝