TM1638芯片+DS1302驱动共阴数码管时钟.docx

上传人:小飞机 文档编号:3167065 上传时间:2023-03-11 格式:DOCX 页数:21 大小:43.20KB
返回 下载 相关 举报
TM1638芯片+DS1302驱动共阴数码管时钟.docx_第1页
第1页 / 共21页
TM1638芯片+DS1302驱动共阴数码管时钟.docx_第2页
第2页 / 共21页
TM1638芯片+DS1302驱动共阴数码管时钟.docx_第3页
第3页 / 共21页
TM1638芯片+DS1302驱动共阴数码管时钟.docx_第4页
第4页 / 共21页
TM1638芯片+DS1302驱动共阴数码管时钟.docx_第5页
第5页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《TM1638芯片+DS1302驱动共阴数码管时钟.docx》由会员分享,可在线阅读,更多相关《TM1638芯片+DS1302驱动共阴数码管时钟.docx(21页珍藏版)》请在三一办公上搜索。

1、TM1638芯片+DS1302驱动共阴数码管时钟一、 概述 二、 51单片机 ,TM1638芯片+DS1302驱动共阴数码管时钟,最后包括按键检测程序 TM1638是带键盘扫描接口的LED驱动控制专用电路,内部集 成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。主要应用于冰箱、 空调 、家庭影院等产品的高段位显示屏驱动。 二、 特性说明 采用功率CMOS 工艺 显示模式 10 段8 位 键扫描 辉度调节电路 串行接口 振荡方式:RC 振荡 内置上电复位电路 采用SOP28封装 三、 管脚定 义:电路图数码管: 程序代码: /* TM1638.H头文件 */ #ifndef

2、_TM1638_H #define _TM1638_H /引脚定义 sbit DIO=P10; sbit CLK=P11; sbit STB=P12; void TM1638_Write(unsigned char DATA) /写数据函数 unsigned char i; for(i=0;i=1; CLK=1; /*unsigned char TM1638_Read(void) /读数据函数 unsigned char i; unsigned char temp=0; DIO=1; /设置为输入 for(i=0;i=1; CLK=0; if(DIO) temp|=0x80; CLK=1; r

3、eturn 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(0x

4、40); /写 数据命令 STB=0; TM1638_Write(0xc0); /写地址命令 for(i=0;i16;i+) TM1638_Write(0x00); STB=1; #endif /*DS1302.H头文件*/ #ifndef DS1302_H #define DS1302_H #define uchar unsigned char #define uint unsigned int #includeDELAY.h sbit acc0=ACC0; /移位时的第0位 sbit acc7=ACC7; /移位时用的第7位 uchar second,minute,hour,day,mon

5、th,year,week,count=0; uchar ReadValue,num,time; sbit SCLK=P20; sbit DATA=P21; sbit RST=P22; void Write1302(uchar dat) uchar i; SCLK=0; /拉低SCLK,为脉冲上升沿写入数据做好准备 delay1(2); /稍微等待,使硬件做好准备 for(i=0;i=1; /将dat的各数据位右移1位,准备写入下一个数据位 void WriteSet1302(uchar Cmd,uchar dat) RST=0; /禁止数据传递 SCLK=0; /确保写数居前SCLK被拉低 R

6、ST=1; /启动数据传输 delay1(2); /稍微等待,使硬件做好准备 Write1302(Cmd); /写入命令字 Write1302(dat); /写数据 SCLK=1; /将时钟电平置于已知状态 RST=0; /禁止数据传递 uchar Read1302(void) uchar i,dat; delay(2); /稍微等待,使硬件做好准备 for(i=0;i=1; /将dat的各数据位右移1位,因为先读出的是字节的最低位 if(DATA=1) /如果读出的数据是1 dat|=0x80; /将1取出,写在dat的最高位 SCLK=1; /将SCLK置于高电平,为下降沿读出 delay

7、1(2); /稍微等待 SCLK=0; /拉低SCLK,形成脉冲下降沿 delay1(2); /稍微等待 return dat; /将读出的数据返回 uchar ReadSet1302(uchar Cmd) uchar dat; RST=0; /拉低RST SCLK=0; /确保写数居前SCLK被拉低 RST=1; /启动数据传输 Write1302(Cmd); /写入命令字 dat=Read1302; /读出数据 SCLK=1; /将时钟电平置于已知状态 RST=0; /禁止数据传递 return dat; /将读出的数据返回 void Init_DS1302(void) WriteSet1

8、302(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); /根据写月

9、寄存器命令字,写入月的初始值 WriteSet1302(0x8c,(10/10)4|(11%10); /nian WriteSet1302(0x8a,(0/10)4|(0%10); WriteSet1302(0x8E,0x80); /根据写状态寄存器命令字,写入保护指令 #endif /*显示头文件*/ #includeTM1638.h uchar data DisBuffer8=0,0,0,0,0,0,0,0; /*显示缓存区*/ /各个数码管显示的值 uchar code tab=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,

10、0x7C,0x39,0x5E,0x79,0x71,0x40,0xef; void display1638(uchar hour,uchar minute,uchar second) uchar i; DisBuffer0=hour/10; DisBuffer1=hour%10; DisBuffer3=minute/10; DisBuffer4=minute%10; DisBuffer6=second/10; DisBuffer7=second%10; DisBuffer2=16; DisBuffer5=16; for(i=0;i8;i+) Write_DATA(i*2,tabDisBuffer

11、i); void DisplayHour(newval) DisBuffer0=newval/10; DisBuffer1=newval%10; for(i=0;i4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x83); minute=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x85); hour=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x87); day

12、=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x89); month=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x8d); year=(ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue=ReadSet1302(0x8b); /读星期 week=ReadValue&0x07; display1638(hour,minute,second) ; void turn_v

13、al(char newval,uchar flag,uchar newaddr,uchar s1num) newval=ReadSet1302(newaddr); /读取当前时间 newval=(newval&0x70)4)*10+(newval&0x0f); 十进制 if(flag) /判断是加一还是减一 newval+; switch(s1num) case 1: if(newval99) newval=0; DisplayYear(newval); break; case 2: if(newval12) newval=1; DisplayMonth(newval); break; cas

14、e 3: if(newval31) newval=1; DisplayDay(newval); break; case 4: if(newval6) newval=0; DisplayWeek(newval); break; case 5: if(newval23) newval=0; DisplayHour(newval); break; case 6: if(newval59) newval=0; DisplayMinute(newval); break; case 7: if(newval59) newval=0; DisplaySecond(newval); break; defaul

15、t:break; else newval-; switch(s1num) case 1: if(newval=0) newval=99; /将bcd码转换成 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(newval0) newval=6; DisplayWeek(newval); break; case 5: if(newv

16、al0) newval=23; DisplayHour(newval); break; case 6: if(newval0) newval=59; DisplayMinute(newval); break; case 7: if(newval0) 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,tab16); del

17、ay(100); Write_DATA(com,tabdat); 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_xz) delayms(10); turn_val(year,1,0x8d,1); if(zmove_x) delayms(10); turn_val(year,0,0x8d,1); if(mouse_data0&0x01) while(mous

18、e_data0&0x01); flag=1; move_x=3; z=move_x; break; / if(move_x=4)&(move_xz) delayms(10); turn_val(month,1,0x89,2); if(zmove_x) delayms(10); turn_val(month,0,0x89,2); if(mouse_data0&0x01) while(mouse_data0&0x01); flag=1; move_x=5; z=move_x; break; / if(move_x=6)&(move_xz) delayms(10); turn_val(day,1,0

19、x87,3); if(zmove_x) delayms(10); turn_val(day,0,0x87,3); if(mouse_data0&0x01) while(mouse_data0&0x01); flag=1; move_x=7; z=move_x; break; / if(move_x=8)&(move_xz) delayms(10); turn_val(week,1,0x8b,4); if(zmove_x) delayms(10); turn_val(week,0,0x8b,4); if(mouse_data0&0x01) while(mouse_data0&0x01); fla

20、g=1; move_x=9; z=move_x; break; */ / if(move_x=10)&(move_xz) delayms(10); turn_val(hour,1,0x85,5); if(zmove_x) delayms(10); turn_val(hour,0,0x85,5); if(mouse_data0&0x01) while(mouse_data0&0x01); flag=1; move_x=11; z=move_x; break; / if(move_x=12)&(move_xz) delayms(10); turn_val(minute,1,0x83,6); if(

21、zmove_x) delayms(10); turn_val(minute,0,0x83,6); if(mouse_data0&0x01) while(mouse_data0&0x01); flag=1; move_x=13; z=move_x; break; /写入分寄存器/写入分寄存器 / if(move_x=14)&(flag=0) write_com(0xc7); if(mouse_data0&0x01) while(mouse_data0&0x01); while(1) z=move_x; write_com(0xc7); if(move_xz) delayms(10); turn_

22、val(second,1,0x81,7); if(zmove_x) delayms(10); turn_val(second,0,0x81,7); if(mouse_data0&0x01) while(mouse_data0&0x01); flag=1; move_x=15; z=move_x; break; / if(mouse_data0&0x01)&(z!=move_x) flag=0; while(mouse_data0&0x01); / if(mouse_data0&0x01)&(flag=1)&(z=move_x) flag=0; delayms(300); miao=ReadSe

23、t1302(0x81); second=miao; WriteSet1302(0x80,second&0x7f); write_com(0x0c) ; WriteSet1302(0x8E,0x80); /根据写状态寄存器命令字,写入不保护指令 break; #endif /*鼠标芯片*/ #ifndef PS2_H #define PS2_H #includeDELAY.h sbit mouse_SDA=P34;/数据线P3_5 计数器0输入端口 sbit mouse_CLK=P33;/时钟线P3_3 外部中断1输入端口 sbit led=P36; bit pp=0; bit ACK=0; u

24、char bdata mouse_byte; /接收字节 bdata-可寻址的片内RAM sbit mouse_byte_bit0=mouse_byte0;/mouse_byte第0位 sbit mouse_byte_bit1=mouse_byte1;/mouse_byte第1位 sbit mouse_byte_bit2=mouse_byte2;/mouse_byte第2位 sbit mouse_byte_bit3=mouse_byte3;/mouse_byte第3位 sbit mouse_byte_bit4=mouse_byte4;/mouse_byte第4位 sbit mouse_byte

25、_bit5=mouse_byte5;/mouse_byte第5位 sbit mouse_byte_bit6=mouse_byte6;/mouse_byte第6位 sbit mouse_byte_bit7=mouse_byte7;/mouse_byte第7位 uchar mouse_buffer11;/接收位数据缓冲区 uchar mouse_buffer_bit=0;/mouse_buffermouse_buffer_bit uchar mouse_data4;/接收鼠标数据缓冲区,分别存放:功能信息字节,x位移量,y位移量 uchar mouse_data_bit=0;/mouse_data

26、mouse_data_bit uchar move_x;/存放横坐标 uint move_y;/存放纵坐标 uchar move_z; extern uchar move_x; /* 发送数据 */ void Init_ter(void) EA=1; /开放中断 EX1=1;/允许外部中断1 PX1=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=1; while(mouse_CLK=0); while(mouse_CLK=1); mouse_SDA=pp; /发送奇偶校验位 while(mouse_CLK=0); while(mouse_CLK=1); mouse_SDA=1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号