完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我用的STC的单片机,共阳极的数码管,用的驱动芯片TM1638,你们看看我的程序,哪里出了问题,数码管不亮啊。帮忙指点下谢谢了。在线等~~~电路图在下面。
程序: #include #define DATA_COMMAND 0X40 #define DISP_COMMAND 0x80 #define ADDR_COMMAND 0XC0 #define uchar unsigned char #define uint unsigned int //TM1638模块引脚定义 ***it DIO=P2^1; ***it CLK=P2^0; ***it STB=P4^0; void display1638(); //uchar data DisBuffer[8]={0,0,0,0,0,0,0,0,0,0}; /*显示缓存区*/ //各个数码管显示的值 //uchar code tab[]={0xc0,0xf9,0xa4,0xb0, //0x99,0x92,0x82,0xf8, //0x80,0x90,0x88,0x83, //0xc6,0xa1,0x86,0x8e}; void TM1638_Write(unsigned char DATA) //写数据函数 { unsigned char i; for(i=0;i<8;i++) { CLK=0; if(DATA&0X01) DIO=1; else DIO=0; DATA>>=1; CLK=1; } } /*unsigned char TM1638_Read(void) //读数据函数 { unsigned char i; unsigned char temp=0; DIO=1; //设置为输入 for(i=0;i<8;i++) { temp>>=1; CLK=0; if(DIO) temp|=0x80; CLK=1; } return temp; } */ void Write_COM(unsigned char cmd) //发送命令 { STB=0; TM1638_Write(cmd); STB=1; } void Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入数据 { Write_COM(0x44); //设置固定地址 STB=0; TM1638_Write(0xc0|add); TM1638_Write(DATA); STB=1; } void init_TM1638(void) { unsigned char i; Write_COM(0x8a);//亮度 Write_COM(0x40); //写 数据命令 //Write_COM(0x88);//开显示 STB=0; TM1638_Write(0xc0); //设置起始地址 for(i=0;i<16;i++) TM1638_Write(0x00); STB=1; } void main() { init_TM1638(); while(1) { display1638(); } } void display1638() { // CLK=0; Write_DATA(0xc0,0x01); Write_DATA(0xc2,0x01); Write_DATA(0xc4,0x01); Write_DATA(0xc6,0x01); Write_DATA(0xc8,0x01); Write_DATA(0xca,0x01); Write_DATA(0xcc,0x00); Write_DATA(0xce,0x00); // CLK=1; }
|
|
相关推荐
42个回答
|
|
黄昏再羙丶終要 发表于 2012-10-21 16:21 你好,你那STB-1是什么? TM1638上没这个引脚啊?它只有3个控制输入端:CLK,DO,STB呀 |
|
|
|
例程。有用的哦,亲 #include"REG52.H" #include"stdio.h" #include"TM1638CMD.H" typedef unsigned char UINT8; /* 类型定义 */ typedef unsigned int UINT16; /******************************** 引脚定义 ************************************** 单片机 TM1638 P20 STB P21 CLK P22 DIO ********************************************************************************/ ***it STB = P2^2; /* 定义TM1638片选线 */ ***it CLK = P2^1; /* 定义TM1638时钟线 */ ***it DIO = P2^0; /* 定义TM1638数据输入,输出线 */ /****************************** 共阴数码管码表 ********************************/ const UINT8 CathodeCode[ 0x10 ] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F, 0X77, 0X7C, 0X58, 0X5E, 0X79, 0X71 }; UINT8 KeyCode[4]; /* 保存键值 */ /******************************************************************************* * 函 数 名 : DelayUs * 描 述 : 微秒级延时. * 输 入 : UINT8 Us: * 要延时Us的时间. * 返 回 : 无. *******************************************************************************/ void DelayUs( UINT16 Us ) { while(--Us); } /******************************************************************************* * 函 数 名 : DelayMs * 描 述 : 微秒级延时. * 输 入 : UINT8 Us: * 要延时的Ms时间. * 返 回 : 无. *******************************************************************************/ void DelayMs( UINT16 Ms ) { while( Ms-- ) { DelayUs(200); /* 5次1ms */ DelayUs(200); DelayUs(200); DelayUs(200); DelayUs(200); } } /******************************************************************************* * 函 数 名 : TM1638_WriteCmd * 描 述 : 向TM1638写入命令. * 输 入 : UINT8 mCmd: * 要发送的命令. * 返 回 : 无. *******************************************************************************/ void TM1638_WriteCmd( UINT8 mCmd ) { UINT8 i; STB = 0; /* 使能片选 */ for( i = 0; i < 8 ; i++ ) { CLK = 0; /* 拉低CLK */ DelayUs(1); mCmd >>= 1; /* 数据右移一位,最低位存入CY */ DIO = CY; /* 发送数据到信号线上 */ CLK = 1; /* 拉高CLK */ DelayUs(1); } STB = 1; /* 禁止片选 */ DelayUs(2); } /******************************************************************************* * 函 数 名 : TM1638_WriteCmd * 描 述 : 向TM1638写入命令. * 输 入 : UINT8 mDig: * 对应的位. UINT8 mData: 对应的数据. * 返 回 : 无. *******************************************************************************/ void TM1638_WriteData( UINT8 mDig, UINT8 mData ) { UINT8 i; STB = 0; /* 使能片选 */ for( i = 0; i < 8 ; i++ ) { CLK = 0; /* 拉低CLK */ DelayUs(1); mDig >>= 1; /* 数据右移一位,最低位存入CY */ DIO = CY; /* 发送数据到信号线上 */ CLK = 1; /* 拉高CLK */ DelayUs(1); } for( i = 0; i < 8 ; i++ ) { CLK = 0; /* 拉低CLK */ DelayUs(1); mData >>= 1; /* 数据右移一位,最低位存入CY */ DIO = CY; /* 发送数据到信号线上 */ CLK = 1; /* 拉高CLK */ DelayUs(1); } STB = 1; /* 禁止片选 */ DelayUs(2); } /******************************************************************************* * 函 数 名 : TM1638_ReadData * 描 述 : 从TM1638读数据. * 输 入 : UINT8 mCmd: * 要发送的命令. * 返 回 : 无. *******************************************************************************/ void TM1638_ReadData( UINT8 mCmd ) { UINT8 i,j; UINT8 ByteCnt = 0; UINT8 RecData = 0; STB = 0; /* 使能片选 */ for( i = 0; i < 8 ; i++ ) { CLK = 0; /* 拉低CLK */ DelayUs(1); mCmd >>= 1; /* 数据右移一位,最低位存入CY */ DIO = CY; /* 发送数据到信号线上 */ CLK = 1; /* 拉高CLK */ DelayUs(1); } DIO = 1; /* 拉高数据线 */ DelayUs(3); /* 等待3 Us */ for( i = 0; i < 4; i++ ) { for( j = 0; j < 8 ; j++ ) { CLK = 0; /* 拉低CLK */ DelayUs(1); RecData >>= 1; /* 右移一位 */ if( DIO == 1 ) { RecData |= 0x80; } CLK = 1; /* 拉高CLK */ DelayUs(1); } KeyCode[ ByteCnt++ ] = RecData; RecData = 0; } STB = 1; /* 禁止片选 */ } /******************************************************************************* * 函 数 名 : main * 描 述 : 主程序. * 输 入 : 无. * 返 回 : 无. *******************************************************************************/ void main( void ) { UINT8 i; DelayUs(200); /* 上电延时,等待系统其它元件正常工作 */ TM1638_WriteCmd( DISPLAY_ON ); /* 开显示 */ TM1638_WriteCmd( ADDRESS_FIX_MODE ); /* 地址固定模式 */ for( i = 0; i < 16; i++ ) /* 带小数点从0显示到F */ { TM1638_WriteData( TM1638_DIG0, CathodeCode[ i ] | 0x80 ); TM1638_WriteData( TM1638_DIG1, CathodeCode[ i ] | 0x80 ); TM1638_WriteData( TM1638_DIG2, CathodeCode[ i ] | 0x80 ); TM1638_WriteData( TM1638_DIG3, CathodeCode[ i ] | 0x80 ); TM1638_WriteData( TM1638_DIG4, CathodeCode[ i ] | 0x80 ); TM1638_WriteData( TM1638_DIG5, CathodeCode[ i ] | 0x80 ); TM1638_WriteData( TM1638_DIG6, CathodeCode[ i ] | 0x80 ); TM1638_WriteData( TM1638_DIG7, CathodeCode[ i ] | 0x80 ); DelayMs( 20 ); /* 延时20 Ms */ } TM1638_WriteData( TM1638_DIG0, 0xFF ); /* 全亮 */ TM1638_WriteData( TM1638_DIG1, 0xFF ); TM1638_WriteData( TM1638_DIG2, 0xFF ); TM1638_WriteData( TM1638_DIG3, 0xFF ); TM1638_WriteData( TM1638_DIG4, 0xFF ); TM1638_WriteData( TM1638_DIG5, 0xFF ); TM1638_WriteData( TM1638_DIG6, 0xFF ); TM1638_WriteData( TM1638_DIG7, 0xFF ); for( i = 0; i < 8 ;i++ ) /* 亮度调整 */ { TM1638_WriteCmd( SET_PLUS_WIDTH1 | i ); DelayMs( 20 ); /* 延时20 Ms */ } TM1638_WriteCmd( SET_PLUS_WIDTH4 ); /* 设置亮度为 4/16,防止电流过大影响数码管寿命 */ while(1) { TM1638_ReadData( READ_KEY ); /* 读键值 */ TM1638_WriteData( TM1638_DIG0, CathodeCode[ KeyCode[0] / 16 ] ); /* 显示读取到的键值 */ TM1638_WriteData( TM1638_DIG1, CathodeCode[ KeyCode[0] % 16 ] | 0X80 ); TM1638_WriteData( TM1638_DIG2, CathodeCode[ KeyCode[1] / 16 ] ); TM1638_WriteData( TM1638_DIG3, CathodeCode[ KeyCode[1] % 16 ] | 0X80 ); TM1638_WriteData( TM1638_DIG4, CathodeCode[ KeyCode[2] / 16 ] ); TM1638_WriteData( TM1638_DIG5, CathodeCode[ KeyCode[2] % 16 ] | 0X80 ); TM1638_WriteData( TM1638_DIG6, CathodeCode[ KeyCode[3] / 16 ] ); TM1638_WriteData( TM1638_DIG7, CathodeCode[ KeyCode[3] % 16 ] ); DelayMs( 5 ); } |
|
|
|
{:1:}{:1:}
|
|
|
|
哥,能给个历程吗?
|
|
|
|
给个1638驱动数码管显示的历程吧! |
|
|
|
#include
#include #include typedef unsigned char uchar; typedef unsigned int uint; uchar aa,ge,shi,bai,num; void init(); #define ADDRESS_FIX_MODE 0X40 #define READ_KEY 0X42 #define ADDRESS_INCREASE_MODE 0X44 #define TM1638_DIG0 0XC0 #define TM1638_DIG1 0XC2 #define TM1638_DIG2 0XC4 #define TM1638_DIG3 0XC6 #define TM1638_DIG4 0XC8 #define TM1638_DIG5 0XCA #define TM1638_DIG6 0XCC #define TM1638_DIG7 0XCE #define DISPLAY_OFF 0X80 #define DISPLAY_ON 0X88 #define SET_PLUS_WIDTH1 0X88 #define SET_PLUS_WIDTH2 0X89 #define SET_PLUS_WIDTH4 0X8A #define SET_PLUS_WIDTH10 0X8B #define SET_PLUS_WIDTH11 0X8C #define SET_PLUS_WIDTH12 0X8D #define SET_PLUS_WIDTH13 0X8E #define SET_PLUS_WIDTH14 0X8F ***it STB = P2^2; ***it CLK = P2^1; ***it DIO = P2^0; const uchar CathodeCode[ 0x10 ] = { 0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F, 0X77, 0X7C, 0X58, 0X5E, 0X79, 0X71 }; void DelayUs(uint Us) { while(--Us); } void DelayMs(uint Ms) { while(Ms--) { DelayUs(200); DelayUs(200); DelayUs(200); DelayUs(200); DelayUs(200); } } void TM1638_WriteCmd(uchar Cmd) { uchar i; STB=0; for(i=0;i<8;i++) { CLK=0; DelayUs(1); Cmd >>=1; DIO=CY; CLK=1; DelayUs(1); } STB=1; DelayUs(2); } void TM1638_WriteData(uchar Dig,uchar Data) { uchar i; STB=0; for(i=0;i<8;i++) { CLK=0; DelayUs(1); Dig >>=1; DIO=CY; CLK=1; DelayUs(2); } for(i=0;i<8;i++) { CLK=0; DelayUs(1); Data >>=1; DIO=CY; CLK=1; DelayUs(2); } STB=1; DelayUs(2); } void init() { num=0; TMOD=0X01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void main() { init(); while(1) { if(aa==20) { aa=0; num++; } if(num==240) num=0; bai=num/100; shi=num%100/10; ge=num%10; DelayUs(200); TM1638_WriteCmd(DISPLAY_ON ); TM1638_WriteCmd( ADDRESS_FIX_MODE ); TM1638_WriteData(TM1638_DIG5, CathodeCode[bai]); TM1638_WriteData(TM1638_DIG6, CathodeCode[shi]); TM1638_WriteData(TM1638_DIG7, CathodeCode[ge]); } } void timer()interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; } 看看这个 |
|
|
|
学习学习
|
|
|
|
TM1638是一个驱动8个共阴极数码管的芯片。你的是十个数码管,所以只能是共阳极的数码管。共阳极和共阴极的驱动是不同的,向地址写入数据只能使用在共阴极的数码管。
|
|
|
|
瞧一瞧看一看咯~
|
|
|
|
不错啊,学习学习,如果有原理图就更好了
|
|
|
|
顶顶顶顶顶,我看到原来的1638的pdf好像里面的内容不是太对,特别是介绍按键的那些章节
|
|
|
|
你好,读键值的程序中,那个if(DIO)和下面的那条temp=temp|0x80是什么意思?
|
|
|
|
一直看明白这个if(DIO)这个if语句是怎么回事,那个temp初值不是0吗?不管怎么右移不还是0 吗?还有上面那个DIO=1;是设置为输入吗?这一句也不理解啊?求楼主帮忙解释一下。谢谢了
|
|
|
|
为什么读数据的时候都是有那个for(j=0;j<4;j++),为什么都是4?难道说是4个按键吗?还是怎么回事?求高手指导!谢谢
|
|
|
|
|
|
|
|
TM1638最多可以读4个字节,不允许多读
|
|
|
|
|
|
|
|
这个芯片的按键检测结束可以添加其他程序吗,比方说用这里的按键控制其他模块
|
|
|
|
路过看看!不知道楼主问题解决了吗
|
|
|
|
有TM1638CMD.H那个头文件吗
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
为什么用FatFS在SD卡创建文件,在单片机上读写正常,用读卡器插到电脑上就什么都没有
720 浏览 0 评论
932 浏览 2 评论
《DNK210使用指南 -CanMV版 V1.0》第九章 打印输出实验
442 浏览 0 评论
stm32f407+ksz8863rlli概率性ping不通
1159 浏览 1 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-常见网络服务搭建之NFS服务搭建
554 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11382 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-2 23:40 , Processed in 0.995016 second(s), Total 109, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号