一位数码时钟 程序

更新时间:2024-01-25 11:07:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

/************************************************************************** * 标题: 一位数码时钟 * 软件: Keil C51 * 芯片: STC12C2052

* 说明: 用一位数码LED管显示时钟

**************************************************************************/

#include #include

#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); 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); 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; a++; if(a > 2){ a = 0; } hou = a*10 + b; } } while(key1 == 0 || key2 == 0){ }

}

/**********************************************************************************************/

if(MENU == 2){ turn(hou); 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; 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; a++; if(a > 5){ a = 0; } min = a*10 + b; } } while(key1 == 0 || key2 == 0){ } }

/**********************************************************************************************/

if(MENU == 4){ turn(min); 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; b++; if(b > 9){ b = 0; } min = a*10 + b; sec = 0;//调时完成后把秒清0 } } while(key1 == 0 || key2 == 0){ } }

} }

/******************************************************************************

****************

/**********************************************************************************************/

本文来源:https://www.bwwdw.com/article/rbcw.html

Top