找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2929|回复: 4
打印 上一主题 下一主题
收起左侧

TM1629B驱动共阳数码管,不能正常显示0-F ,能帮忙看看不?谢谢

[复制链接]
跳转到指定楼层
楼主
ID:163950 发表于 2021-7-6 09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <STC12C5A60S2.H>
#include "intrins.h"                    //包含nop指令头文件

#define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//宏定义


/********************定义控制端口**********************/
sbit DIO=P1^2;                                                //定义DIO
sbit CLK=P1^1;                                                //定义CLK
sbit STB=P1^0;                                                //定义STB

//sbit stb =P1^0;        //定义片选通讯口
//sbit clk =P1^1;        //定义时钟通讯口
//sbit dio =P1^2;        //定义数据输入/输出通讯口

/********************定义数据*************************/
unsigned char Key[4]={0};                   //为存储按键值定义的数组
//unsigned char const CODE[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,};            //共阴数码管0~F字型码,以实际电路接法为准
unsigned char const  CODE[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //0~F显示代码(共阳)   
/***************延时函数**************/
void delay_nms(unsigned int n)
{
  unsigned int i;
  while(n--)
    for(i=0;i<550;i++);
}

/***************发送8bit数据,从低位开始**************/
void send_8bit(unsigned char dat)       
{
  unsigned char i;
  for(i=0;i<8;i++)
  {         
    CLK=0;
    if(dat&0x01)
          DIO=1;
         else
          DIO=0;
         _nop_();
         _nop_();
         _nop_();
         CLK=1;
         dat>>=1;
  }
  CLK=0;
  DIO=0;
}

/******************发送控制命令***********************/
void send_command(unsigned char word)
{
STB=1;
nop;
STB=0;
send_8bit(word);
}

/****************读取按键值并存储*******************/
void read_key()
{
unsigned char i,j;
send_command(0x42);
DIO=1;
for(j=0;j<4;j++)
{
   for(i=0;i<8;i++)
   {
    CLK=0;
        Key[j]=Key[j]>>1;
        CLK=1;
        if(DIO)
          Key[j]=Key[j]|0x80;
        nop;
   }
   nop;
   nop;
  }
   CLK=0;
   DIO=0;
   STB=1;
}

/************显示函数,数码管1~16位显示0~F************/
void display()               
{
unsigned char i;
send_command(0x40);        //设置数据命令:普通模式、地址自增1,写数据到显存
send_command(0xc0);        //设置显示地址命令:从00H开始
for(i=0;i<16;i++)            //发送16字节的显存数据
{
  send_8bit(CODE[i]);
}
send_command(0x8C);        //设置显示控制命令:打开显示,并设置为11/16.
STB=1;
}

/************显示函数,第一位显示按键值************/
void display0(unsigned char dat)       
{
unsigned char i;
send_command(0x40);        //设置数据命令:普通模式、地址自增1,写数据到显存
send_command(0xc0);        //设置显示地址命令:从00H开始

send_8bit(CODE[dat]);        //第一位显示数值
for(i=0;i<15;i++)        //后15位不显示
{
  send_8bit(0x00);
}
send_command(0x8C);        //设置显示控制命令:打开显示,并设置为11/16.
STB=1;
}

/*****************按键处理函数*********************/
void key_process()               
{  
   if(Key[0]!=0x00)
   {
    if((Key[0]==0x08)){display0(1);} //K0与SEG1按键按下,数码管显示数字1
    if((Key[0]==0x04)){display0(2);} //K1与SEG1按键按下,数码管显示数字2
   }
     if(Key[1]!=0x00)
   {
    if((Key[1]==0x08)){display0(3);} //K0与SEG3按键按下,数码管显示数字3
    if((Key[1]==0x04)){display0(4);} //K1与SEG3按键按下,数码管显示数字4
   }
}


void main()
{
P1M1=0;
P1M0=0;

DIO=1;                                                //定义DIO
CLK=1;                                                //定义CLK
STB=1;       
display();          //上电显示0~F
delay_nms(10000);
while(1)
{
//read_key();             //读按键值
////key_process();         //按键处理
//delay_nms(200);         //延时200ms再读按键
////display();          //上电显示0~F
//display0(1);
display();

}
}   

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:887202 发表于 2021-7-6 17:21 | 只看该作者
1.这一行没注释不会报错吗?{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,};  
2.只用过TM1650,大概看了一下你的,有一个疑点,TM1650驱动数码管的时候需要先设置开显示,然后再发送显示数据,你的却是先发送了数据再打开的显示,不确定会不会有问题。
回复

使用道具 举报

板凳
ID:161164 发表于 2021-7-6 17:27 | 只看该作者
sadv 发表于 2021-7-6 17:21
1.这一行没注释不会报错吗?{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x7 ...

那段已在上一行注释掉
只是代码太长,论坛把它分开两行显示
回复

使用道具 举报

地板
ID:316468 发表于 2022-1-29 00:46 | 只看该作者
最近也研究了一下这个芯片,问题出在数组里的一个数是一个八位数码管(注意:是8位,也就是8个8)的某一段。所以要正确显示的话需要8个8位二进制的数中各取同一位来显示一个数。
回复

使用道具 举报

5#
ID:213173 发表于 2022-1-29 12:12 | 只看该作者
TM1629B.pdf (1.08 MB, 下载次数: 18)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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