2019年4月27日 星期六

Rx62t 實作 :簡易倒數計時器 Timer (CMT)

概述:

設計一個按鈕控制分鐘的倒數計時器,一個按鈕暫停與鬧鐘響時停止鬧鐘。


目錄:

1.電路圖
2.PDG2
3.程式


1.電路圖:
 同七段顯示器那篇,不過請將 P10,P11接至上拉電阻與按鈕中間,詳情請看按鈕中斷那篇。


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--; //小時才會減 
}

 }
 
}
}







沒有留言:

張貼留言