📄 clock.c
字号:
#include "clock.c"
void init()
{
OPTION=0b00000111 ;
TMR0=56; //设置200次机器周期溢出
INTCON =0b10100000 ; // 使能定时器中断
TRISD=0;
lcd_init();
time_count = 0;
curr_menu = normol_run;
curr_cl_hour = 0;
curr_cl_min = 0;
curr_cl_sec = 0;
curr_al_hour = 0;
curr_al_min = 0;
curr_al_sec = 0;
temp_cl_hour = 0;
temp_cl_min = 0;
temp_cl_sec = 0;
temp_al_hour = 0;
temp_al_min = 0;
temp_al_sec = 0;
}
void lcd_init()
{
delayMs(300); //最好延时300ms以上
lcd_write(0x429,12); //专用初始化命令
lcd_write(0x418,12); //内部RC振荡器
lcd_write(0x401,12); //开启振荡器
lcd_write(0x403,12); //开显示器
}
void interrupt ISR(void)
{
… //保护现场、屏蔽中断(根据实际工程修改)
if(time_out>0)
time_out--;
time_count++;
if((INTCON&0b00000100)!=0)
{
INTCON=INTCON&0b11111011;
TMR0=0;
PORTD++; }
}
… //恢复现场、使能中断(根据实际工程修改)
}
void count_time()
{
if(time_count == 5000)
{
time_count = 0;
curr_cl_sec++;
}
if(curr_cl_sec == 60)
{
curr_cl_sec = 0;
curr_cl_min++;
}
if(curr_cl_min == 60)
{
curr_cl_min = 0;
curr_cl_hour++;
}
if(curr_cl_hour == 24)
{
curr_cl_sec = 0;
}
if( (curr_cl_hour == curr_al_hour)
&& (curr_cl_min == curr_al_min)
&&( curr_cl_sec == curr_al_sec)
{
bell(); //蜂鸣器响起
}
if(time_out<=0)
{
curr_menu = normal_run;
time_out = 0;
}
else if(time_out%800==0)
{
flag_flash = ~flag_flash; //每0.8秒闪烁一次
}
}
void lcd_write(int dat,int length)
{
int temp,i;
nCS;
for(i=0;i=length;i++)
{
temp = dat<<i;
nWR;
if( length = 12)
{
if( temp & 0x800 ==0x800)
DATA = 1;
else
DATA =0;
}
if( length = 13)
{
if( temp & 0x1000 ==0x1000)
DATA = 1;
else
DATA =0;
}
WR;
delayMs(100);
}
CS;
WR
DATA;
}
void lcd_refresh()
{
display_front();
display_hour();
display_min();
display_sec();
}
void display_front()
{
switch( curr_menu )
{
case normal_run :
display_number(13,1,0); //第一个数码管不显示任何数字
display_number(13,2,0); //第二个数码管不显示任何数字
break;
case clock_hour :
case clock_min :
case clock_sec :
display_number(10,1,0); //第一个数码管显示"A"
display_number(12,2,0); //第二个数码管显示"L"
break;
case alarm_hour :
case alarm_min :
case alarm_sec :
display_number(11,1,0); //第一个数码管显示"C"
display_number(12,2,0); //第二个数码管显示"L"
break;
default: break;
}
}
void display_hour()
{
if(curr_menu == clock_hour)
{
display_number(curr_cl_hour/10,3,0);
display_number(curr_cl_hour%10,4,1);
}
if(curr_menu == alarm_hour)
{
display_number(curr_al_hour/10,3,0);
display_number(curr_al_hour%10,4,1);
}
}
void display_min()
{
if(curr_menu == clock_min)
{
display_number(curr_cl_min/10,5,0);
display_number(curr_cl_min%10,6,1);
}
if(curr_menu == alarm_min)
{
display_number(curr_al_min/10,5,0);
display_number(curr_al_min%10,6,1);
}
}
void display_sec()
{
if(curr_menu == clock_sec)
{
display_number(curr_cl_sec/10,7,0);
display_number(curr_cl_sec%10,8,1);
}
if(curr_menu == alarm_sec)
{
display_number(curr_al_sec/10,7,0);
display_number(curr_al_sec%10,8,1);
}
}
void display_number(int number, int section, int dot)
{
int temp_dat;
if(dot ==1)
show_arry[0]=array[2*number]&0x1;
temp_dat = 0x1400 + (2*section)<<4 + show_array[0];
lcd_write(temp_dat, 13);
temp_dat = 0x1400 + (2*section+1)<<4 + show_array[1];
lcd_write(temp_dat, 13);
}
int keyboard(void)
{
int keyvalue,key;
keyvalue = PORTB;
keyvalue = keyvalue & 0x0f
switch(keyvalue)
{
case 0x1:
key = OK;
break;
case 0x2:
key = subtract;
break;
case 0x4:
key = add;
break;
case 0x8:
key = mode;
break;
default: break;
}
return keyvalue;
}
void key_cmd()
{
switch key:
{
case mode:
mode_fun();
time_out = 50000;
break;
case add:
add_fun();
time_out = 50000;
break;
case subtract:
subtract_fun();
time_out = 50000;
break;
case ok:
ok_fun();
time_out = 50000;
break;
default:break;
}
}
void mode_fun()
{
if(curr_menu<alarm_sec)
curr_menu++;
if(curr_menu == alarm_sec)
curr_menu = normol_run;
}
void add_fun()
{
switch( curr_menu )
{
case clok_hour:
temp_cl_hour++;
break;
case clok_min:
temp_cl_min++;
break;
case clok_sec:
temp_cl_sec++;
break;
case alarm_hour:
temp_al_hour++;
break;
case alarm_min:
temp_al_min++;
break;
case alarm_sec:
temp_al_sec++;
break;
}
}
void subtract_fun()
{
switch( curr_menu )
{
case clok_hour:
temp_cl_hour--;
break;
case clok_min:
temp_cl_min--;
break;
case clok_sec:
temp_cl_sec--;
break;
case alarm_hour:
temp_al_hour--;
break;
case alarm_min:
temp_al_min--;
break;
case alarm_sec:
temp_al_sec--;
break;
}
}
void enter_fun()
{
if(time_out >= 0)
{
curr_cl_hour = temp_cl_hour ;
curr_cl_min = temp_cl_min ;
curr_cl_sec = temp_cl_sec ;
curr_al_hour = temp_al_hour ;
curr_al_min = temp_al_min ;
curr_al_sec = temp_al_sec ;
}
}
void main()
{
init();
while(1)
{
count_time();
keyboard();
key_cmd();
lcd_refresh();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -