?? clock.c
字號:
#include <c8051f330.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key_h=P1^6; //小時加
sbit key_m=P1^7; //分鐘加
// sbit key_s=P1^6;
sbit key_alarm=P2^0; //鬧鐘
sbit BEEP=P2^0; //蜂鳴器輸出
uchar time0[3]; //time0[0]:秒 time0[1]:分 time0[2]:時
uchar alarm0[3]; //保存鬧鐘時間
uchar code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xff }; //段碼
uchar code LEDData_pot[ ] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E,0xff }; //斷碼帶小數點
uchar buf_s=0; //TIMER2中斷計數
uchar dis_buf[6]; //顯示緩存
sfr16 TMR2RL = 0xCA; // Timer2 Reload Register
sfr16 TMR2 = 0xCC; // Timer2 Register
//*************************************************
//延時子程序
//*************************************************
delay(int ms){ // 延時子程序
int i;
while(ms--){
for(i = 0; i<2000; i++){
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*************************************************************/
/* 延時 x*0.14ms */
/*************************************************************/
void delay0(uchar x) {
unsigned char i;
while(x--){
for (i = 0; i<13; i++) {}
}
}
/*************************************************************/
/* 蜂鳴器響一聲 */
/*************************************************************/
void beep(){
unsigned char i;
for (i=0;i<180;i++){
delay0(6);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //關閉蜂鳴器
delay(50); //延時
}
//**************************************************************
//定時器2初始化
//**************************************************************
void TIMER2_init(){
CKCON &= ~0x60; // Timer2 uses SYSCLK/12
TMR2CN &= ~0x01;
TMR2RL = 10000; // Reload value to be used in Timer2
TMR2 = TMR2RL; // Init the Timer2 register
TMR2CN = 0x04; // Enable Timer2 in auto-reload mode
ET2 = 1; // Timer2 interrupt enabled
/* CKCON &= ~0x60; // Timer2 uses SYSCLK/12
TMR2CN &= ~0x01;
TMR2H=0x00;
TMR2L=0x00;
TMR2RLL = 0x00; // Reload value to be used in Timer2
TMR2RLH = 0x00; // Init the Timer2 register
TMR2CN = 0x04; // Enable Timer2 in auto-reload mode
ET2 = 1; // Timer2 interrupt enabled
} */
}
/*************************************************************/
//定時器T2中斷
/*************************************************************/
void Timer2( ) interrupt 5 {
buf_s++;
if(buf_s==2){
time0[0]++;
if(time0[0]==60){
time0[1]++;
time0[0]=0;
}
if(time0[1]==60){
time0[2]++;
time0[1]=0;
}
if(time0[2]==24)
time0[2]=0;
buf_s=0;
}
TF2H=0;
}
//*************************************************************
//led動態掃描 一次
//************************************************************
void disp(uchar *p){
uchar pos=0xfe;
uchar i=0;
dis_buf[0]=p[0]%10;
dis_buf[1]=p[0]/10;
dis_buf[2]=p[1]%10;
dis_buf[3]=p[1]/10;
dis_buf[4]=p[2]%10;
dis_buf[5]=p[2]/10;
for(i=0;i<6;i++){
P1=pos;
if(i==2||i==4)
P0=LEDData_pot[dis_buf[i]];
else
P0=LEDData[dis_buf[i]];
pos=(pos<<1)|0x01;
delay(1);
}
}
//***********************************************************
// 設定小時h 和 分鐘m
//************************************************************
void set_hm(uchar *s){
uchar i=0;
key_h=1; //掃描小時增加鍵
if(key_h==0){
delay(1);
if(key_h==0){
s[2]+=1;
if(s[2]==24)
s[2]=0;
}
}
for(i=0;i<8;i++) //用disp 做延時!
disp(s);
key_m=1; //掃描分增加鍵
if(key_m==0){
delay(1);
if(key_m==0){
s[1]+=1;
if(s[1]==60)
s[1]=0;
}
}
for(i=0;i<8;i++) //用disp 做延時!
disp(s);
}
//***********************************************************
// 設定秒s 清零
//************************************************************
/* void set_s(){
uchar i=8;
key_s=1; //掃描分增加鍵
if(key_s==0){
delay(1);
if(key_s==0)
time0[0]=0;
}
while(i--) //用disp 做延時!
disp(time0);
} */
//***********************************************************
//設定鬧鐘
//************************************************************
void set_alarm(){
key_alarm=1;
if(key_alarm==0){
delay(1);
if(key_alarm==0){
while(1){
set_hm(alarm0); //調用設定分鐘 小時
key_alarm=1;
if(key_alarm==0){
delay(1);
if(key_alarm==0)
break; //再次按下key_alarm退出設定鬧鐘
}
}
}
}
}
//***********************************************************
//鬧鐘檢測
//************************************************************
void check_alarm(){
uchar i=10;
if(!(alarm0[1]==0&&alarm0[2]==0)){ //0時0分將被認為鬧鐘關閉
if(alarm0[2]==time0[2]){
if(alarm0[1]==time0[1]){
if(time0[0]==0){
while(1){
i=10;
beep();
// delay(20);
while(i--)
disp(alarm0); //顯示鬧鐘時間
key_alarm=1;
if(key_alarm==0||(alarm0[1]!=time0[1])){
delay(1);
if(key_alarm==0||(alarm0[1]!=time0[1]))
break; //按下key_alarm或者時間超過1分鐘退出
}
}
}
}
}
}
}
//***********************************************************
//I/O口初始化
//***********************************************************
void PORT_init (void){
P0MDIN |= 0xff;
P1MDIN |= 0xff;
P0MDOUT = 0xff;
P1MDOUT = 0xff;
XBR1 = 0xc0;
}
//***********************************************************
//系統時鐘頻率初始化
//***********************************************************
void SYSCLK_init(){
OSCICL=0x3d; //20MHZ
OSCICN=0xc2; // sysclk為內部振蕩器得2分頻 10mhz
CLKSEL=0x00; //chose internal sysclk
}
//***********************************************************
//主函數
//************************************************************
main(){
PCA0MD&=~0x40;
PORT_init();
SYSCLK_init();
// TIMER2_init();
while(1){
set_hm(time0);
// set_s();
set_alarm();
check_alarm();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -