中科因仑“3+1”工程特种兵精英论坛
标题: 单片机驱动数码管显示参考程序 [打印本页]
作者: XJzy 时间: 2015-9-25 13:15
标题: 单片机驱动数码管显示参考程序
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar led[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x00,0x90}; //数码管显示0-9的字节
uchar postion [6]={0x01,0x02,0x04,0x08,0x10,0x20}; // 数码管的为控制字节
uchar timer[3]; //时间的数组
uchar disbruff[6]; //保存每个数码管要显示的字节
/****************************************************************************
延时函数
****************************************************************************/
void delay_ms(uchar n)
{
unsignedint i,j,k;
for(i=0;i<n;i++)
{
for(k=0;k<4;k++)
{
for(j=0;j<10;j++);
}
}
}
/**************************************************************************
将要显示的时间数据经过timer——to——disbruff转换到disbruff[]内
**************************************************************************/
void timer_to_disbruff()
{
uchar i,A=0; //A=0importment
for(i=0;i<3;i++)
{
disbruff[A++]=timer%10; //取数据的各位
disbruff[A++]=timer/10 ; // 取数据的十位
}
}
/**************************************************************************
DS1302专用
**************************************************************************/
sbit sclk = P1^2; /*实时时钟时钟线引脚 */
sbit io = P1^1; /*实时时钟数据线引脚 */
sbit rst = P1^0; /*实时时钟复位线引脚 */
bdata uchar date_bruff;
sbit flag0=date_bruff^0;
sbit flag7=date_bruff^7;
uchar bcd_bruff[8];
/***************************************************************************
字节传送
功能:上升沿传送一个数据位的最低位
用途:用于字节的传送
****************************************************************************/
void inputbety (uchar ucdate)
{
uchar i;
date_bruff=ucdate; // 将要传送的数据赋值给date_bruff
for(i=0;i<8;i++) // 循环8次按位传送一个字节
{
io=flag0; // 将最低位赋值给io
sclk=1; // 触发上升沿传送一个位
sclk=0; // sclk变低准备下一个上升沿
date_bruff=date_bruff>>1;//数据移位将依次右移一位,依次传送0,1,2,3,4,5,6,7
}
}
/***************************************************************************
字节的读取
功能:上升沿读取一个数据的最低位
用途:用于读取字节
***************************************************************************/
uchar outputbety()
{
uchar j;
for(j=0;j<8;j++)
{
date_bruff=date_bruff>>1; //先右移一位准备接受读取的数据位
flag7=io; //把读取的数据赋值给date_bruff的第7位
sclk=1; //触发上升沿肚脐眼一个位
sclk=0; // 变低准备下一个上升沿
}
returndate_bruff; //返回读取的数据
}
/****************************************************************************
地址字节和数据的传送
功能:调用inputbety();先写地址,紧接着写地址内的数据
用途:配置DS1302的内部寄存器
****************************************************************************/
void wdate(uchar addr, uchar date)
{
rst=0; //变低为sclk变低允许
sclk=0; // 变低准备上升沿
rst=1; // 使能对ds1302进行操作
inputbety(addr);//写入地址
inputbety(date);//写入数据
sclk=1;
rst=0;
}
/***************************************************************************
数据的读取
功能:写写入要读取数据的地址和指令;然后调用output()
用途:用于读取ds1302的实时时间
***************************************************************************/
uchar rdate(uchar addrx)
{
uchar readdate;
rst=0;
sclk=0;
rst=1;
inputbety(addrx);//写入控制命令的字节和数据
readdate=outputbety();// 读取数据
sclk=1;
rst=0;
returnreaddate; // 返回数据
}
void initial_ds1302(void) //时钟芯片初始化
{
unsignedchar second=rdate(0x80);
if(second&0x80) //判断时钟芯片是否关闭
{
wdate(0x8e,0x00); //写入允许
wdate(0x8c,0x07); //以下写入初始化时间日期:07/07/25.星期: 3. 时间: 23:59:56
wdate(0x88,0x07);
wdate(0x86,0x15);
wdate(0x8a,0x07);
wdate(0x84,0x15);
wdate(0x82,0x52);
wdate(0x80,0x55);
wdate(0x8e,0x80); //禁止写入
}
}
void readds1302() //读取数据的BCD
{
uchar i;
for(i=0;i<7;i++)
{
bcd_bruff=rdate(0x81+2*i);// 依次读取数据存储在bcd_bruff数组内
}
}
/**********************************************************************************
将读取的BCD吗转换成能在数码管上显示的数据
******************************************************************************/
void bcd_to_timer()
{
uchar k;
for(k=0;k<3;k++)
{
timer[k]=((bcd_bruff[k]&0xf0)>>4)*10 + (bcd_bruff[k]&0x0f);
}
}
/*******************************************************************************
数码管的动态显示函数
*******************************************************************************/
void display()
{
uchar i;
for(i=0;i<6;i++)
{
P2=led[disbruff];
P3=postion;
delay_ms(5);
}
}
/********************************************************************************
主函数
*******************************************************************************/
voidmain()
{
timer[0]=0;
timer[1]=0;
timer[2]=0;
timer_to_disbruff();
initial_ds1302();
while(1)
{
readds1302();
bcd_to_timer();
timer_to_disbruff();
display();
};
}
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) |
Powered by Discuz! X3.4 |