TM1638按键数码管模块 电路图
GN1638 LED驱动专用电路使用手册说明书
1、概 述GN1638是带键盘扫描接口的LED驱动专用电路,内置键盘扫描接口,MCU数字接口、数据锁存器等电路。
主要应用于冰箱、空调、家庭影院等产品显示屏的驱动控制。
其主要特点如下:●采用功率CMOS工艺●显示模式:10段×8位●键扫描:8×3bit●辉度调节电路(占空比8级可调)●串行接口(CLK、DIO、STB)●内置RC振荡(400KH z±5%)●内置上电复位电路●封装形式:SOP28●包装规格:GN1638 SOP28 25PCS/管 2000PCS/盒 20000PCS/箱2、功能框图及引脚说明2.1、引脚排列图图1 引脚排列图中国(上海)自由贸易试验区芳春路400号1幢3层 电话:021-********2.2、引脚说明引脚 符 号 引脚名称功 能1-3K1~K3 键扫数据输入输入该脚的数据在显示周期结束后被锁存4、15 VDD 逻辑电源 5V±10%5~12 SEG1/KS1~SEG8/KS8 输出( 段) 段输出(也用作键扫描),P管开漏输出 13、14 SEG9、SEG10 输出( 段) 段输出, P管开漏输出 16、17 GR7、GR8 输出( 位) 位输出, N管开漏输出 18、25 GND 逻辑地 接系统地19~24 GR1~GR6 输出( 位) 位输出, N管开漏输出26 DIO 数据输入/输出在时钟上升沿输入/输出串行数据, 从低位开始;27CLK时钟输入上升沿输入/输出串行数据28STB片选在上升或下降沿初始化串行接口, 随后等待接收指令。
STB 为低后的第一个字节作为指令,当处理指令时,当前其它处理被终止。
当STB 为高时, CLK 被忽略注:DIO口输出数据时为N管开漏输出(见图2),在读键的时候需要外接1K-10K的上拉电阻,推荐10K的上拉电阻。
DIO在时钟的下降沿控制N管的动作,此时读数时不稳定,在时钟的上升沿读数才时稳定,时序参考图7图2、DIO 端口结构中国(上海)自由贸易试验区芳春路400号1幢3层 电话:021-********3、电特性3.1、极限参数 (除非另有规定,GND =0V ,T amb =25℃)参 数 名 称符 号条 件额 定 值单 位逻辑电源电压VDD -0.5~7.0V 逻辑输入电压V TI -0.5~VDD+0.5V LED SEG 驱动输出电流 I O1 -50mA LED GR 驱动输出电流 I O2 +200mA 功率损耗P D 400 mW 工作环境温度T amb -40~+85℃贮存温度T stg -65~+150℃焊接温度T L10秒250℃3.2、推荐使用条件 (工作条件:T amb = -20~+70℃,GND =0V )参 数 名 称符 号最小典型最大单 位逻辑电源电压VDD 355.5V高电平输入电压V IH 0.7VDD VDD V 低电平输入电压V IL0.3 VDD V3.3、电气特性3.3.1直流参数 (除非另有规定,T amb =-20~+70℃,VDD=4.5~5.5V ,GND=0V )参 数 名 称符号测 试 条 件最小典型最大单位I OH 1 SEG1~SEG10,V o = VDD-2V -20-25-40mA 高电平输出电流I OH 2 SEG1~SEG10,V o = VDD-3V -20-30-50mA 低电平输出电流I OL 1 GR1~GR8 Vo=0.3V 80140mA低电平输出电流Idout VO = 0.4V ,dout4 mA高电平输出电流容许量ItolsgVO = VDD – 3V,SEG1~SEG105 %输出下拉电阻RL K1~K3 10K Ω输入电流II VI =VDD/GND ±1µA 高电平输入电压V IH CLK ,DIO, STB 0.7VDDV低电平输入电压V IL CLK ,DIO, STB 0.3VDDV 滞后电压V HCLK ,DIO, STB0.35V动态电流损耗IDDdyn 无负载,显示关 5 mA3.3.2交流参数 (除非另有规定,T amb =-20~+70℃,VDD=4.5~5.5V )中国(上海)自由贸易试验区芳春路400号1幢3层电话*************中国(上海)自由贸易试验区芳春路400号1幢3层 电话:021-********参 数 名 称符 号测 试 条 件最小典型最大单位振荡频率Fosc 400 KHzTplz 300ns传输延迟时间Tpzl CL K→DIO,CL=15pf,RL=10K Ω 100 nsTTZH1 SEG1~SEG10 2 µs 上升时间TTZH2 CL=300pfGR1~GR80.5 µs 下降时间TTHZ CL=300pf ,SEGN ,GRN 120µs 最大时钟频率Fmax 占空比50%1MHz输入电容CI15 pf时钟脉冲宽度PWCLK 400 ns 选通脉冲宽度PWSTB1µs 数据建立时间tSETUP 100 ns 数据保持时间tHOLD 100 ns CLK →STB 时间 tCLK STB CLK ↑→STB ↑1 µs 等待时间tWAITCL K↑→CLK↓1µs4、功能介绍4.1、显示寄存器地址和显示模式该寄存器存储通过串行接口从外部器件传送到GN1638的数据,地址从00H-0FH共16字节单元,分别与芯片SEG和GR管脚所接的LED灯对应,分配如图3:写LED显示数据的时候,按照从显示地址从低位到高位,从数据字节的低位到高位操作。
tm1638中文资料_数据手册_参数
-3-
LED 驱动控制专用电路
TM1638
B0
B1 B2 B3
B4
B5
B6
B7
K3 K2 K1 X
K3
K2
K1
X
KS1
KS2
BYTE1
KS3
KS4
BYTE2
KS5
KS6
BYTE3
KS7
KS8
BYTE4
图(4) ▲注意:1、TM1638最多可以读4个字节,不允许多读。
在时钟的上升沿读数才时稳定。
VCC
芯片内部电路
CT
10K DIO
GND
图(1)
-2-
LED 驱动控制专用电路
TM1638
五、 显示寄存器地址和显示模式:
该寄存器存储通过串行接口从外部器件传送到TM1638 的数据,地址从00H-0FH共16字节单元, 分别与芯片SGE和GRID管脚所接的LED灯对应,分配如下图: 写LED显示数据的时候,按照从显示地址从低位到高位,从数据字节的低位到高位操作。
SEG10
SEG9
SEG8
SEG7
SEG6
SEG5
SEG4
SEG3
SEG2
SEG1
X X XXXX
xxHL(低四位)
xxHU(高四位)
xxHL(低四位)
xxHU(高四位)
B0 B1 B2 B3 B4 B5 B6 B7 B0 B1 B2 B3 B4 B5 B6 B7
00HL 02HL 04HL 06HL 08HL 0AHL 0CHL 0EHL
输出(段) 段输出,P管开漏输出
Grid1~Grid8 VDD GND
输出(位) 逻辑电源 逻辑地
TM1638规格书
Add:401-503,4/F,Bldg. No.4,Keji Central Road 2, Software Park,High-Tech Industrial Park,Shenzhen
电话:86-755-86185069
传真: 86-755-86185059
邮编:518057
网址:
℃
储存温度
Tstg
-65 ~+150
℃
正常工作范围(Ta = -20 ~ +70℃,Vss = 0 V)
参数
符号
最小
典型 最大 单位
逻辑电源电压
VDD
5
V
高电平输入电压
VIH
0.7 VDD
-
VDD
V
测试条件 -
低电平输入电压
VIL
0
-
0.3 VDD
V
-
电气特性(Ta = -20 ~ +70℃,VDD = 4.5 ~ 5.5 V, Vss = 0 V
技术支持:86-755-86185092
-1-
深圳市天微电子有限公司
SHENZHEN TITAN M ICRO ELECTRONI CS CO.,LTD.
四、管脚功能说明:
符号
管脚名称
说明
DIN
数据输入
在时钟上升沿输入串行数据,从低位开始
DOUT STB
数据输出
在时钟下降沿输出串行数据,从低位开始。输出 为N-ch open drain
二、 特性说明
• 采用功率CMOS 工艺 • 显示模式 10 段×8 位 • 键扫描(8×3bit) • 辉度调节电路(占空比8 级可调) • 串行接口(CLK,STB,DIO) • 振荡方式:RC 振荡(450KHz+5%) • 内置上电复位电路 • 采用SOP28封装
一种基于TM1638的智能仪表键盘显示电路设计
一种基于TM1638的智能仪表键盘显示电路设计张吉祥;陈惠明【摘要】In order to achieve man-machine interactive function of intelligent instrument, a design scheme of using keyboard display driver chip TML638 with serial interface to manage the LED digital tube and keyboard is proposed. The specific hardware design and software design by using TM1638 and STC11F02 are introduced.%为了实现智能仪表的人机交互功能,提出了一种采用具有串行接口的键盘显示驱动芯片TML638来对LED数码管及键盘进行管理的设计方案,给出了TM1638与单片机STC11F02进行接口的具体硬件设计方案和软件设计思想。
【期刊名称】《物联网技术》【年(卷),期】2011(001)009【总页数】3页(P67-68,72)【关键词】TM1638;数码管;键盘;智能仪表;显示电路【作者】张吉祥;陈惠明【作者单位】南京林业大学机械电子工程学院,江苏南京210037;南京林业大学机械电子工程学院,江苏南京210037【正文语种】中文【中图分类】TP334.70 引言对于智能仪表人机交互化实现媒介,我们通常使用LCD液晶或者LED数码管来作为显示器件。
其中LCD价格比较昂贵,醒目程度较低,可视角度也比较小;而LED数码管亮度高,更醒目,而且价格低,因此,LED数码管具有更好的性价比[1]。
但是,若采用一般的显示方案,其所用元器件多而且复杂,系统可靠性低,成本较大。
而若选用价格低廉的键盘显示驱动芯片TM1638,那么只需3根线就可与单片机(MCU)相连接,而且占用单片机(MCU)的I/O口资源少,硬件连接简单,可靠性高。
TM1638芯片+DS1302驱动共阴数码管时钟
一、概述二、51单片机,TM1638芯片+DS1302驱动共阴数码管时钟,最后包括按键检测程序(是分开的。
)TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。
主要应用于冰箱、空调、家庭影院等产品的高段位显示屏驱动。
二、特性说明•采用功率CMOS 工艺•显示模式 10 段×8 位•键扫描(8×3bit)•辉度调节电路(占空比8 级可调)•串行接口(CLK,STB,DIO)•振荡方式:RC 振荡(450KHz+5%)•内置上电复位电路•采用SOP28封装三、、管脚定义:电路图数码管:程序代码:/*************** TM1638.H头文件*******************/#ifndef _TM1638_H#define _TM1638_H//引脚定义sbit DIO=P1^0;sbit CLK=P1^1;sbit STB=P1^2;void TM1638_Write(unsigned char DATA) //写数据函数{unsigned char i;for(i=0;i<8;i++){CLK=0;if(DATA&0X01)DIO=1;elseDIO=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 DA TA) //指定地址写入数据{Write_COM(0x44);STB=0;TM1638_Write(0xc0|add);TM1638_Write(DA TA);STB=1;}void init_TM1638(void){unsigned char i;Write_COM(0x8a);//亮度Write_COM(0x40); //写数据命令STB=0;TM1638_Write(0xc0); //写地址命令for(i=0;i<16;i++)TM1638_Write(0x00);STB=1;}#endif/***************************DS1302.H头文件***************************/#ifndef DS1302_H#define DS1302_H#define uchar unsigned char#define uint unsigned int#include"DELAY.h"sbit acc0=ACC^0; //移位时的第0位sbit acc7=ACC^7; //移位时用的第7位uchar second,minute,hour,day,month,year,week,count=0;uchar ReadValue,num,time;sbit SCLK=P2^0;sbit DATA=P2^1;sbit RST=P2^2;void Write1302(uchar dat){uchar i;SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备delay1(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续写8个二进制位数据{DATA=dat&0x01; //取出dat的第0位数据写入1302delay(2); //稍微等待,使硬件做好准备SCLK=1; //上升沿写入数据delay1(2); //稍微等待,使硬件做好准备SCLK=0; //重新拉低SCLK,形成脉冲dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位}}void WriteSet1302(uchar Cmd,uchar dat){RST=0; //禁止数据传递SCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输delay1(2); //稍微等待,使硬件做好准备Write1302(Cmd); //写入命令字Write1302(dat); //写数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递}uchar Read1302(void){uchar i,dat;delay(2); //稍微等待,使硬件做好准备for(i=0;i<8;i++) //连续读8个二进制位数据{dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位if(DATA==1) //如果读出的数据是1dat|=0x80; //将1取出,写在dat的最高位SCLK=1; //将SCLK置于高电平,为下降沿读出delay1(2); //稍微等待SCLK=0; //拉低SCLK,形成脉冲下降沿delay1(2); //稍微等待}return dat; //将读出的数据返回}uchar ReadSet1302(uchar Cmd){uchar dat;RST=0; //拉低RSTSCLK=0; //确保写数居前SCLK被拉低RST=1; //启动数据传输Write1302(Cmd); //写入命令字dat=Read1302(); //读出数据SCLK=1; //将时钟电平置于已知状态RST=0; //禁止数据传递return dat; //将读出的数据返回}void Init_DS1302(void){WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,((41/10)<<4|(41%10))); //根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,((15/10)<<4|(15%10))); //根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,((29/10)<<4|(24%10))); //根据写日寄存器命令字,写入日的初始值WriteSet1302(0x88,((2/10)<<4|(2%10))); //根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,((10/10)<<4|(11%10))); //nianWriteSet1302(0x8a,((0/10)<<4|(0%10)));WriteSet1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令}#endif/***************显示头文件*******************************/#include"TM1638.h"uchar data DisBuffer[8]={0,0,0,0,0,0,0,0}; /*显示缓存区*/ //各个数码管显示的值uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71 ,0x40,0xef};void display1638(uchar hour,uchar minute,uchar second){uchar i;DisBuffer[0]=hour/10;DisBuffer[1]=hour%10;DisBuffer[3]=minute/10;DisBuffer[4]=minute%10;DisBuffer[6]=second/10;DisBuffer[7]=second%10;DisBuffer[2]=16;DisBuffer[5]=16;for(i=0;i<8;i++){Write_DATA(i*2,tab[DisBuffer[i]]);}}void DisplayHour(newval){DisBuffer[0]=newval/10;DisBuffer[1]=newval%10;for(i=0;i<2;i++){Write_DATA(i*2,tab[DisBuffer[i]]);}}#endif/**********************************************************///下面是处理程序头文件,调试功能的实现,但是本人接调时的来源是//是鼠标芯片,所以这里都写上,各位可以根据自己是按键还是其他的,做修改/***********************************************/#ifndef CHULI_H#define CHULI_H#define uchar unsigned char#define uint unsigned int#include"DISPLAY.h"#include"DS1302.h"void read_date(void){ReadValue = ReadSet1302(0x81);second=((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = ReadSet1302(0x83);minute=((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = ReadSet1302(0x85);hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x87);day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x89);month=((ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = ReadSet1302(0x8d);year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue=ReadSet1302(0x8b); //读星期week=ReadValue&0x07;display1638(hour,minute,second) ;}void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num){newval=ReadSet1302(newaddr); //读取当前时间newval=((newval&0x70)>>4)*10+(newval&0x0f); //将bcd码转换成十进制if(flag) //判断是加一还是减一{newval++;switch(s1num){ case 1: if(newval>99) newval=0;DisplayYear(newval);break;case 2: if(newval>12) newval=1;DisplayMonth(newval);break;case 3: if(newval>31) newval=1;DisplayDay(newval);break;case 4: if(newval>6) newval=0;DisplayWeek(newval);break;case 5: if(newval>23) newval=0;DisplayHour(newval);break;case 6: if(newval>59) newval=0;DisplayMinute(newval);break;case 7: if(newval>59) newval=0;DisplaySecond(newval);break;default:break;}}else{newval--;switch(s1num){ case 1: if(newval==0) newval=99;DisplayYear(newval);break;case 2: if(newval==0) newval=12;DisplayMonth(newval);break;case 3: if(newval==0) newval=31;DisplayDay(newval);break;case 4: if(newval<0) newval=6;DisplayWeek(newval);break;case 5: if(newval<0) newval=23;DisplayHour(newval);break;case 6: if(newval<0) newval=59;DisplayMinute(newval);break;case 7: if(newval<0) newval=59;DisplaySecond(newval);break;default:break;}}WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10)); //将新数据写入寄存器}void write_flsh(uchar com,uchar dat){ Write_DATA(com,tab[16]);delay(100);Write_DATA(com,tab[dat]);}void sp2_mouse(void){uchar miao,z,flag=0;rd=0;miao=ReadSet1302(0x81);second=miao;WriteSet1302(0x80,miao|0x80);while(1){ led=0;////////////////////////////////////////* if((move_x<4)&&(flag==0)){write_flash(0x02,1) ;if((mouse_data[0]&0x01)&&(flag==1)){while(mouse_data[0]&0x01);while(1){ write_flash(0x02,1) ;z=move_x;if(move_x>z){ delayms(10);turn_val(year,1,0x8d,1);}if(z>move_x){delayms(10);turn_val(year,0,0x8d,1);}if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);flag=1;move_x=3;z=move_x;break;}}}}///////////////////////////////////////////////////////if((move_x>=4)&&(move_x<6)&&(flag==0)){write_com(0x87);if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);while(1){ z=move_x;write_com(0x87);if(move_x>z){ delayms(10);turn_val(month,1,0x89,2);}if(z>move_x){delayms(10);turn_val(month,0,0x89,2);}if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);flag=1;move_x=5;z=move_x;break;}}}}/////////////////////////////////////////////////////////if((move_x>=6)&&(move_x<8)&&(flag==0)){write_com(0x8a);if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);while(1){z=move_x;write_com(0x8a);if(move_x>z){ delayms(10);turn_val(day,1,0x87,3);}if(z>move_x){ delayms(10);turn_val(day,0,0x87,3);}if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);flag=1;move_x=7;z=move_x;break;}}}}///////////////////////////////////////////////////////////if((move_x>=8)&&(move_x<10)&&(flag==0)){write_com(0x8e);if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);while(1){z=move_x;write_com(0x8e);if(move_x>z){ delayms(10);turn_val(week,1,0x8b,4);}if(z>move_x){delayms(10);turn_val(week,0,0x8b,4);}if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);flag=1;move_x=9;z=move_x;break;}}}} */////////////////////////////////////////////////////////////if((move_x>=10)&&(move_x<12)&&(flag==0)){write_flash(0x02,1) ;if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);while(1){z=move_x;write_flash(0x02,1) ;if(move_x>z){ delayms(10);turn_val(hour,1,0x85,5);}if(z>move_x){ delayms(10);turn_val(hour,0,0x85,5);}if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);flag=1;move_x=11;z=move_x;break;}}}}//////////////////////////////////////////////////////////////if((move_x>=12)&&(move_x<14)&&(flag==0)){write_com(0xc4) ;if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);while(1){z=move_x;write_com(0xc4) ;if(move_x>z){ delayms(10);turn_val(minute,1,0x83,6); //写入分寄存器}if(z>move_x){delayms(10);turn_val(minute,0,0x83,6); //写入分寄存器}if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);flag=1;move_x=13;z=move_x;break;}}}}////////////////////////////////////////////////////////////////if((move_x>=14)&&(flag==0)){write_com(0xc7);if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);while(1){z=move_x;write_com(0xc7);if(move_x>z){ delayms(10);turn_val(second,1,0x81,7);}if(z>move_x){delayms(10);turn_val(second,0,0x81,7);}if(mouse_data[0]&0x01){while(mouse_data[0]&0x01);flag=1;move_x=15;z=move_x;break;}}}}///////////////////////////////////////////////////////////////if((mouse_data[0]&0x01)&&(z!=move_x)){flag=0;while(mouse_data[0]&0x01);}//////////////////////////////////////////////////////////////if((mouse_data[0]&0x01)&&(flag==1)&&(z==move_x)){flag=0;delayms(300);miao=ReadSet1302(0x81);second=miao;WriteSet1302(0x80,second&0x7f);write_com(0x0c) ;WriteSet1302(0x8E,0x80); //根据写状态寄存器命令字,写入不保护指令break;}}}#endif/*********鼠标芯片*****/#ifndef PS2_H#define PS2_H#include"DELAY.h"sbit mouse_SDA=P3^4;//数据线P3_5 计数器0输入端口sbit mouse_CLK=P3^3;//时钟线P3_3 外部中断1输入端口sbit led=P3^6;bit pp=0;bit ACK=0;uchar bdata mouse_byte; //接收字节bdata-->可寻址的片内RAMsbit mouse_byte_bit0=mouse_byte^0;//mouse_byte第0位sbit mouse_byte_bit1=mouse_byte^1;//mouse_byte第1位sbit mouse_byte_bit2=mouse_byte^2;//mouse_byte第2位sbit mouse_byte_bit3=mouse_byte^3;//mouse_byte第3位sbit mouse_byte_bit4=mouse_byte^4;//mouse_byte第4位sbit mouse_byte_bit5=mouse_byte^5;//mouse_byte第5位sbit mouse_byte_bit6=mouse_byte^6;//mouse_byte第6位sbit mouse_byte_bit7=mouse_byte^7;//mouse_byte第7位uchar mouse_buffer[11];//接收位数据缓冲区uchar mouse_buffer_bit=0;//mouse_buffer[mouse_buffer_bit]uchar mouse_data[4];//接收鼠标数据缓冲区,分别存放:功能信息字节,x位移量,y位移量uchar mouse_data_bit=0;//mouse_data[mouse_data_bit]uchar move_x;//存放横坐标uint move_y;//存放纵坐标uchar move_z;extern uchar move_x;/*********************************************************************** 发送数据************************************************************************/void Init_ter(void){EA=1; //开放中断EX1=1;//允许外部中断1PX1=1;//设置中断优先级设外部中断1为最高优先级别}void host_to_mouse(uchar cmd){uchar i;EX1=0;mouse_CLK=0;delay100;delay100;ACC=cmd;pp=~P; //获得奇偶校验位mouse_SDA=0;mouse_CLK=1;for(i=0;i<8;i++){while(mouse_CLK==1);mouse_SDA=cmd&0x01;cmd>>=1;while(mouse_CLK==0);}while(mouse_CLK==1);mouse_SDA=pp; //发送奇偶校验位while(mouse_CLK==0);while(mouse_CLK==1);mouse_SDA=1;while(mouse_CLK==0);while(mouse_CLK==1);ACK=mouse_SDA; //接收应答位while(mouse_CLK==0);EX1=1;}void Init_mouse(void){host_to_mouse(0xf4);delayms(50);Init_ter();delayms(50);host_to_mouse(0xf3);delayms(50);host_to_mouse(0xc8);delayms(50);host_to_mouse(0xf3);delayms(50);host_to_mouse(0x64);delayms(50);host_to_mouse(0xf3);delayms(50);host_to_mouse(0x50);delayms(50);host_to_mouse(0xf2);delayms(200);mouse_data[0]=0;mouse_data[1]=0;mouse_data[2]=0;mouse_data[3]=0;move_x=10;move_y=0;move_z=0;}/*********************************************奇校检**********************************************/uchar Checkout(void){ACC=mouse_byte;if(~P==mouse_buffer[9])return 1;elsereturn 0;}/********************************************************* 数据分析及处理**********************************************************/ void data_analyse(void){//将收到的11位信号中截取8位数据放进mouse_bytemouse_byte_bit0=mouse_buffer[1];mouse_byte_bit1=mouse_buffer[2];mouse_byte_bit2=mouse_buffer[3];mouse_byte_bit3=mouse_buffer[4];mouse_byte_bit4=mouse_buffer[5];mouse_byte_bit5=mouse_buffer[6];mouse_byte_bit6=mouse_buffer[7];mouse_byte_bit7=mouse_buffer[8];if(Checkout())//如果校验正确{if(mouse_data_bit<4)mouse_data[mouse_data_bit++]=mouse_byte;if(mouse_data_bit==4){mouse_data_bit=0;if(mouse_data[0]&0x10)//如果"X sign bit"为1,表示鼠标向右左移{move_x-=(256-mouse_data[1]);//x坐标减if(move_x<=1)move_x=17;}else{move_x+=mouse_data[1];//x坐标加if(move_x>=17)move_x=2;}if(mouse_data[0]&0x20){move_y-=(256-mouse_data[2]);//y坐标减}else{move_y+=mouse_data[2];//y坐标加}if(mouse_data[3]&0x08){move_z-=(16-(mouse_data[3]&0x0f));}else{mouse_data[3]=mouse_data[3]&0x0f;move_z+=mouse_data[3]; //Z坐标加}}}}/**************************************************外部中断1***************************************************/void ReceiveData(void) interrupt 2{ led=0;if(mouse_buffer_bit<=10){while(mouse_CLK==0);//等待设备拉高时钟线mouse_buffer[mouse_buffer_bit++]=mouse_SDA;//接收数据}if(mouse_buffer_bit==10){data_analyse();//数据分析及处理mouse_buffer_bit=0;}}#endif////////////////////////////////主函数部分//////////////////////////////////////////////////// #include<reg51.h>#include"TM1638.h"#include"DS1302.h"#include"DELAY.h"#include"CHULI.h"#include"DISPLAY.h"void main(){delayms(500);init_TM1638();delayms(50);Init_DS1302(); //将1302初始化delay(500);while(1){read_date();delayms(50);}}/**********************************************/再来一个按键测试的程序:这个是另外的,与上面的无关;#ifndef _TM1638_H#define _TM1638_H#include <REGX51.H>#define DATA_COMMAND 0X40#define DISP_COMMAND 0x80#define ADDR_COMMAND 0XC0//引脚定义sbit DIO=P1^0;sbit CLK=P1^1;sbit STB=P1^2;unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71 ,0x40};void TM1638_Write(unsigned char DATA) //写数据函数{unsigned char i;for(i=0;i<8;i++){CLK=0;if(DATA&0X01)DIO=1;elseDIO=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;}unsigned char Read_key(void){unsigned char c[4],i,key_value=0;STB=0;TM1638_Write(0x42);for(i=0;i<4;i++)c[i]=TM1638_Read();STB=1; //4个字节数据合成一个字节for(i=0;i<4;i++)key_value|=c[i];for(i=0;i<4;i++)if(c[i]==key_value)break;return (i*8+key_value);}void Write_DATA(unsigned char add,unsigned char DA TA) //指定地址写入数据{Write_COM(0x44);STB=0;TM1638_Write(0xc0|add);TM1638_Write(DA TA);STB=1;}/*void Write_oneLED(unsigned char num,unsigned char flag) //单独控制一个LED函数,num 为需要控制的led序号,flag为0时熄灭,不为0时点亮{if(flag)Write_DATA(2*num+1,1);elseWrite_DATA(2*num+1,0);}void Write_allLED(unsigned char LED_flag) //控制全部LED函数,LED_flag表示各个LED状态{unsigned char i;for(i=0;i<8;i++){if(LED_flag&(1<<i))Write_DATA(2*i+1,3);elseWrite_DATA(2*i+1,0);}} */void init_TM1638(void){unsigned char i;Write_COM(0x8a);//亮度Write_COM(0x40);STB=0;TM1638_Write(0xc0);for(i=0;i<16;i++)TM1638_Write(0x00);STB=1;}#endif#include <at89x51.H>#include <tm1638.h>#include "555.h"unsigned char num[8]; //各个数码管显示的值unsigned char x=0xff;sbit key=P3^4;int main(void){init_TM1638();system_init();display(x);delay_ms(200);display1638();while(1){display1638();// detectkey();x=Read_key();display(~x);}}void display1638(){ uchar i;if(sec_flag|i){num[0]=hour/10;num[1]=hour%10;num[3]=minute/10;num[4]=minute%10;num[6]=second/10;num[7]=second%10;num[2]=16;num[5]=16;for(i=0;i<8;i++){Write_DATA(i*2,tab[num[i]]);}}}#ifndef _555_H#define _555_H#include<at89x51.h>#define uchar unsigned charvoid delay_ms(uchar);void display();void detectkey();void display1638();uchar code tap[10]={0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/};sbit key_hour=P3^5;sbit key_min=P3^6;uchar hour=12;uchar minute=0;uchar second=0;uchar flag=0;uchar sec_flag=0;/************************* 初始化程序**************************/ void system_init(){ TMOD=0x01;EA=1;ET0=1;EX0=1;IT0=1;TR0=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;}/************************* 定时器中断0中断处理程序**************************/ void int1_ISR() interrupt 1 {TH0=(65536-50000)/256;TL0=(65536-50000)%256;flag++;if(flag==20){sec_flag=1;second++;flag=0;}if(second==60){second=0;minute++;}if(minute==60){minute=0;hour++;hour%=24;}}/************************* 按键程序**************************/ void detectkey(){delay_ms(10);if(key_hour==0){hour++;hour=hour%24;while(!key_hour)display();}if(key_min==0){minute++;minute=minute%60;while(!key_min)display();}if(P3_7==0){hour=12;minute=0;second=0;while(!P3_5)display();}}/*************************显示程序**************************/void display(uchar i){P0=i;}/*************************延时处理程序**************************/void delay_ms(uchar no){uchar i,j;for(i=0;i<no;i++){for(j=0;j<164;j++);for(j=0;j<164;j++);}}#endif说明:按键值送P0接的LED显示。
tm1638驱动共阳数码管原理
tm1638驱动共阳数码管原理TM1638驱动共阳数码管是一种常见的数码管驱动方案。
在解释TM1638驱动共阳数码管的原理之前,我们先来了解什么是共阳数码管,以及TM1638是什么。
共阳数码管是一种常见的数码管类型,它由多个发光二极管(LED)组成,每个LED代表一个数字或字母。
共阳数码管通过共阳极(anode)进行驱动,在驱动时将对应的共阳极引脚接高电平(一般为Vcc),通过控制各个阴极(cathode)引脚的低电平(接地),来控制每个LED是否发光。
而TM1638则是一种专门用于驱动共阳数码管的芯片。
它是一种集成了控制逻辑、译码器、数据存储器和其他功能的数字驱动器。
TM1638芯片通过与微控制器进行通信,实现对共阳数码管的控制。
TM1638驱动共阳数码管的原理主要分为以下几个步骤:1.初始化:通过与微控制器通信,将TM1638芯片初始化为特定的驱动模式,以便与共阳数码管进行正确的配合。
2.设置显示内容:通过微控制器发送数据给TM1638芯片,来设置共阳数码管的显示内容。
数据可以是数字、字母、符号等,通过数据存储器和译码器来将发送的数据转换为对应的控制信号。
3.扫描刷新:TM1638芯片通过控制共阳极的引脚来进行扫描刷新操作。
它会按照一定的时间间隔以及顺序依次点亮每个共阳数码管的LED,从而实现多位共阳数码管的显示。
4.控制亮度:TM1638芯片还可以通过调整引脚的PWM信号来控制共阳数码管的亮度。
总的来说,TM1638驱动共阳数码管的原理是通过与微控制器进行通信,将要显示的数据发送给TM1638芯片,然后通过控制共阳极和引脚的状态来实现数码管的驱动和显示。
TM1638驱动共阳数码管在实际应用中具有一些优点。
首先,TM1638芯片集成了多个控制和驱动功能,简化了电路设计和布局。
其次,它支持兼容SPI和I2C两种通信接口,方便与各种微控制器进行连接。
再次,TM1638芯片提供了多种控制功能,比如可以设置亮度、自动扫描等,提高了用户对数码管显示的控制能力。
TM1638
11
11
11
11
11
11
11
LED 驱动控制专用电路
LSB
B3 B2 B1 B0
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
显示地址
00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH
GRID7 1
SEG1
GRID1 GRID2 GRID3 GRID4 GRID5 GRID6 GRID7
图(8)
A DPY Ba
Cf D
g
b
Ee
c
Fd
G [LEDgn]
SEG1
图8给出共阳数码管的连接示意图,如果让该数码管显示“0”,那你需要在GRID1,GRID2, GRID3,GRID4,GRID5,GRID6为低电平的时候让SEG1为高电平,在GRID7为低电平的时候让SEG1为 低电平。要向地址单元00H,02H,04H,06H,08H,0AH里面分别写数据01H,其余的地址单元全部 写数据00H。
图(2)
写LED显示数据的时候,按照从低位地址到高位地址,从字节的低位到高位操作;在运用中没有使 用到的SEG输出口,在对应的BIT地址位写0。
六、 键扫描和键扫数据寄存器:
键扫矩阵为8×3bit,如图(3)所示:
K3
K2
K1
KS1 KS2 KS3 KS4 KS5 KS6 KS7 KS8
图(3)
键扫数据储存地址如下所示,先发读键命令后,开始读取按键数据BYTE1—BYTE4字节,读数 据从低位开始输出;芯片K和KS引脚对应的按键按下时,相对应的字节内的 BIT位为1。
STM32F103 16路智能汇流箱数码管显示与按键交互状态图
按 键空 KE 闲 已循 Y2 按 5秒 下 环 显示 次数 遍 参数 2
上电/复位
循环显示 电压电流温度状态 ST1
数码管显示使能 显示计时器清零 重新计时
KE 下 按 Y2
系统参数显示、设 置状态 ST3
按下KEY2
循环显示 系统告警信息状态 ST2
按键空闲超过 设定时间后 按下任意键 KEY1/KEY2
切换到下一项显 示内容
切换到系统参数 显示、设置状态 ST3
ST3
按下KEY2
5秒内无按键
按下KEY1
各参数项都显 示2遍了吗 Yes
No
切换到下一个系统参数
放弃参数修改 切换到循环显示 电压电流温度状态 ST1
循环修改当前显示的参数的值 保存修改后的参数,然 后切换到循环显示 电压电流温度状态 ST1
数码管显示关闭
ST1
ST2
收到定时消息 KEY_TIMER
KEY1按下并 松开
按下KEY2
5秒内无按键
按下KEY1
按下KEY2
切换到下一项显示 内容
toggle当前显示的 实时参数(通过控制 KEY_TIMER消息 的使能实现)
切换到显示系统告 警信息状态ST2
切换到循环显示 电压电流温度状态 ST1
TM1638
GPIO_WriteLow(GPIOD, GPIO_PIN_1 );//使能stb
for(a=0;a<8;a++)
{
GPIO_WriteLow(GPIOD, GPIO_PIN_0 );// D0口时钟写低
writefloor_conf(0x66,0xc8);
writefloor_conf(0x6d,0xca);
writefloor_conf(0x7d,0xcc);
writefloor_conf(0x07,0xce);
}
}
/*********************************************************************************************
使用TM1638,实现1分钟秒表,精度10ms
*********************************************************************************************/
#include"stm8s.h"
GPIO_DeInit(GPIOB);
GPIO_Init(GPIOB, GPIO_PIN_LNIB, GPIO_MODE_OUT_PP_HIGH_FAST) ;//PB0输出数据
b=0x44;//01000100b,是写显存,固定地址方式
GPIO_WriteLow(GPIOD, GPIO_PIN_1 );//使能stb
{
u8 a,b;
GPIO_DeInit(GPIOD);
1632工作原理
1632工作原理笔记本电脑系统供电单元电路系统供电芯片型号有:一、美信产的用的最多的两个芯片MAX1632、MAX1635可以互换,它们的工作原理一样。
主要产生出3.3V 、5V 、12V电压。
二、MAX1631、MAX1634、MAX1904这三种芯片的工作原理与MAX1632 MAX1635差不多,但不能与MAX1632 MAX1635芯片互换。
说明:1、MAX1631、MAX1634、MAX1904互相可以代换。
2、MAX1631、1634、1904没有12V输出,这一点与MAX1632、1635不一样,如果MAX1631、1634、1904的板子上需要12V的话,一般是在5V输出的后级,电路中设计一个升压电路。
(参考升压电路一节)3、MAX1632、1635芯片上的12#、3#的反馈信号脚没有使用,但MAX1631、1634、1904还使用了这个反馈角。
4、4#、5#的定义与MAX1632、1635不一样。
三、MAX785 MAX786用于东芝的笔记本电脑PⅡ PⅢ较多。
四、LTC1628用于索尼、康柏的笔记本较多。
五、系统供电电路维修方法与经验小结:1、23#有总控制SHDN时?9#2.5V不正常或9#为0V时? 芯片坏或者18#、25#5V供激放供电没有查D1与D22、7# 28#应有5V高电平控制信号,有时为NQ送来,有时与21#相连,由21#5V电压作为控制信号用,还有的由键盘芯片送来。
注:7#与28#加上一个5V的控制信号,电路应该有正常3.3V或5V电压输出,如果还没有,一般是芯片损坏。
3、先不加电测对地阻值,首先测高端管是否击穿,供电负载是否击穿,如果是OΩ表明击穿短路了,如果有正常的几百欧阻值,但一加电就短路,表明是稳压二极管已经保护了,这是高端还管击穿的结果。
4、电源控制器芯片本身损坏的故障现象:①供电和控制都正常,但没有输出。
②待机状态下总供电正常,但一按开机键总供电瞬间短路。