
二、51单片机 ,TM1638芯片+DS1302驱动共阴数码管时钟,最后包括按键检测程序(是分开的。)
TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集
成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。主要应用于冰箱、
空调 、家庭影院等产品的高段位显示屏驱动。
二、 特性说明
• 采用功率CMOS 工艺
• 显示模式 10 段×8 位
• 键扫描(8×3bit)
• 辉度调节电路(占空比8 级可调)
• 串行接口(CLK,STB,DIO)
• 振荡方式:RC 振荡(450KHz+5%)
• 内置上电复位电路
• 采用SOP28封装
三、、 管脚定义:
电路图数码管:
程序代码:
/*************** TM1638.H头文件 *******************/
#ifndef
#define
//引脚定义
sbit
sbit
sbit
//写一个8Bit数据
void TM1638_Write(unsigned char 写数据函数
{
}
/*unsigned char TM1638_Read(void) 读数据函数
{
设置为输入
}
void Write_COM(unsigned char cmd) //发送命令字
{
写命令
}
void Write_DATA(unsigned char add,unsigned char DATA) 指定地址写入数据
{
//地址高位为1:11** ****,写地址
}
void init_TM1638(void)
{
8a);//亮度
//写 数据命令,写数据到显示寄存器
写地址命令
}
#endif
/***************************DS1302.H头文件***************************/
#ifndef DS1302_H
#define DS1302_H
#define uchar unsigned char
#define uint unsigned int
#include"DELAY.h"
s移位时的第0位
s移位时用的第7位
sbit DATA=P2^1;
void Write1302(uchar dat)
{
uchar i;
拉低SCLK,为脉冲上升沿写入数据做好准备
稍微等待,使硬件做好准备
连续写8个二进制位数据
取出dat的第0位数据写入1302
delay(2); //稍微等待,使硬件做好准备
SCLK=1; //上升沿写入数据
delay1(2); //稍微等待,使硬件做好准备
SCLK=0; //重新拉低SCLK,形成脉冲
将dat的各数据位右移1位,准备写入下一个数据位
}
void WriteSet1302(uchar Cmd,uchar dat)
{
RST=0; //禁止数据传递
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
delay1(2); //稍微等待,使硬件做好准备
写入命令字
写数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
}
uchar Read1302(void)
{
delay(2); //稍微等待,使硬件做好准备
连续读8个二进制位数据
将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1) //如果读出的数据是1
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
稍微等待
将读出的数据返回
}
uchar ReadSet1302(uchar Cmd)
{
uchar dat;
拉低RST
确保写数居前SCLK被拉低
启动数据传输
写入命令字
读出数据
将时钟电平置于已知状态
禁止数据传递
将读出的数据返回
}
void Init_DS1302(void)
{
WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
根据写秒寄存器命令字,写入秒的初始值
根据写分寄存器命令字,写入分的初始值
根据写小时寄存器命令字,写入小时的初始值
根据写日寄存器命令字,写入日的初始值
根据写月寄存器命令字,写入月的初始值
8c
8a,((0/10)<<4|(0%10)));
WriteSet1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令
}
#endif
/***************显示头文件*******************************/
#include"TM1638.h"
u显示缓存区*/ 各个数码管显示的值
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)
}
void DisplayHour(newval)
{
}
#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);
0F);
0F);
0F);
0F);
0F);
0F);
读星期
}
void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num)
newval=ReadSet1302(newaddr); //读取当前时间
0f)将bcd码转换成十进制
if(flag) //判断是加一还是减一
DisplayYear(newval);
将新数据写入寄存器
void write_flsh(uchar com,uchar dat)
{
}
void sp2_mouse(void)
{
///////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
8a);
8a);
///////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
写入分寄存器
写入分寄存器
////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
7f);
0c) ;
根据写状态寄存器命令字,写入不保护指令
}
#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-->可寻址的片内RAM
sbit 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)
{
开放中断
允许外部中断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);
}
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(0x);
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)
{
}
/*********************************************************
数据分析及处理
**********************************************************/
{
将收到的11位信号中截取8位数据放进mouse_byte
如果校验正确
如果"X sign bit"为1,表示鼠标向右左移
坐标减
坐标加
坐标减
坐标加
0f));
0f;
坐标加
}
/**************************************************
外部中断1
***************************************************/
void ReceiveData(void) interrupt 2
{
等待设备拉高时钟线
接收数据
数据分析及处理
}
#endif
////////////////////////////////主函数部分////////////////////////////////////////////////////
#include #include"TM1638.h" #include"DS1302.h" #include"DELAY.h" #include"CHULI.h" #include"DISPLAY.h" void main() { 将1302初始化 } /**********************************************/ 再来一个按键测试的程序:这个是另外的,与上面的无关; #ifndef #define #include #define #define #define //引脚定义 sbit sbit sbit 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 写数据函数 { } unsigned char TM1638_Read(void) 读数据函数 { 设置为输入 } void Write_COM(unsigned char cmd) 发送命令字 { } unsigned char Read_key(void) { //读取键盘值 个字节数据合成一个字节 } void Write_DATA(unsigned char add,unsigned char DATA) 指定地址写入数据 { } /*void Write_oneLED(unsigned char num,unsigned char flag) 单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮 { } void Write_allLED(unsigned char LED_flag) 控制全部LED函数,LED_flag表示各个LED状态 { } void init_TM1638(void) { 8a);//亮度 } #endif #include #include #include unsigned char num[8]; 各个数码管显示的值 unsigned char x=0xff; sbit key=P3^4; int main(void) { } void display1638() { } #ifndef #define #include #define uchar unsigned char void delay_ms(uchar); void display(); void detectkey(); void display1638(); uchar code tap[10]={ }; 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() { } /************************* 定时器中断0中断处理程序 **************************/ void int1_ISR() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; } /************************* 按键程序 **************************/ void detectkey() { } /************************* 显示程序 **************************/ void display(uchar i) { P0=i; } /************************* 延时处理程序 **************************/ void delay_ms(uchar no) { } #endif 说明:按键值送P0接的LED显示。其过程不影响数码管显示时间。 希望对各位有帮助!
