📄 dy1clock_v1.01.c
字号:
/**************************************************************************
* 标题: 一位数码时钟
* 作者: 杜洋
* 日期: 2009.4.26
* 软件: Keil C51
* 芯片: STC12C2052
* 说明: 用一位数码LED管显示时钟
* 日志:
20090426 首次完成,代码有一些笨重,不过基本的显示和调时功能已经实现。
20090428 修改了一些BUG,主要是显示样式和操作方面的。
**************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sbit leda1 = P1 ^ 4;//
sbit leda2 = P1 ^ 3;//
sbit ledb1 = P1 ^ 1;//
sbit ledb2 = P1 ^ 0;//
sbit ledc1 = P3 ^ 5;//
sbit ledc2 = P3 ^ 4;//
sbit ledd1 = P3 ^ 2;//
sbit ledd2 = P3 ^ 3;//
sbit lede1 = P3 ^ 0;//
sbit lede2 = P3 ^ 1;//
sbit ledf1 = P1 ^ 6;//
sbit ledf2 = P1 ^ 7;//
sbit ledg1 = P1 ^ 5;//
sbit ledg2 = P1 ^ 2;//
sbit key1 = P1 ^ 4;//
sbit key2 = P1 ^ 3;//
uchar data sec = 0; // 秒计数器(00s-59s)
uchar data min = 1; // 分计数器(00m-59m)
uchar data hou = 2; // 时计数器)00h-23h)
uchar data cou = 0; // 软计数器,对10ms时基信号累加到1s
uchar data key_v = 0; // 存储键值
uchar data key_t = 0; // 按键扫描中临时存储键值
uchar data MENU = 0; //
uchar data SP_DIS = 100; //
#define SP2 1300 //数字之间的停留时间
#define SP3 10000 //一个循环显示结束后的间隔时间
#define SP4 2000 //分隔点的显示时间
/**********************************************************************************************/
void tiem0(void) interrupt 1 // T/C0中断服务程序(产生10ms时基信号)
{
cou++; // 软计数器加1
if(cou > 99) // 计数值到100(1s)
{
cou = 0; // 软计数器清零
sec++; // 秒计数器加1(进位10ms*100=1s)
if(sec > 59) // 秒计数值到60
{
sec = 0; // 秒计数器清零
min++; // 分计数器加1(进位60s=1m)
if(min > 59) // 分计数到60
{
min = 0; // 分计数器清零
hou++; // 时计数器加1(进位60m=1h)
if(hou > 23) // 时计数到23
hou = 0; // 时计数器清零
}
}
}
TH0 = 0xd8; // 重置定时常数
TL0 = 0xf0;
}
/**********************************************************************************************/
void delay_ms(unsigned int a){//-延时函数 1MS/次
unsigned char i;
while( --a != 0){
for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
} //i 从0加到125,CPU大概就耗时1毫秒
}
void delay_P1(void){ //
delay_ms(SP_DIS);
}
void delay_P2(void){ //
delay_ms(SP2);
}
/**********************************************************************************************/
void displayN(void){ //
ledc2=1;delay_P1();ledd2=1;delay_P1();
ledc1=1;delay_P1();ledd1=1;delay_P1();
lede2=1;delay_P1();ledg2=1;delay_P1();
lede1=1;delay_P1();ledg1=1;delay_P1();
ledb2=1;delay_P1();
ledb1=1;delay_P1();ledf2=1;delay_P1();
leda2=1;delay_P1();ledf1=1;delay_P1();
leda1=1;
}
void displayN2(void){ //
ledc2=1;ledd2=1;
ledc1=1;ledd1=1;
lede2=1;ledg2=1;
lede1=1;ledg1=1;
ledb2=1;ledb1=1;ledf2=1;
leda2=1;ledf1=1;leda1=1;
}
void display1(void){ //笔画1
ledb1=0;delay_P1();ledb2=0;delay_P1();
ledc1=0;delay_P1();ledc2=0;delay_P1();
leda1=1;leda2=1;
ledd1=1;ledd2=1;
lede1=1;lede2=1;
ledf1=1;ledf2=1;
ledg1=1;ledg2=1;
}
void display2(void){ //
leda1=0;delay_P1();leda2=0;delay_P1();
ledb1=0;delay_P1();ledb2=0;delay_P1();
ledg2=0;delay_P1();ledg1=0;delay_P1();
lede1=0;delay_P1();lede2=0;delay_P1();
ledd1=0;delay_P1();ledd2=0;delay_P1();
ledc1=1;ledc2=1;
ledf1=1;ledf2=1;
}
void display3(void){ //
leda1=0;delay_P1();leda2=0;delay_P1();
ledb1=0;delay_P1();ledb2=0;delay_P1();
ledg1=0;delay_P1();ledg2=0;delay_P1();
ledc1=0;delay_P1();ledc2=0;delay_P1();
ledd2=0;delay_P1();ledd1=0;delay_P1();
lede1=1;lede2=1;
ledf1=1;ledf2=1;
}
void display4(void){ //
ledf1=0;delay_P1();ledf2=0;delay_P1();
ledg1=0;delay_P1();ledg2=0;delay_P1();
ledb1=0;delay_P1();ledb2=0;delay_P1();
ledc1=0;delay_P1();ledc2=0;delay_P1();
leda1=1;leda2=1;
ledd1=1;ledd2=1;
lede1=1;lede2=1;
}
void display5(void){ //
leda2=0;delay_P1();leda1=0;delay_P1();
ledf1=0;delay_P1();ledf2=0;delay_P1();
ledg1=0;delay_P1();ledg2=0;delay_P1();
ledc1=0;delay_P1();ledc2=0;delay_P1();
ledd2=0;delay_P1();ledd1=0;delay_P1();
ledb1=1;ledb2=1;
lede1=1;lede2=1;
}
void display6(void){ //
leda2=0;delay_P1();leda1=0;delay_P1();
ledf1=0;delay_P1();ledf2=0;delay_P1();
lede1=0;delay_P1();lede2=0;delay_P1();
ledd1=0;delay_P1();ledd2=0;delay_P1();
ledc2=0;delay_P1();ledc1=0;delay_P1();
ledg2=0;delay_P1();ledg1=0;delay_P1();
ledb1=1;ledb2=1;
}
void display7(void){ //
leda1=0;delay_P1();leda2=0;delay_P1();
ledb1=0;delay_P1();ledb2=0;delay_P1();
ledc1=0;delay_P1();ledc2=0;delay_P1();
ledd1=1;ledd2=1;
lede1=1;lede2=1;
ledf1=1;ledf2=1;
ledg1=1;ledg2=1;
}
void display8(void){ //
ledb2=0;delay_P1();ledb1=0;delay_P1();
leda2=0;delay_P1();leda1=0;delay_P1();
ledf1=0;delay_P1();ledf2=0;delay_P1();
ledg1=0;delay_P1();ledg2=0;delay_P1();
ledc1=0;delay_P1();ledc2=0;delay_P1();
ledd2=0;delay_P1();ledd1=0;delay_P1();
lede2=0;delay_P1();lede1=0;delay_P1();
}
void display9(void){ //
ledb2=0;delay_P1();ledb1=0;delay_P1();
leda2=0;delay_P1();leda1=0;delay_P1();
ledf1=0;delay_P1();ledf2=0;delay_P1();
ledg1=0;delay_P1();ledg2=0;delay_P1();
ledc1=0;delay_P1();ledc2=0;delay_P1();
ledd2=0;delay_P1();ledd1=0;delay_P1();
lede1=1;lede2=1;
}
void display0(void){ //
ledf1=0;delay_P1();ledf2=0;delay_P1();
lede1=0;delay_P1();lede2=0;delay_P1();
ledd1=0;delay_P1();ledd2=0;delay_P1();
ledc2=0;delay_P1();ledc1=0;delay_P1();
ledb2=0;delay_P1();ledb1=0;delay_P1();
leda2=0;delay_P1();leda1=0;delay_P1();
ledg1=1;ledg2=1;
}
/**********************************************************************************************/
void turn(uchar i){
switch (i){//
case 1://
display1();
break;//
case 2://
display2();
break;//
case 3://
display3();
break;//
case 4://
display4();
break;//
case 5://
display5();
break;//
case 6://
display6();
break;//
case 7://
display7();
break;//
case 8://
display8();
break;//
case 9://
display9();
break;//
case 0://
display0();
break;//
}
}
/**********************************************************************************************/
void main(void){
TMOD = 0x11; // 定时/计数器0,1工作于方式1
TH0 = 0xd8; // 预置定时常数55536(d8f0),产生10ms时基信号
TL0 = 0xf0;
EA = 1; // 开总中断
ET0 = 1; // 定时/计数器0允许中断
TR0 = 1; // 开闭定时/计数器0
while(1){
unsigned char a,b;
if(MENU == 0){
SP_DIS = 150;
turn(hou/10);
delay_P2();
displayN();
delay_P2();
turn(hou%10);
delay_P2();
displayN();
delay_P2();
ledb2 = 0; ledc2 = 0;
delay_ms(SP4);
ledb2 = 1; ledc2 = 1;
delay_P2();
turn(min/10);
delay_P2();
displayN();
delay_P2();
turn(min%10);
delay_P2();
displayN();
if(key1 == 0 && key2 == 1){
delay_ms(200);//去抖
if(key1 == 0 && key2 == 1){
MENU = 1;
while(key1 == 0 || key2 == 0){ ledg1 = 0;ledg2 = 0; }
}
}else{
delay_ms(SP3);
}
}
/**********************************************************************************************/
if(MENU == 1){
SP_DIS = 1;
turn(hou/10);
displayN2();
if(key1 == 0 && key2 == 1){
delay_ms(200);//去抖
if(key1 == 0 && key2 == 1){
MENU = 2;
}
}
if(key2 == 0 && key1 == 1){
delay_ms(200);//去抖
if(key2 == 0 && key1 == 1){
a = hou/10;
b = hou%10;
a++;
if(a > 2){
a = 0;
}
hou = a*10 + b;
}
}
while(key1 == 0 || key2 == 0){ }
}
/**********************************************************************************************/
if(MENU == 2){
turn(hou%10);
displayN2();
if(key1 == 0 && key2 == 1){
delay_ms(200);//去抖
if(key1 == 0 && key2 == 1){
MENU = 3;
}
}
if(key2 == 0 && key1 == 1){
delay_ms(200);//去抖
if(key2 == 0 && key1 == 1){
a = hou/10;
b = hou%10;
b++;
if(b > 9){
b = 0;
}
if(a > 1){
if(b > 3){
b = 0;
}
}
hou = a*10 + b;
}
}
while(key1 == 0 || key2 == 0){ }
}
/**********************************************************************************************/
if(MENU == 3){
turn(min/10);
displayN2();
if(key1 == 0 && key2 == 1){
delay_ms(200);//去抖
if(key1 == 0 && key2 == 1){
MENU = 4;
}
}
if(key2 == 0 && key1 == 1){
delay_ms(200);//去抖
if(key2 == 0 && key1 == 1){
a = min/10;
b = min%10;
a++;
if(a > 5){
a = 0;
}
min = a*10 + b;
}
}
while(key1 == 0 || key2 == 0){ }
}
/**********************************************************************************************/
if(MENU == 4){
turn(min%10);
displayN2();
if(key1 == 0 && key2 == 1){
delay_ms(200);//去抖
if(key1 == 0 && key2 == 1){
MENU = 0;
}
}
if(key2 == 0 && key1 == 1){
delay_ms(200);//去抖
if(key2 == 0 && key1 == 1){
a = min/10;
b = min%10;
b++;
if(b > 9){
b = 0;
}
min = a*10 + b;
sec = 0;//调时完成后把秒清0
}
}
while(key1 == 0 || key2 == 0){ }
}
}
}
/**********************************************************************************************
* 杜洋工作室 DoYoung Studio
* 与电子爱好者同行 www.DoYoung.net
/**********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -