?? wl010.c
字號:
/*******************************************************************************
* 標題: ME300系列單片機開發(fā)系統(tǒng)演示程序 - 數(shù)碼管顯示簡易電子時鐘 *
* 硬件: ME300A+,ME300B *
* 文件: wl010.C *
* 日期: 2004-1-5 *
* 版本: 1.0 *
* 作者: 偉納電子 - Freeman *
* 郵箱: freeman@willar.com *
* 網(wǎng)站: http://www.willar.com *
********************************************************************************
* 描述: *
* 簡易電子時鐘,LED數(shù)碼管顯示 *
* K1---時調(diào)整 *
* K2---分調(diào)整 *
* *
* 上電時初始化顯示: 12-00-00 *
* *
* * **** **** **** **** **** *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * **** ****** * * * * ****** * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * **** **** **** **** **** *
* *
********************************************************************************
* 跳線設(shè)置: *
* ME300A+ JP1 全部短接,JP2短接2-3端 *
* ME300B JP1 短接,JP2短接2-3端 *
* *
********************************************************************************
* 【版權(quán)】 Copyright(C)偉納電子 www.willar.com All Rights Reserved *
* 【聲明】 此程序僅用于學習與參考,引用請注明版權(quán)和作者信息! *
*******************************************************************************/
#include <reg51.h>
#include <intrins.h>
unsigned char data dis_digit;
unsigned char key_s, key_v;
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char data dis_buf[8];
unsigned char data dis_index;
unsigned char hour,min,sec;
unsigned char sec100;
sbit K1 = P1^4;
sbit K2 = P1^5;
bit scan_key();
void proc_key();
void inc_sec();
void inc_min();
void inc_hour();
void display();
void delayms(unsigned char ms);
void main(void)
{
P0 = 0xff;
P2 = 0xff;
TMOD = 0x11; // 定時器0, 1工作模式1, 16位定時方式
TH1 = 0xdc;
TL1 = 0;
TH0 = 0xFC;
TL0 = 0x17;
hour = 12;
min = 00;
sec = 00;
sec100 = 0;
dis_buf[0] = dis_code[hour / 10]; // 時十位
dis_buf[1] = dis_code[hour % 10]; // 時個位
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分個位
dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒個位
dis_buf[2] = 0xbf; // 顯示"-"
dis_buf[5] = 0xbf; // 顯示"-"
dis_digit = 0xfe;
dis_index = 0;
TCON = 0x01;
IE = 0x8a; // 使能timer0,1 中斷
TR0 = 1;
TR1 = 1;
key_v = 0x03;
while(1)
{
if(scan_key())
{
delayms(10);
if(scan_key())
{
key_v = key_s;
proc_key();
}
}
}
}
bit scan_key()
{
key_s = 0x00;
key_s |= K2;
key_s <<= 1;
key_s |= K1;
return(key_s ^ key_v);
}
void proc_key()
{
EA = 0;
if((key_v & 0x01) == 0) // K1
{
inc_hour();
}
else if((key_v & 0x02) == 0) // K2
{
min++;
if(min > 59)
{
min = 0;
}
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分個位
}
EA = 1;
}
void timer0() interrupt 1
// 定時器0中斷服務(wù)程序, 用于數(shù)碼管的動態(tài)掃描
// dis_index --- 顯示索引, 用于標識當前顯示的數(shù)碼管和緩沖區(qū)的偏移量
// dis_digit --- 位選通值, 傳送到P2口用于選通當前數(shù)碼管的數(shù)值, 如等于0xfe時,
// 選通P2.0口數(shù)碼管
// dis_buf --- 顯于緩沖區(qū)基地址
{
TH0 = 0xFC;
TL0 = 0x17;
P2 = 0xff; // 先關(guān)閉所有數(shù)碼管
P0 = dis_buf[dis_index]; // 顯示代碼傳送到P0口
P2 = dis_digit; //
dis_digit = _crol_(dis_digit,1); // 位選通值左移, 下次中斷時選通下一位數(shù)碼管
dis_index++; //
dis_index &= 0x07; // 8個數(shù)碼管全部掃描完一遍之后,再回到第一個開始下一次掃描
}
void timer1() interrupt 3
{
TH1 = 0xdc;
sec100++;
if(sec100 >= 100)
{
sec100 = 0;
inc_sec();
}
}
void inc_sec()
{
sec++;
if(sec > 59)
{
sec = 0;
inc_min();
}
dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒個位
}
void inc_min()
{
min++;
if(min > 59)
{
min = 0;
inc_hour();
}
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分個位
}
void inc_hour()
{
hour++;
if(hour > 23)
{
hour = 0;
}
if(hour > 9)
dis_buf[0] = dis_code[hour / 10]; // 時十位
else
dis_buf[0] = 0xff; // 當小時的十位為0時不顯示
dis_buf[1] = dis_code[hour % 10]; // 時個位
}
void delayms(unsigned char ms)
// 延時子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -