?? main.c
字號:
#include "stm8s.h"
#include "1302.h"
#include "1638.h"
#define uchar unsigned char
#define uint unsigned int
#define LED1_0 GPIO_WriteHigh(GPIOB, GPIO_PIN_6)//PB6
#define LED1_1 GPIO_WriteLow(GPIOB, GPIO_PIN_6)
uchar LED[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0,1,2,3,4,5,6,7,8,9,-
uchar h0=0x00,m0=0x00,s0=0x00;
uchar a=0,aa=0,q1=0,q2=0,q3=0,q4=0,i,b=0,g=0,v=0,k,t=0,z=0;
void delay_ring()
{
uint i;
i=30000;
while(i--);
}
uchar Read_Key() //讀按鍵、、、、、、
{
uchar i,c[4];
for(i=0;i<4;i++) //初始鍵值均為0
{
c[i]=0;
}
STB_0;
TM1638_Write(0x42);
for(i=0;i<4;i++)
{
c[i]=TM1638_Read();
}
STB_1;
for(i=0;i<4;i++)
{
if(c[i]!=0)
return(i*8+c[i]);
}
return 0;
}
void adjust_time()
{
Write_DATA(0x00,LED[h/16]); //小時
Write_DATA(0x02,LED[h%16]);
Write_DATA(0x04,LED[10]);
Write_DATA(0x06,LED[m/16]); //分鐘
Write_DATA(0x08,LED[m%16]);
Write_DATA(0x0a,LED[10]);
Write_DATA(0x0c,LED[s/16]); //秒
Write_DATA(0x0e,LED[s%16]);
}
void adjust_ring()
{
Write_DATA(0x00,LED[h0/16]); //小時
Write_DATA(0x02,LED[h0%16]);
Write_DATA(0x04,LED[10]);
Write_DATA(0x06,LED[m0/16]); //分鐘
Write_DATA(0x08,LED[m0%16]);
Write_DATA(0x0a,LED[10]);
Write_DATA(0x0c,LED[10]); //秒
Write_DATA(0x0e,LED[10]);
}
void adjust_date()
{
Write_DATA(0x00,LED[2]); //年
Write_DATA(0x02,LED[0]);
Write_DATA(0x04,LED[n/16]);
Write_DATA(0x06,LED[n%16]);
Write_DATA(0x08,LED[y/16]); //月
Write_DATA(0x0a,LED[y%16]);
Write_DATA(0x0c,LED[r/16]); //日
Write_DATA(0x0e,LED[r%16]);
}
void show_time()//顯示時間時、分、秒
{
Write_DATA(0x00,LED[READTIME[4]]); //小時
Write_DATA(0x02,LED[READTIME[5]]);
Write_DATA(0x04,LED[10]);
Write_DATA(0x06,LED[READTIME[2]]); //分鐘
Write_DATA(0x08,LED[READTIME[3]]);
Write_DATA(0x0a,LED[10]);
Write_DATA(0x0c,LED[READTIME[0]]); //秒
Write_DATA(0x0e,LED[READTIME[1]]);
}
void show_date()//顯示時間年、月、日
{
Write_DATA(0x00,LED[2]); //年
Write_DATA(0x02,LED[0]);
Write_DATA(0x04,LED[READTIME[12]]);
Write_DATA(0x06,LED[READTIME[13]]);
Write_DATA(0x08,LED[READTIME[8]]); //月
Write_DATA(0x0a,LED[READTIME[9]]);
Write_DATA(0x0c,LED[READTIME[6]]); //日
Write_DATA(0x0e,LED[READTIME[7]]);
}
void stop()//熄滅所有燈
{
for(i=0;i<8;i++)
Write_DATA(2*i+1,0x00);
}
void Key_program(uchar n)
{
switch(n)
{
case 1:while(Read_Key());//切換1:時間/定時 與 日期
if(a==0)
{
g=1;q1=1;a=1;
Write_DATA(1,1);
Write_DATA(7,0);
break;
}
if(a==1)
{
g=2;q1=2;a=0;
Write_DATA(1,0);
Write_DATA(7,0);
break;
}
case 9:while(Read_Key());//切換2:.......................
if(q2==1)
{
q2=0;
Write_DATA(3,1);
Write_DATA(7,0);
break;
}
if(q2==0)
{
q2=1;
Write_DATA(3,0);
Write_DATA(7,0);
break;
}
break;
case 17:while(Read_Key());
if(q1==1)
{
if(q2==0)//時間-時++
{
h++;
if(h==0x0a)
h=0x10;
if(h==0x1a)
h=0x20;
if(h==0x24)
h=0x00;
adjust_time();
}
else if(q2==1)//時間-分++
{
m++;
if(m==0x0a)
m=0x10;
if(m==0x1a)
m=0x20;
if(m==0x2a)
m=0x30;
if(m==0x3a)
m=0x40;
if(m==0x4a)
m=0x50;
if(m==0x5a)
m=0x00;
adjust_time();
}
}
else if(q1==2)
{
if(q2==0)//定時-時++
{
h0++;
if(h0==0x0a)
h0=0x10;
if(h0==0x1a)
h0=0x20;
if(h0==0x24)
h0=0x00;
adjust_ring();
}
else if(q2==1)//定時-分++
{
m0++;
if(m0==0x0a)
m0=0x10;
if(m0==0x1a)
m0=0x20;
if(m0==0x2a)
m0=0x30;
if(m0==0x3a)
m0=0x40;
if(m0==0x4a)
m0=0x50;
if(m0==0x5a)
m0=0x00;
adjust_ring();
}
}
Write_DATA(7,0);
break;
case 25:while(Read_Key()); //調(diào)節(jié) 月日
if(aa==0)
{
g=3;q3=1;aa=1;
Write_DATA(7,1);
break;
}
if(aa==1)
{
g=3;q3=1;aa=0;
break;
}
case 16:while(Read_Key()); //切換4: 月 與 日
if(q4==1)
{
g=3;q4=0;
Write_DATA(9,1);
break;
}
if(q4==0)
{
g=3;q4=1;
Write_DATA(9,0);
break;
}
Write_DATA(7,1);
break;
case 24:while(Read_Key());//調(diào)節(jié)日期
if(q3)
{
if(q4==0)//月++
{
y++;
if(y==0x13)
y=0x01;
if(y==0x0a)
y=0x10;
adjust_date();
}
else if(q4==1)//日++
{
r++;
if(r==0x31)
r=0x01;
if(r==0x0a)
r=0x10;
if(r==0x1a)
r=0x20;
if(r==0x2a)
r=0x30;
adjust_date();
}
}
Write_DATA(7,1);
break;
case 32:while(Read_Key());while(Read_Key());stop();Write_DATA(13,1); Write_DATA(7,0);//開始啟動并顯示日期
SETtime1302();b=1;g=4;z=1;
break;
case 40:while(Read_Key());while(Read_Key());stop();Write_DATA(15,1);Write_DATA(7,0);//開始啟動并顯示時間
SETtime1302();b=1;g=5;z=1;
break;
default:break;
}
}
/******定時打鈴******/
void ring() //READTIME[2],READTIME[3]十分,分;;READTIME[4],READTIME[5]十時,時;;READTIME[0],READTIME[1]十秒 秒
{
t=0;
if(READTIME[4]==h0/16&&READTIME[5]==h0%16&&READTIME[2]==m0/16&&READTIME[3]==m0%16&&READTIME[0]==s0/16&&z==1)
{
t=1;
if(READTIME[1]>9)
t=0;
} //響10秒鐘
if(t==1)
{
LED1_1;
delay_ring();
LED1_0;
delay_ring();
}
}
void main()
{
CLK_HSICmd(ENABLE);//啟用內(nèi)部高速振蕩器(HSI 16MHz)
CLK_HSIPrescalerConfig(CLK_PRESCALER_CPUDIV16);//配置內(nèi)部高速振蕩器(HSI)的分頻器,CPU時鐘 16 分頻
GPIO_DeInit(GPIOB);//使能PB口
GPIO_Init(GPIOB, GPIO_PIN_2 , GPIO_MODE_OUT_PP_HIGH_FAST);//初始化PB0,PB1,PB2
GPIO_Init(GPIOB, GPIO_PIN_1 , GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB, GPIO_PIN_0 , GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB, GPIO_PIN_3 , GPIO_MODE_OUT_PP_HIGH_FAST);//初始化PB3,PB4,PB5
GPIO_Init(GPIOB, GPIO_PIN_4 , GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB, GPIO_PIN_5 , GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB, GPIO_PIN_6 , GPIO_MODE_OUT_PP_HIGH_FAST);//初始化PB6
init_TM1638();
while(1)
{ k=Read_Key();
if(k!=0)//當(dāng)讀取的鍵值不為0時,執(zhí)行相應(yīng)鍵值程序
Key_program(k);
if(g==1)
{
adjust_time();
}
else if(g==2)
{
adjust_ring();
}
else if(g==3)
{
adjust_date();
}
else if(g==4)
show_date();
else if(g==5)
show_time();
if (b==1)
{
READtime1302();
ring();
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -