?? time_cont.c
字號:
#include <msp430x13x.h>
#define uchar unsigned char
#define unit unsigned int
void delay(int v);
void d1ms(void);
uchar kbscan(void); /*輸出鍵值*/
uchar kbjust(void); /*有按鍵為1*/
void key0(void); /*調時間*/
void key1(void); /*調鬧鐘時間*/
void dsp(void); //顯示子程序
uchar dot=0,bell=0,bellcontr=1,bbb=0;
uchar out=0x08; //p4.3
uchar x[6]={1,2,0,0,0,0},y1=20,y2=00,y3=00,s01; /*顯緩,計時單元*/
uchar timjust[6]={0x21,0x21,0x21,0x21,0x21,0x21};
struct
{uchar hour,mte;}time[6]={{6,0},{6,5},{6,10},{7,40},{13,40},{17,20}};
/*time[5]為6個時間控制點*/
uchar seg[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,
0xb9,0xde,0xf9,0xf1,
0x80,0x40,0x00,0x73,0xc0};
void key3(void) //控制輸出與否位求反
{
bellcontr^=1;
}
void key0(void) //設定實時時間
{
x[0]=0x21;
x[1]=0x21; //最前面兩顯示器顯示中間杠--,提示為時間設置
x[2]=0x22;
x[3]=0x22;
x[4]=0x22;
x[5]=0x22; //接著后面4位不顯示,等待鍵盤的輸入
x[2]=kbscan();
x[3]=kbscan();
x[4]=kbscan();
x[5]=kbscan(); //鍵盤輸入值送入后面4位顯示器
y1=x[2];
y1=y1*10;
y1=y1+x[3];
y1=x[2]*10+x[3]; //前兩個輸入數據作為時間的小時值被保存
y2=x[4]*10+x[5]; //最后兩個輸入作為時間的分鐘值被保存
y3=0; //秒被清零
}
void key1(void) //設定6個控制時間點
{
uchar tmp;
uchar i=0;
for(i=0;i<6;i++) //循環6次
{
x[0]=i+1; //第一位顯示控制時間點的序號
x[1]=timjust[i]; //
x[2]=(time[i].hour)/10; //在顯示器的后面4位顯示原先的控制時間點與序號
x[3]=(time[i].hour)%10;
x[4]=(time[i].mte)/10;
x[5]=(time[i].mte)%10;
tmp=kbscan(); //按鍵為何值
if(tmp==0) //如果按鍵為“0”
{
x[2]=0x22; //說明需要改變相應的控制時間點
x[3]=0x22; //先將顯示清除,序號不變
x[4]=0x22;
x[5]=0x22;
x[2]=kbscan(); //輸入4位數為改變后的控制時間點
x[3]=kbscan();
x[4]=kbscan();
x[5]=kbscan();
time[i].hour=x[2]*10+x[3]; //記錄如相應的緩存
time[i].mte=x[4]*10+x[5];
kbscan();
}
else
if(tmp==0x0b) //如果為“B”
x[1]=0x21;
else x[1]=0x22;
timjust[i]=x[1];
kbscan();
}
}
void main(void) //系統主程序
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
TACTL = TASSEL1 + TACLR; // SMCLK, clear TAR
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 50000;
P4DIR |= 0x08; // P1.0 output
TACTL |= MC1; // Start Timer_A in continuous mode
_EINT(); // Enable interrupts
while(1) //主循環
{
uchar j;
x[0]=y1/10; //拆分時間值到對應的顯示緩存
if(x[0]==0) //如果時間的小時值的十位為“0”
x[0]=0x22; //則不予顯示(符合習慣)
if(dot==1) //與電子表對應的秒閃爍
x[1]=y1%10+0x10;
else
x[1]=y1%10;
x[2]=y2/10;
x[3]=y2%10;
x[4]=y3/10;
if(bellcontr==1) //輸出控制位在最后單元的小數點顯示
x[5]=y3%10+0x10; //如果控制信號輸出,則最后小數點亮
else
x[5]=y3%10;
dsp(); //調用顯示
if(kbjust()!=0) //有否按下的按鍵
{ //如果有,則:
switch(kbscan()) //判斷什么鍵值
{
case 0: //0:調時間
{
key0();
break;
}
case 1: //1:設定時間控制點
{key1();
break;
}
case 11: //11:設定到時間控制點后,是否輸出
{key3();
break;
}
}
}
bbb=0;
if(bellcontr ==1) //如果輸出暢通
{
for(j=0;j<6;j++) //判斷實時時間與6個控制點是否有相等
if((y1==time[j].hour)&(y2==time[j].mte))
{
P4OUT |= BIT3; //則輸出高電平驅動打鈴
break;
}
else
P4OUT &= ~BIT3; //不滿足打鈴條件輸出低電平
}
}
}
unsigned char key(void)
{
unsigned char x=0xff;
P1DIR=0X0F;
P1OUT=0X01; //掃描第一行
if((P1IN&0X70)==0X10)
x=0;
else
if((P1IN&0X70)==0X20)
x=1;
else
if((P1IN&0X70)==0x40)
x=2;
else
{
P1OUT=0X2; //掃描第二行
if((P1IN&0X70)==0X10)
x=3;
else
if((P1IN&0X70)==0X20)
x=4;
else
if((P1IN&0X70)==0x40)
x=5;
else
{
P1OUT=0X4; //掃描第三行
if((P1IN&0X70)==0X10)
x=6;
else
if((P1IN&0X70)==0X20)
x=7;
else
if((P1IN&0X70)==0x40)
x=8;
else
{P1OUT=8; //掃描第四行
if((P1IN&0X70)==0X10)
x=9;
else
if((P1IN&0X70)==0X20)
x=10;
else
if((P1IN&0X70)==0x40)
x=11;
}
}
}
return(x);
}
unsigned char kbjust(void)
{unsigned char x;
P1DIR=0XFF;
P1OUT=0X0;
P1DIR=0x0f;
P1OUT=0x0f; //鍵盤硬件:P10--P13為行線,最上面一根為P10
x=(P1IN&0X70); // P14--P16為列線,最左邊一根為P14,列線下拉
return(x); // 無按鍵,返回 0 ; 有按鍵返回非0
}
uchar kbscan(void)
{
uchar temp;
kbscant: dsp();
if(kbjust()!=0X00)
{
dsp(); //消抖動
if(kbjust()!=0X0)
temp=key(); //按鍵鍵值保存臨時單元
kbscant2: if(kbjust()!=0X00)
goto kbscant2; //等按鍵松開
else
return(temp); //松開后返回
}
goto kbscant;
}
void d1ms(void)
{
int tmp=500;
while(tmp)
tmp--;
}
void delay(int v)
{
while(v!=0)v--;
}
void dsp(void)
{
unsigned char i=0;
unsigned char temp=0x1;
for(i=0;i<6;i++)
{
P1DIR=0XFF;
P5DIR=0XFF;
P1DIR=0XFF;
P1OUT=~temp;
temp=temp<<1;
P5OUT=seg[x[i]];
delay(400);
}
}
interrupt[TIMERA0_VECTOR] void Timer_A (void)
{
CCR0+=60000; //增加CCR0
s01=s01+1; //0.1秒加1
if(s01==10)
{s01=0;
dot^=1; //求反,小數點是否顯示(秒閃爍)
y3=y3+1; //10個0.1秒為1秒,秒加1
}
if(y3==60)
{
y3=0;
y2=y2+1; //60秒為1分,分加1
if(y2==60)
{
y2=0;
y1=y1+1; //60分為1小時,小時加1
if(y1==24)
{y1=0 ; //24小時再清零
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -