📄 4250可调电子表.txt
字号:
/*精确到秒,上电后开始走表,按键K2选择调整位,闪烁后按键K1加,按键K2第四次回到现实状态*/
#include <msp430x42x0.h>
// LCD segment definitions.
#define h 0x80
#define e 0x40
#define f 0x20
#define c 0x10
#define d 0x08
#define g 0x04
#define b 0x02
#define a 0x01
const unsigned char lcd_table[] = { // definitions for digits
a+b+c+d+e+f, // Displays "0"
b+c, // Displays "1"
a+b+d+e+g, // Displays "2"
a+b+c+d+g, // Displays "3"
b+c+f+g, // Displays "4"
a+c+d+f+g, // Displays "5"
a+c+d+e+f+g, // Displays "6"
a+b+c, // Displays "7"
a+b+c+d+e+f+g, // Displays "8"
a+b+c+d+f+g // Displays "9"
};
static unsigned char sec; //秒寄存器
static unsigned char min; //分寄存器
static unsigned char hour; //小时寄存器
void delay(unsigned int n)
{
unsigned int m;
unsigned int q=0;
while(q<n)
{
for(m=0;m<280;m++) ; //为什么是560
q++;
}
}
unsigned char shezhi_flag,wei,timeadd_flag;
unsigned char add;
void rtc(void);
void display_rtc(void);
void display_dec(unsigned char i,unsigned char j);
//////void led_display(unsigned char i);
//-------------------------------------------------------------
//---------------主程序----------------------------------------
//-------------------------------------------------------------
void shezhi(void)
{
switch(wei)
{case 1:delay(300);
LCDMEM[0]=0x00;LCDMEM[1]=0x00;
break;
case 2:delay(300);
LCDMEM[2]=0x00;LCDMEM[3]=0x00;
break;
case 3: delay(300);
LCDMEM[4]=0x00;LCDMEM[5]=0x00;
break;
}
delay(300);
display_rtc();
}
void timeadd(void)
{
if(timeadd_flag==1)
{
switch(wei)
{
case 1: sec=sec+2;
if (sec >= 120)
sec = 0;break;
case 2: min++;
if (min>= 60)
min = 0;break;
case 3: hour++;
if (hour>= 24)
hour = 0;break;
}
timeadd_flag=0;
}
display_rtc();
}
void main(void)
{
int i;
WDTCTL = WDTPW + WDTHOLD;
BTCTL=BTSSEL+BT_ADLY_500+BTFRFQ1; //BT 0.5S中断
IE2|=BTIE;
P5SEL=0xfc;
LCDACTL=LCDON+LCD4MUX+ LCDFREQ_128; //LCD模块初始化
LCDAPCTL0 = 0x0F;
P1DIR &=0xf9;
////P1IES |=0x06;
P1IE |=0x06;
for (i=0; i<8; ++i) //LCD 清屏
LCDMEM[i] = 0x00;
_EINT();
while(1)
{ if(shezhi_flag)
shezhi();
if(timeadd_flag)
timeadd();
}
}
//------------------------------------------------------
// Basic Timer interrupt service routine
#pragma vector = BASICTIMER_VECTOR
__interrupt void basic_timer(void)
{if(shezhi_flag==0)
{rtc(); //时钟处理
display_rtc();} //时钟LCD显示
}
//------------------------------------------------------
#pragma vector=PORT1_VECTOR
__interrupt void P1(void)
{P1IFG=0;
unsigned char temp;
temp=P1IN;
if((temp&0x02)==0||(temp&0x04)==0)
{
delay(10);
temp=P1IN;
if((temp&0x04)==0)
{if(shezhi_flag==0)
shezhi_flag=1;
switch(wei)
{
case 0:wei=1;break;
case 1:wei=2;break;
case 2:wei=3;break;
case 3:wei=0;
shezhi_flag=0;break;
}
}
if((temp&0x02)==0)
{if(shezhi_flag==1)
timeadd_flag=1;}
}
}
//-------------------------------------------------------
//-------时钟处理程序------------------------------------
//-------------------------------------------------------
void rtc (void)
{
if (++sec < 120)
return;
sec = 0;
if (++min < 60)
return;
min = 0;
if (++hour < 24)
return;
hour = 0;
}
//--------------------------------------------------------
//--------时钟LCD显示程序---------------------------------
//--------------------------------------------------------
void display_rtc(void)
{ int i;
i=sec;
i=i>>1;
display_dec(0,i);
i=min;
display_dec(2,i);
i=hour;
display_dec(4,i);
LCDMEM[6]=0x00;
}
//--------------------------------------------------------
//--------LCD显示处理程序---------------------------------
//--------------------------------------------------------
void display_dec(unsigned char i,unsigned char j)
{
LCDMEM[i]=lcd_table[j%10]+0x80;
LCDMEM[i+1]=lcd_table[j/10];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -