数码管时钟显示C程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* 数码管时钟显示led移动C 程序
使用共阳极数码管
*/
#include<>
#include<>
#define uint unsigned int
#define uchar unsigned char
sbit wela1 = P2^0; 果要显示1~8数值,最好多加前后两位数0跟9, 因为后面++移位时就能按我们常规顺序亮下去,至于如何显示对应数值请先看数码显示电路图*/
uchar code tablew[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}; 如果要显示,也会因为++而在第二轮中显示出*/
duan=1; //开启段显端
P0=tabled[numd];//附段显P0值对应段显值对码表
duan=0; //锁存
wei=1; //开启位显端
P0=tablew[numw];//附位显P0值对应位显值对码表
wei=0; //锁存
numw++; //相当于位显移位
if(numw==8) //如果位显值到对应位显对码表第八位则转下执行
numw=0; //重新附值位显值对应对码表第0位起
/*
下面是简单的单个数码管显示例证第一骤, 修改后在第三步骤内
#include""
#include""
sbit duan=P2^6; //段显端口
sbit wei=P2^7; //位显端口
void main()
{
//P0=0xff; 数码管不显示任何信号,默认情况下通电本身就不显示,可以不写
duan=1; //开启段显端口
P0=0x06; //附值段显数值为1,可以查阅数码管电路图相对应显示的对码表
duan=0; //锁存,保持上一步段显状态,硬件说明请查阅74HC573功能
wei=1; //开启位显端口
P0=0xfe; //附值位显位置,01111111,左边第一位,为0的显示
wei=0; //锁存,保持上一步位显状态,硬件说明请查阅74HC573功能
}
*/
}
}
}
void timer0() interrupt 1 /*第四步骤,中断时间函数这个相当于移位数显的速度,速度够快,人眼就会有余辉效应,
感觉8位数显一直在亮着,相当于正在播放的电影胶卷*/
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}
/*
以上有什么地方还需要改进的还请老师明示
*/
//**作者:胡甲如需转载请注明出处**//
//**湖北工业大学工程技术学院通信专业**//
//**单片机SST89E58RD 8位共阳数码管12M晶振**// //*******P0段选,P2位选*******//
//********2008年12月1号********//
#include ""
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; uchar n;
uchar hh,mm,ss;
uchar nhh,nmm,nss;
uint year;
uchar day,mon,week;
uchar hhs,hhg,mms,mmg,sss,ssg;
uchar days,dayg,mons,mong;
uchar nhhs,nhhg,nmms,nmmg,nsss,nssg;
uchar set1=1,set2=1;
sbit fm=P3^2;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年
uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年
void jishi();
void baoshi();
void alarm();
void set_time();
void set_alarm();
void set_mdw();
void key_change();
void key_set();
void delay(int m) //延时程序,延时m*
{
uint i;
uint j;
for (i=0;i { for(j=0;j<500;j++){} } } void timer0() interrupt 1 { TMOD=0x01; TH0=0x3c; TL0=0xb1; n++; jishi(); } main() { TMOD=0x01; TH0=0x3c; TL0=0xb1; TR0=1; EA=1; ET0=1; hh=12;mm=00;ss=00; nhh=7;nmm=30;nss=0; year=2008;mon=12;day=1;week=1; while(1) { hhs=hh/10%10;//时分秒 hhg=hh%10; mms=mm/10%10; mmg=mm%10; sss=ss/10%10; ssg=ss%10; nhhs=nhh/10%10;//闹钟 nhhg=nhh%10; nmms=nmm/10%10; nmmg=nmm%10; nsss=nss/10%10; nssg=nss%10; days=day/10%10;//月日 dayg=day%10; mons=mon/10%10; mong=mon%10; key_change(); //k1按键扫描 key_set(); //k2按键扫描 set_time(); //设置时间 set_mdw(); //设置月日星期 set_alarm(); //设置闹钟 if(set1==1) //正常走时显示 { P0=tab[hhs];P2_7=0;delay(1);P2_7=1;//时十位P0=tab[hhg];P2_5=0;delay(1);P2_5=1;//时个位P0=tab[10];P2_3=0;delay(1);P2_3=1;//"-" P0=tab[mms];P2_1=0;delay(1);P2_1=1;//分十位P0=tab[mmg];P2_6=0;delay(1);P2_6=1;//分个位P0=tab[10];P2_4=0;delay(1);P2_4=1;//"-" P0=tab[sss];P2_2=0;delay(1);P2_2=1;//秒十位P0=tab[ssg];P2_0=0;delay(1);P2_0=1;//秒个位}