关于tm1629共阳极接法点亮小数点的问题
我现在用的是共阳极接法,除了小数点别的都能正常显示,这种接法小数点到底能点亮吗,我直接输出0XFF,小数点也不能点亮,不知怎么回事,各位帮帮忙啊,搞了很长时间了你先量看看确定数码管的小数点是否会亮? 现在的数码管除非特别交代, 否则小数点是不会亮的. 肯定可以,我也碰到过有人这么高,不过你要先确定 小数点是有的才行 小数点用万用表通断档量过,可以用万用表点亮
#ifndef __TM1629_H
#define __TM1629_H
#include<reg52.h>
#include<intrins.h>
#define nop() _nop_()
#define RAMSIZE 16
#define CMD_TM1629_WRITE 0x40
#define CMD_TM1629_READ 0x42
#define CMD_TM1629_ADDRMODE 0x44
#define CMD_TM1629_STARTADDR(addr) addr|0xC0
sbit TM1629_DIO = P2^0; //TM1629数据输入/输出
sbit TM1629_CLK = P2^1; //TM1629时钟输入
sbit TM1629_STB = P2^2; //TM1629片选
#define TM1629_STB_HIGH() TM1629_STB = 1
#define TM1629_STB_LOW() TM1629_STB = 0
#define TM1629_CLK_HIGH() TM1629_CLK = 1
#define TM1629_CLK_LOW() TM1629_CLK = 0
#define TM1629_DIO_HIGH() TM1629_DIO = 1
#define TM1629_DIO_LOW() TM1629_DIO = 0
#endif
/*
*版权信息: 深圳市天微电子有限公司
*文件名: TM16XX
*当前版本: 1.0
*单片机型号: AT89S52
*晶震频率 12M
*开发环境: Keil uVision3
*作者:
*完成日期:
*功能: TM16XX与MCU接口函数
*/
#include<tm1629.h>
/* MCU一次输出8个bit */
void TM1629_OutByte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
TM1629_CLK_LOW();
if((dat & 0x01) == 0x01)
TM1629_DIO_HIGH();
else
TM1629_DIO_LOW();
//nop(); //单片机频率高时应适延时 (脉宽大于400ns)
TM1629_CLK_HIGH(); //上升沿输数据,低位开始
dat >>= 1;
}
}
/* MCU一次接收8个bit */
unsigned char TM1629_InByte(void)
{
unsigned char i;
unsigned char dat = 0;
TM1629_DIO_HIGH(); //如需要,必须在此设置I/O方向为输入
for(i = 0; i < 8; i++)
{
TM1629_CLK_LOW();
dat >>= 1; //从低位开始读取
if(TM1629_DIO) dat += 0x80;
TM1629_CLK_HIGH();
}
return(dat);
}
/* 向TM1629发送命令 */
void TM1629_SendCmd(unsigned char cmd)
{
TM1629_STB_HIGH(); //初始化TM1629(高电平)
TM1629_CLK_HIGH();
TM1629_STB_LOW(); //片选(低电平)
//nop(); //等待TM1629串口初始化完成
TM1629_OutByte(cmd);
TM1629_STB_HIGH();
}
/* 向TM1629发送地址 */
void TM1629_SendAddr(unsigned char addr)
{
TM1629_STB_HIGH(); //初始化TM1629
TM1629_CLK_HIGH();
TM1629_STB_LOW(); //片选,低电平有效
//nop(); //等待TM1629串口初始化完成
TM1629_OutByte(addr);
}
/* 向指定显示寄存器写入1byte数据 */
void TM1629_WriteByte( unsigned char addr, unsigned char dat )
{
TM1629_SendAddr( addr );
TM1629_OutByte( dat );
TM1629_STB_HIGH();
}
/* 向指定起始显示寄存器写入数据块 */
void TM1629_WriteBlock( unsigned char addr, unsigned char len, unsigned char* buf )
{
TM1629_SendAddr( addr );
while ( len -- ) TM1629_OutByte( *buf++ );
TM1629_STB_HIGH();
}
/* 连续读len个字节的按键数据,存放在buf指定的连续内存中 */
void TM1629_ReadKey( unsigned char len, unsigned char* buf )
{
TM1629_SendAddr(CMD_TM1629_READ);//这条命令不能用TM1629_SendCmd送
while ( len -- ) *buf++ = TM1629_InByte();
TM1629_STB_HIGH();
}
/* 配置TM1629 */
void TM1629_Config(void)
{
TM1629_CLK_HIGH();
TM1629_DIO_HIGH();
TM1629_STB_HIGH();
TM1629_SendCmd(0x03); /*写TM1629显示模式*/
TM1629_SendCmd(0x40); /*写数据到显示寄存器的方式采用地址自动加一*/
//clear ram
TM1629_SendCmd(0x8d);//开显示,亮度可以通过改变低三位调节
}
/**********************************************************
共阴代码转换成共阳代码
pSrcBuf:存放共阴代码
pDstBuf:存放共阳代码
n:转换长度
**********************************************************/
void convert1(unsigned char*pSrcBuf,unsigned char*pDstBuf,unsigned char n)
{
unsigned char i,j,s,tmp,count,index;
count = 0x01;
s=0x01;
for(i=0;i<n;i++)
{
tmp = *(pSrcBuf+i); //转换第i个byte
for(j = 0;j<8;j++)
{
if(i<8) index = 2*j; //每一字节的8位都转换在不同的显示地址中
else index=2*j+1;
if((tmp&count)==count) *(pDstBuf+index) = *(pDstBuf+index) | (s); //置1
else pDstBuf = *(pDstBuf+index) & (~s); //置0
if(count==0x80) count=0x01;
else count <<= 1;
}
if(s==0x80) s=0x01;
else s <<= 1;
}
} 我不用共阴到共阳码的转换程序直接送显示段码0xff,7段全亮了,但小数点就是不亮,我上面有10个数码管都是小数点不亮,奇怪
应该看下seg和grid 最大的定义,已经两种接法时的ram刷新方式。
虽然没用过led driver IC
顶一下,请做过的大侠看一下 坐等高手解答。。。。 lqzhw 发表于 2013-5-14 22:07 static/image/common/back.gif
我不用共阴到共阳码的转换程序直接送显示段码0xff,7段全亮了,但小数点就是不亮,我上面有10个数码管都是 ...
你确定在TM1629 的GRID8 的地址0x0e 0x0f 都写了0XFF ?你程序的主函数main在那儿?
我前用ATMEGA8驱动过共阳的管子 4位的4个 共16个字 显示小数点完全没问题啊要显示小数点时在写数据时|0x80就好了
把你的主程一字不落的贴出来帮你看看
这是我以前驱动1639时的程序同样我1629也是样用这个驱动的
TM1639 驱动8 位共阳数码管测试成功(可用于TM1629A)
http://www.amobbs.com/thread-5474051-1-1.html
#include<reg52.h>
#include<tm1629.h>
#include<intrins.h>
#define nop() _nop_()
#define DEMO1
extern void TM1629_SendCmd(unsigned char dat );
extern void TM1629_SendAddr(unsigned char addr );
extern void TM1629_WriteByte(unsigned char addr,unsigned char dat );
extern void TM1629_WriteBlock(unsigned char addr, unsigned char len, unsigned char* buf );
extern void TM1629_ReadKey(unsigned char len, unsigned char* buf );/* 连续读出nBytes数据存放于buf */
extern void TM1629_Config(void);
extern void convert1(unsigned char*pSrcBuf,unsigned char*pDstBuf,unsigned char n);
unsigned char LED = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //LED-LED对应16个数码管,TM1638最多只能接10个(),后6个无效,初始化显示成0
unsigned char Buf1 = {0x0ff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //显示缓存1,存放共阴显示数据
unsigned char Buf2 = {0x0ff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //显示缓存2,存放共阳显示数据
unsigned char KeyBuf = {123,0,0,0};
unsigned char CODE = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x0};//数码管显示0-9的代码(共阴接法) ,0x00是数码管关闭的代码
unsigned char CODE1 = {0xBf,0x86,0xDb,0xCf,0xE6,0xEd,0xFd,0x87,0xFf,0xEf,0x0};//数码管显示带小数点的字
unsigned char DspBuf = {0x00,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};//16字节显示RAM
/* TM1629 DEMO1 地址自动加一*/
void TM1629_DEMO1(void)
{
convert1(Buf1,Buf2,14);
TM1629_WriteBlock(0xc0,14,Buf2);
//TM1629_SendCmd(0x8d);//开显示,亮度可以通过改变低三位调节 config中
TM1629_ReadKey(4,KeyBuf); //读按键
}
/* TM1629 DEMO2 固定地址模式*/
void TM1629_DEMO2(void)
{
unsigned char i;
convert1(Buf1,Buf2,14);
for(i=0;i<14;i++)
{
TM1629_WriteByte(0xc0+i,Buf2);
}
//TM1629_SendCmd(0x8d);//开显示,亮度可以通过改变低三位调节
TM1629_ReadKey(4,KeyBuf); //读按键
}
void main(void)
{
unsigned int k,key;
TM1629_Config();//
while(1)
{
for(k=0;k<32500;k++)
{
nop();nop();nop();nop();nop();nop();
}
if (KeyBuf==8)
key=1;
if (KeyBuf==128)
key=2;
if (KeyBuf==8)
key=3;
if (KeyBuf==128)
key=4;
if (KeyBuf==8)
key=5;
if (KeyBuf==128)
key=6;
if (KeyBuf==8)
key=7;
if (KeyBuf==128)
key=8;
Buf1 = CODE;
TM1629_DEMO2();
}
请看,现在应该除了第7个数码管不显示8外,其它应该都显示8加小数点吧
for(i=0;i<14;i++) 14改成16你这样写在址时只写到0xcd GRID8 的地址0xce 0xcf跟本没有进行操作
{
TM1629_WriteByte(0xc0+i,Buf2);
} Buf2也要改成16楼主的程序是从那儿复制来的吧原来作者就没考虑要显示小数点多看几遍数据手册按里的要求时序自己写出来 就什么都明白了 谢谢啦,问题终于解决了 lqzhw 发表于 2013-5-21 19:08
谢谢啦,问题终于解决了
怎么解决的?说说呢,我刚用这个,不听使唤,不能够显示正确的数字,楼主给点拨下呢
页:
[1]