1.数码管动态显示
数码管的静态显示
多个数码管只能显示一个数字
数码管的动态显示
一次只点亮一位,利用视觉暂留效应
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f//位码0xfe为1111 1110
共阳极给0输出
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//段码0xc0为1100 0000为abcdef为0
数码管动态显示代码
#include<reg52.h>
#define uchar unsigned char
#define BIT_ P1
#define SEG_ P2
uchar dspcom;//数码管扫描到的地方
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//段码
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码
void delay_ms(uchar z)
{uchar x,y;
for(x=z;x>0;x--)
for(y=60;y>0;y--);
}
void main()
{while(1){
P1=0xff;
for(dspcom=0;dspcom<8;dspcom++){
P1=wei[dspcom];
P2=tab[dspcom];
delay_ms(15);
}
}
}
三步工作:1.位码全灭2.点亮一位3.延时
c语言中P0P1,P要大写
位码,段码首先要全灭,不然有残影
uchar code tab[]数据保存在程序存储区,掉电数据不消失
2.ds1302时钟
//DS1302地址定义
#define ds1302_sec_add 0x80 //秒数据地址
#define ds1302_min_add 0x82 //分数据地址
#define ds1302_hr_add 0x84 //时数据地址
#define ds1302_date_add 0x86 //日数据地址
#define ds1302_month_add 0x88 //月数据地址
#define ds1302_day_add 0x8a //星期数据地址
#define ds1302_year_add 0x8c //年数据地址
#define ds1302_control_add 0x8e //控制数据地址
mian.c,ds1302组件见另一篇文章
#include <reg52.h>
#include <intrins.h>
#include "ds1302.h"
#define uchar unsigned char
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//段码
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码
uchar dspbuf[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//显示缓冲
void ds1302init();
void display();//数码管显示
void daytime();
uchar dspcom;//数码管扫描到的地方
uchar h,m,s;//1302时分秒
void main()
{
ds1302init();
EA=1;
ET0=1;
while(1)
{
h=Read_Ds1302(0x85);
m=Read_Ds1302(0x83);
s=Read_Ds1302(0x81);
daytime();
}
}
void daytime()//白天
{
ET0=1;
dspbuf[0]=tab[h/16];
dspbuf[1]=tab[h%16];
dspbuf[2]=tab[11];
dspbuf[3]=tab[m/16];
dspbuf[4]=tab[m%16];
dspbuf[5]=tab[11];
dspbuf[6]=tab[s/16];
dspbuf[7]=tab[s%16];
display();}
void display()
{P1=0XFF;
P2=dspbuf[dspcom];
P1=wei[dspcom];
if(++dspcom==8)
dspcom=0;
}
void ds1302init()//1302初始化
{ Write_Ds1302(0x8e,0x00);//关闭保护,wp=0时才能进行对其他寄存器的写操作 (wp000000)
Write_Ds1302(0x80,0x00);//秒
Write_Ds1302(0x82,0x59);//分
Write_Ds1302(0x84,0x06);//时
Write_Ds1302(0x8e,0x90);//开启保护 ,wp=1时写保护位(初始状态)
}
工作:1.调用1302初始化设置时间(设定)2.读入时间(读)
3.dspbuf赋值后,输出数码管显示(显)