概述:
設計一個按鈕控制分鐘的倒數計時器,一個按鈕暫停與鬧鐘響時停止鬧鐘。
目錄:
1.電路圖
2.PDG2
3.程式
1.電路圖:
2.PDG2
主要教學如何設定 CMT
開啟CMT0並設定每次進中斷的時間為0.1秒,方便測試,打開中斷。
程式:
int ssc[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int chan[4]={0xef,0xf7,0xfb,0xfd};
int time[4]={0,0,0,0};
int cnt=0;
int L=0,M=0,R=0;
int start=0,flag=0,ring=0,C=0,cc,flag_ring=0;
void main(void)
{
int i,d,btn=0;
R_PG_IO_PORT_Set_P7();
R_PG_IO_PORT_Set_P9();
R_PG_IO_PORT_Set_PB();
while(1)
{
//不斷讀取按鈕
R_PG_ExtInterrupt_Set_IRQ0(&btn);
R_PG_ExtInterrupt_Set_IRQ1(&btn);
//更新時間在七段上的數值
time[1]=cnt;
time[2]=M;
time[3]=R;
//怕你按鈕案超過10要自動歸零
if(cnt==10)
cnt=0;
//如果三個都是0
if(cnt==0 && M==0 && R==0){
R_PG_Timer_StopModule_CMT_U0();//關掉倒數中斷
ring=1;
}
if(ring)
C++; //設一個小Delay
//進入響鈴
if(C==500)
{
while(start) //用這個while 把它卡住 直到按下 開始/暫停 紐 btn2
{
//關燈然後延遲
R_PG_IO_PORT_Write_P7(0xff);
for(cc=0;cc<1000000;cc++);
for(d=0;d<10000;d++){
for(i=0;i<4;i++){
R_PG_IO_PORT_Write_P7(~ssc[time[i]]);
R_PG_IO_PORT_Write_P9(chan[i]);
}
}
}
C=0;
ring=0;
}
//更新 七段
for(i=0;i<4;i++){
R_PG_IO_PORT_Write_P7(0xff);
R_PG_IO_PORT_Write_P7(~ssc[time[i]]);
R_PG_IO_PORT_Write_P9(chan[i]);
for(d=0;d<1000;d++);
}
}
}
//控制小時中斷
Irq0IntFunc()
{
if(start==0)
cnt++;
}
//開始/暫停中斷
Irq1IntFunc()
{
//開始倒數
if(start==0)
{
R_PG_Timer_Start_CMT_U0_C0(); // 開啟CMT
start=1;
}
else
{
R_PG_Timer_StopModule_CMT_U0(); //暫停 CMT
start=0;
}
}
//CMT 中斷
Cmt0IntFunc()
{
//如果三個數字都為 0
if(R!=0 || cnt!=0 || M!=0)
{
R--; //最右邊 的七段開始減
if(R==-1)
{
R=9;
M--;
if(M==-1)
{
M=5; //因為是從59秒開始倒數
cnt--; //小時才會減
}
}
}
}
沒有留言:
張貼留言