当前位置:首页 > 单片机 > 单片机
[导读] 用c语言写的一个时闹钟程序单片机用16F877,主时钟用20MHz,用32768作定时时间。可以实现2路定闹,每一路都可分别设置和开关,采用4x4键盘,16x2的字符型LCD显示。连线在程序开头有说明。程序的功能:(

c语言写的一个时闹钟程序

单片机用16F877,主时钟用20MHz,用32768作定时时间。可以实现2路定闹,每一路都可分别设置和开关,采用4x4键盘,16x2的字符型LCD显示。连线在程序开头有说明。
程序的功能:
(1)上电后LCD背光打开,并显示倒计时5秒,然后时钟开始工作。
(2)用模式键(*)切换模式,如显示时间、日期、闹钟1、闹钟2等,并且可以用上、下键控制加1、减1或是闹钟的On、Off。

(3)原程序有16个键,包括0~9数字键,可以直接输入要设置的时间值,但后来将数字键取消了,你仍然可以通过修改程序的部分注释恢复此功能。
(4)闹钟有2路,时间到后闹2分钟,可按任意键取消本次闹钟。闹钟响时有2种音调,是用PIC的PWM实现的。
(5)按任意键可打开背光,1分钟后自动关闭背光。
(6)RA0~RA3为按键扫描输入,应接下拉电阻。



主程序
// FileName: Main.c
// MCU: MicroChipPIC16F877
// Tool: CCS-C compiler
// Author: KingEDA, MSN:kingeda@163.com, skype:kingeda, E-mail:kingeda@163.com
// Website:http://www.EDAKING.com
// Description:
// A timer program
// Ver 0.1: 2003-03-31, all cLOCk function with date display, 2 way alarm.
// Ver 0.2: 2003-05-05, (1) Alarm default is on,modify alarm1 time to 7:00:00,
// and alarm2 to 13:30:00.
// (2) Backlight will be enabLEDwhen alarming.
// (3) Automatic adjust day(28,30,31).
// (4) Automatic move cursor to next location when set item.
// PINConnection:
// RC0~1 : 32768Hz crystal
// RC2 : Buzzer
// RC3 : LCD Back Light,drive aPNPBJT
// RD0~RD7 : to LCD DB0~DB7
// RA0~RA3 : keypad col in
// RC4~RC7 : keypad line out
// 7 8 9 #
// 4 5 6 ↑
// 1 2 3 ↓
// 0 ← → *
// RE0 : LCD RS
// RE1 : LCD RW
// RE2 : LCD E

#include "my16f877.h"
#device ICD=true
//#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT
#use delay(clock = 24000000)
//#use fast_io(C)
#use fast_io(E)
#define lcd_busy (lcd_read_addr()&0x80) == 0x80
#define time_start_addr 0x80+0x04
#define time_hourh_addr time_start_addr
#define time_hourl_addr time_start_addr+1
#define time_minuteh_addr time_start_addr+3
#define time_minutel_addr time_start_addr+4
#define time_secondh_addr time_start_addr+6
#define time_secondl_addr time_start_addr+7
#define key_0 0x11
#define key_1 0x21
#define key_2 0x22
#define key_3 0x24
#define key_4 0x41
#define key_5 0x42
#define key_6 0x44
#define key_7 0x81
#define key_8 0x82
#define key_9 0x84
#define key_left 0x12
#define key_right 0x14
#define key_up 0x48
#define key_down 0x28
#define key_mode 0x18
#define key_CANcel 0x88

char StrPower1[] = " *Power on* ";
char StrSetTime[] = " * Adjust time* ";
char StrSetDate[] = " * Adjust date* ";
char StrAlarm1[] = " * Set alarm 1* ";
char StrAlarm2[] = " * Set alarm 2* ";
unsigned char PORTC_MAP;
#bit BackLightEn = PORTC_MAP.3
unsigned char BackLightTimer;
int1 led;
#bit lcd_rs = PORTE.0
#bit lcd_rw = PORTE.1
#bit lcd_e= PORTE.2
#byte lcd_bus = PORTD
#byte lcd_dir = TRISD
#define PWM_on 0x0c
#define PWM_off 0x00
#define PWM_period 200
#define PWM_DC 100
unsigned char lcd_addr;
unsigned char KeyLine;
unsigned char KeyOld;
unsigned char KeyNew;

struct mTime {
unsigned char hourh; // hour,0~23
unsigned char hourl;
unsigned char minuteh; // minute,0~59
unsigned char minutel;
unsigned char secondh; // second,0~59
unsigned char secondl;
};
struct mTime CurrentTime = {1,2,0,0,0,0};
struct mTime AlarmTime1 = {0,7,0,0,0,0}; // 07:00:00
struct mTime AlarmTime2 = {1,3,3,0,0,0}; // 13:30:00
unsigned char AlarmStatus;
#bit Alarm1Enable = AlarmStatus.0
#bit Alarm2Enable = AlarmStatus.1
#bit Alarm1Alarm = AlarmStatus.2
#bit Alarm2Alarm = AlarmStatus.3
unsigned char Alarm1Cnt; // alarm1 second count
unsigned char Alarm2Cnt;
unsigned char CurrentMode;
#define mode_time 0
#define mode_set_time 1
#define mode_set_date 2
#define mode_set_alarm1 3
#define mode_set_alarm2 4
unsigned char adjust_item;
struct mDate {
unsigned char year1; //
unsigned char year2;
unsigned char year3;
unsigned char year4;
unsigned char monthh;
unsigned char monthl;
unsigned char dayh;
unsigned char dayl;
};
struct mDate CurrentDate = {2,0,0,3,0,1,0,1};
unsigned char *pStr;

// -------------------------------------------------------
unsigned char lcd_read_addr()
{
unsigned char ch;
lcd_dir = 0xff; // read from lcd
lcd_rs = 0;
lcd_rw = 1; // inst
lcd_e = 1;
#asm
nop
nop
nop
#endasm
ch = lcd_bus;
lcd_e = 0;
lcd_dir = 0x00; //set write to lcd
return ch;
}

// -------------------------------------------------------
unsigned char lcd_write_data(unsigned char ch)
{
while (lcd_busy)
{ restart_wdt(); }
lcd_rs = 1; // data
lcd_rw = 0; // write
lcd_bus = ch; // write out
lcd_e = 1;
#asm
nop
nop
nop
#endasm
lcd_e = 0;
return 'Y';
}

// -------------------------------------------------------
unsigned char lcd_write_inst(unsigned char ch)
{
while (lcd_busy)
{ restart_wdt(); }
lcd_rs = 0; // inst
lcd_rw = 0; // write
lcd_bus = ch;
lcd_e = 1;
#asm
nop
nop
nop
#endasm
lcd_e = 0;
return 'Y';
}


// -------------------------------------------------------
unsigned char lcd_read_data()
{
unsigned char ch;
while (lcd_busy)
{ restart_wdt(); }
lcd_dir = 0xff; // read from lcd
lcd_rs = 1; // data
lcd_rw = 1; // read
lcd_e = 1;
#asm
nop
nop
nop
#endasm
ch = lcd_bus; // read in
lcd_e = 0;
lcd_dir = 0x00; //set write to lcd
return ch;
}

// -------------------------------------------------------
void lcd_init()
{
unsigned char Tempch;
lcd_addr = 0;
delay_ms(100);
Tempch = 0x38; // 1-line mode,5x8 dots
lcd_write_inst(Tempch); // Function set
Tempch = 0x0f; // lcd on,cursor on,blink on
lcd_write_inst(Tempch); // Display on/off
Tempch = 0x06; // Increment mode,Entire shift off
lcd_write_inst(Tempch);
Tempch = 0x01; // clear display
lcd_write_inst(Tempch);
delay_ms(3);
}

// -------------------------------------------------------
//#int_timer1
//void timer1_interrupt(void)
#int_ccp2
void ccp2_interrupt(void)
{
//TMR1H = 0x80;
if (CurrentTime.secondl==9)
{
CurrentTime.secondl=0;
if (CurrentTime.secondh==5)
{
CurrentTime.secondh=0;
if (CurrentTime.minutel==9)
{
CurrentTime.minutel=0;
if (CurrentTime.minuteh==5)
{
CurrentTime.minuteh=0;
if (CurrentTime.hourl==9)
{
CurrentTime.hourl=0;
CurrentTime.hourh++;
}
else if((CurrentTime.hourl==3) && (CurrentTime.hourh==2))
{
CurrentTime.hourl=0;
CurrentTime.hourh=0;
if ((((CurrentDate.dayl == 8) || (CurrentDate.dayl == 9)) && (CurrentDate.dayh == 2) && (CurrentDate.monthl == 2) && (CurrentDate.monthh == 0)) ||
((CurrentDate.dayl == 0) && (CurrentDate.dayh == 3) && ((((CurrentDate.monthl == 4) || (CurrentDate.monthl == 6)
|| (CurrentDate.monthl == 9)) && (CurrentDate.monthh == 0)) || ((CurrentDate.monthl == 1) && (CurrentDate.monthh == 1)))) ||
((CurrentDate.dayl == 1) && (CurrentDate.dayh == 3)))
{
CurrentDate.dayl=1;
CurrentDate.dayh=0;
if ((CurrentDate.monthl == 2) && (CurrentDate.monthh == 1))
{
CurrentDate.monthl = 1;
CurrentDate.monthh = 0;
if (CurrentDate.year4 == 9)
{
CurrentDate.year4 = 0;
if (CurrentDate.year3 == 9)
{
CurrentDate.year3 = 0;
if (CurrentDate.year2 == 9)
{
CurrentDate.year2 = 0;
CurrentDate.year1++;
}
else
CurrentDate.year2++;
}
else
CurrentDate.year3++;
}
else
CurrentDate.year4++;
}
else if(CurrentDate.monthl == 9)
{
CurrentDate.monthl = 0;
CurrentDate.monthh++;
}
else
CurrentDate.monthl++;
}
else if(CurrentDate.dayl == 9)
{
CurrentDate.dayl=0;
CurrentDate.dayh++;
}
else
CurrentDate.dayl++;
}
else
CurrentTime.hourl++;
}
else
CurrentTime.minuteh++;
}
else
CurrentTime.minutel++;
}
else
CurrentTime.secondh++;
}
else
CurrentTime.secondl++;
if ((Alarm1Alarm == false) & (Alarm2Alarm == false))
{
led = 0;
CCP1CON = PWM_off;
}
else
{
if (led == 1)
{
led = 0;
PR2 = PWM_period; // set pwm period
CCPR1L = PWM_DC; // set pwm duty cycle
//CCP1CON = PWM_on;
}
else
{
led = 1;
PR2 = PWM_period/2; // set pwm period
CCPR1L = PWM_DC/2; // set pwm duty cycle
//CCP1CON = PWM_off;
}
}
Alarm1Cnt++;
Alarm2Cnt++;
if (BackLightEn == 0)
if (((BackLightTimer++)>=60) & (Alarm1Alarm == false) & (Alarm1Alarm == false))
BackLightEn = 1; // dISAble backlight
PORTC = PORTC_MAP;
//TMR1IF = 0;
//PIR1 = PIR2 = 0x00;
CCP2IF = 0;
}

// -------------------------------------------------------
unsigned char get_key(void)
{
unsigned char key_in,tmp;
TRISC = 0x03;
KeyLine = 0xf0;
PORTC = KeyLine | PORTC_MAP;
#asm
nop
nop
nop
#endasm
if ((PORTA & 0x0f) != 0)
{
tmp = 0x10;
for (KeyLine = tmp;KeyLine!=0;KeyLine = tmp)
{
PORTC = KeyLine | PORTC_MAP;
tmp = KeyLine <<1;
#asm
nop
nop
nop
#endasm
key_in = PORTA & 0x0f;
if (key_in != 0)
{
return (key_in | KeyLine);
}
}
return 0;
}
else
return 0;
}

// -------------------------------------------------------
void set_mode(void)
{
if (CurrentMode == mode_set_alarm2)
CurrentMode = mode_time;
else
{
CurrentMode++;
adjust_item = 0;
}
lcd_write_inst(0x01); // clear LCD display
lcd_write_inst(time_start_addr); // set LCD line1
if (CurrentMode == mode_set_time)
{
lcd_write_data(CurrentTime.hourh + '0');
lcd_write_data(CurrentTime.hourl + '0');
lcd_write_data(':');
lcd_write_data(CurrentTime.minuteh + '0');
lcd_write_data(CurrentTime.minutel + '0');
lcd_write_data(':');
lcd_write_data(CurrentTime.secondh + '0');
lcd_write_data(CurrentTime.secondl + '0');
pStr = StrSetTime;
}
else if(CurrentMode == mode_set_date)
{
lcd_write_data(CurrentDate.year1 + '0');
lcd_write_data(CurrentDate.year2 + '0');
lcd_write_data(CurrentDate.year3 + '0');
lcd_write_data(CurrentDate.year4 + '0');
lcd_write_data('/');
lcd_write_data(CurrentDate.monthh + '0');
lcd_write_data(CurrentDate.monthl + '0');
lcd_write_data('/');
lcd_write_data(CurrentDate.dayh + '0');
lcd_write_data(CurrentDate.dayl + '0');
pStr = StrSetDate;
}
else if(CurrentMode == mode_set_alarm1)
{
lcd_write_data(AlarmTime1.hourh + '0');
lcd_write_data(AlarmTime1.hourl + '0');
lcd_write_data(':');
lcd_write_data(AlarmTime1.minuteh + '0');
lcd_write_data(AlarmTime1.minutel + '0');
lcd_write_data(':');
lcd_write_data(AlarmTime1.secondh + '0');
lcd_write_data(AlarmTime1.secondl + '0');
lcd_write_data(' ');
lcd_write_data('O');
if (Alarm1Enable)
{
lcd_write_data('n');
}
else
{
lcd_write_data('f');
lcd_write_data('f');
}
pStr = StrAlarm1;
Alarm1Cnt =0;
}
else if(CurrentMode == mode_set_alarm2)
{
lcd_write_data(AlarmTime2.hourh + '0');
lcd_write_data(AlarmTime2.hourl + '0');
lcd_write_data(':');
lcd_write_data(AlarmTime2.minuteh + '0');
lcd_write_data(AlarmTime2.minutel + '0');
lcd_write_data(':');
lcd_write_data(AlarmTime2.secondh + '0');
lcd_write_data(AlarmTime2.secondl + '0');
lcd_write_data(' ');
lcd_write_data('O');
if (Alarm2Enable)
{
lcd_write_data('n');
}
else
{
lcd_write_data('f');
lcd_write_data('f');
}
pStr = StrAlarm2;
Alarm2Cnt = 0;
}
lcd_write_inst(0xc0); // set LCD line2
if (CurrentMode != mode_time)
{
for (;*pStr!=0;pStr++)
{ // write hint message
lcd_write_data(*pStr);
}
lcd_write_inst(0x0f); // LCD cursor on
lcd_write_inst(time_start_addr); // move cursor to start
}
else // time mode,write date to second line
{
lcd_write_inst(0x0c); // LCD sursor off
/* lcd_write_inst(0xc0 + 3); // set date start address
lcd_write_data(CurrentDate.year1 + '0');
lcd_write_data(CurrentDate.year2 + '0');
lcd_write_data(CurrentDate.year3 + '0');
lcd_write_data(CurrentDate.year4 + '0');
lcd_write_data('/');
lcd_write_data(CurrentDate.monthh + '0');
lcd_write_data(CurrentDate.monthl + '0');
lcd_write_data('/');
lcd_write_data(CurrentDate.dayh + '0');
lcd_write_data(CurrentDate.dayl + '0');
*/}
if (CurrentMode == mode_set_time)
{
lcd_write_inst(time_start_addr); // move cursor to start
}
else if (CurrentMode == mode_set_date)
{
lcd_write_inst(time_start_addr); // move cursor to start
}
else if (CurrentMode == mode_set_alarm1)
{
lcd_write_inst(time_secondl_addr+3);
adjust_item = 6;
}
else if (CurrentMode == mode_set_alarm2)
{
lcd_write_inst(time_secondl_addr+3);
adjust_item = 6;
}
else
{
lcd_write_inst(0x0c); // LCD cursor off
}
}


// -------------------------------------------------------
void set_date(void)
{
if (adjust_item == 0) // adjust year
{
if ((KeyNew >=0) & (KeyNew <= 9))
{
CurrentDate.year1 = KeyNew;
lcd_write_data(CurrentDate.year1 + '0');
//lcd_write_inst(time_start_addr);
adjust_item ++;
}
else if (KeyNew == key_left)
{
adjust_item = 7;
lcd_write_inst(time_start_addr + 9);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_start_addr + 1);
}
}
else if(adjust_item == 1)
{
if ((KeyNew >=0) & (KeyNew <= 9))
{
CurrentDate.year2 = KeyNew;
lcd_write_data(CurrentDate.year2 + '0');
//lcd_write_inst(time_start_addr + 1);
adjust_item ++;
}
else if (KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_start_addr + 0);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_start_addr + 2);
}
}
else if(adjust_item == 2)
{
if ((KeyNew >=0) & (KeyNew <= 9))
{
CurrentDate.year3 = KeyNew;
lcd_write_data(CurrentDate.year3 + '0');
//lcd_write_inst(time_start_addr + 2);
adjust_item ++;
}
else if (KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_start_addr + 1);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_start_addr + 3);
}
}
else if(adjust_item == 3)
{
if ((KeyNew >=0) & (KeyNew <= 9))
{
CurrentDate.year4 = KeyNew;
lcd_write_data(CurrentDate.year4 + '0');
//lcd_write_inst(time_start_addr + 3);
adjust_item ++;
lcd_write_inst(time_start_addr + 5);
}
else if (KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_start_addr + 2);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_start_addr + 5);
}
}
else if(adjust_item == 4)
{
if (((CurrentDate.monthl>2) & (KeyNew == 0)) | ((CurrentDate.monthl == 0) & (KeyNew == 1))
| (((CurrentDate.monthl == 1) | (CurrentDate.monthl == 2)) & (KeyNew <2)))
{
CurrentDate.monthh = KeyNew;
lcd_write_data(CurrentDate.monthh + '0');
//lcd_write_inst(time_start_addr + 5);
adjust_item ++;
}
else if (KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_start_addr + 3);
}
else if (KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_start_addr + 6);
}
}
else if(adjust_item == 5)
{
if (((CurrentDate.monthh == 3) & (KeyNew <2)) | ((CurrentDate.monthh != 3) & (KeyNew >=0) & (KeyNew <=9)))
{
CurrentDate.monthl = KeyNew;
lcd_write_data(CurrentDate.monthl + '0');
//lcd_write_inst(time_start_addr + 6);
adjust_item ++;
lcd_write_inst(time_start_addr + 8);
}
else if (KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_start_addr + 5);
}
else if (KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_start_addr + 8);
}
}
else if(adjust_item == 6)
{
if (((CurrentDate.dayl>1) & ((KeyNew == 1) | (KeyNew == 2))) | ((CurrentDate.dayl == 0) & (KeyNew >0) & (KeyNew<4))
| ((CurrentDate.dayl == 1) & (KeyNew <4)))
{
CurrentDate.dayh = KeyNew;
lcd_write_data(CurrentDate.dayh + '0');
//lcd_write_inst(time_start_addr + 8);
adjust_item ++;
}
else if (KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_start_addr + 6);
}
else if (KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_start_addr + 9);
}
}
else if(adjust_item == 7)
{
if (((CurrentDate.dayh == 3) & (KeyNew <2)) | ((CurrentDate.dayh != 3) & (KeyNew >=0) & (KeyNew <=9)))
{
CurrentDate.dayl = KeyNew;
lcd_write_data(CurrentDate.dayl + '0');
//lcd_write_inst(time_start_addr + 9);
adjust_item ++;
lcd_write_inst(time_start_addr + 0);
}
else if (KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_start_addr + 8);
}
else if (KeyNew == key_right)
{
adjust_item = 0;
lcd_write_inst(time_start_addr + 0);
}
}
}

// -------------------------------------------------------
void set_time(void)
{
if (adjust_item == 0) // set hourh
{
if (((CurrentTime.hourl <4) & (KeyNew < 3)) | ((CurrentTime.hourl >3) & (KeyNew <2)))
{
CurrentTime.hourh = KeyNew;
lcd_write_data(CurrentTime.hourh + '0'); // refresh hourh
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
}
else if(KeyNew == key_left)
{
adjust_item = 5;
lcd_write_inst(time_secondl_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_hourl_addr);
}
}
else if (adjust_item == 1) // set hourl
{
if (((CurrentTime.hourh == 2) & (KeyNew < 4)) | ((CurrentTime.hourh < 2) & (KeyNew <=9)))
{
CurrentTime.hourl = KeyNew;
lcd_write_data(CurrentTime.hourl + '0'); // refresh hourl
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
lcd_write_inst(time_minuteh_addr);
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_hourh_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_minuteh_addr);
}
}
else if (adjust_item == 2) // set minuteh
{
if (KeyNew <6)
{
CurrentTime.minuteh = KeyNew;
lcd_write_data(CurrentTime.minuteh + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_hourl_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_minutel_addr);
}
}
else if (adjust_item == 3) // set minutel
{
if ((KeyNew >=0) & (KeyNew <=9))
{
CurrentTime.minutel = KeyNew;
lcd_write_data(CurrentTime.minutel + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
lcd_write_inst(time_secondh_addr);
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_minuteh_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_secondh_addr);
}
}
else if (adjust_item == 4) // set secondh
{
if (KeyNew <6)
{
CurrentTime.secondh = KeyNew;
lcd_write_data(CurrentTime.secondh + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
}
else if(KeyNew == key_left)
{
adjust_item --;
&nb, sp; lcd_write_inst(time_minutel_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_secondl_addr);
}
}
else if (adjust_item == 5) // set secondl
{
if ((KeyNew >=0) & (KeyNew <=9))
{
CurrentTime.secondl = KeyNew;
lcd_write_data(CurrentTime.secondl + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item = 0;
lcd_write_inst(time_hourh_addr);
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_secondh_addr);
}
else if(KeyNew == key_right)
{
adjust_item = 0;
lcd_write_inst(time_hourh_addr);
}
}
}

// -------------------------------------------------------
void set_alarm1(void)
{
if (adjust_item == 0) // set hourh
{
if (((AlarmTime1.hourl <4) & (KeyNew < 3)) | ((AlarmTime1.hourl >3) & (KeyNew <2)))
{
AlarmTime1.hourh = KeyNew;
lcd_write_data(AlarmTime1.hourh + '0'); // refresh hourh
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
}
else if(KeyNew == key_left)
{
adjust_item = 6;
lcd_write_inst(time_secondl_addr + 3);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_hourl_addr);
}
}
else if (adjust_item == 1) // set hourl
{
if (((AlarmTime1.hourh == 2) & (KeyNew < 4)) | ((AlarmTime1.hourh < 2) & (KeyNew <=9)))
{
AlarmTime1.hourl = KeyNew;
lcd_write_data(AlarmTime1.hourl + '0'); // refresh hourl
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
lcd_write_inst(time_minuteh_addr);
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_hourh_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_minuteh_addr);
}
}
else if (adjust_item == 2) // set minuteh
{
if (KeyNew <6)
{
AlarmTime1.minuteh = KeyNew;
lcd_write_data(AlarmTime1.minuteh + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_hourl_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_minutel_addr);
}
}
else if (adjust_item == 3) // set minutel
{
if ((KeyNew >=0) & (KeyNew <=9))
{
AlarmTime1.minutel = KeyNew;
lcd_write_data(AlarmTime1.minutel + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
lcd_write_inst(time_secondh_addr);
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_minuteh_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_secondh_addr);
}
}
else if (adjust_item == 4) // set secondh
{
if (KeyNew <6)
{
AlarmTime1.secondh = KeyNew;
lcd_write_data(AlarmTime1.secondh + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_minutel_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_secondl_addr);
}
}
else if (adjust_item == 5) // set secondl
{
if ((KeyNew >=0) & (KeyNew <=9))
{
AlarmTime1.secondl = KeyNew;
lcd_write_data(AlarmTime1.secondl + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
lcd_write_inst(time_secondl_addr+3);
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_secondh_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_secondl_addr+3);
}
}
else if (adjust_item == 6) // set on/off
{
if ((KeyNew == key_up) | (KeyNew == key_down))
{
if (Alarm1Enable)
{
Alarm1Enable =false; // disable alarm1
lcd_write_data('f');
lcd_write_data('f');
}
else
{
Alarm1Enable =true; // enable alarm1
lcd_write_data('n');
lcd_write_data(' ');
}
//lcd_write_inst(time_secondl_addr+3);
adjust_item = 0;
lcd_write_inst(time_hourh_addr);
Alarm1Cnt = 0;
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_secondl_addr);
}
else if(KeyNew == key_right)
{
adjust_item = 0;
lcd_write_inst(time_hourh_addr);
}
}

}

// -------------------------------------------------------
void set_alarm2(void)
{
if (adjust_item == 0) // set hourh
{
if (((AlarmTime2.hourl <4) & (KeyNew < 3)) | ((AlarmTime2.hourl >3) & (KeyNew <2)))
{
AlarmTime2.hourh = KeyNew;
lcd_write_data(AlarmTime2.hourh + '0'); // refresh hourh
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
}
else if(KeyNew == key_left)
{
adjust_item = 6;
lcd_write_inst(time_secondl_addr+3);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_hourl_addr);
}
}
else if (adjust_item == 1) // set hourl
{
if (((AlarmTime2.hourh == 2) & (KeyNew < 4)) | ((AlarmTime2.hourh < 2) & (KeyNew <=9)))
{
AlarmTime2.hourl = KeyNew;
lcd_write_data(AlarmTime2.hourl + '0'); // refresh hourl
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
lcd_write_inst(time_minuteh_addr);
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_hourh_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_minuteh_addr);
}
}
else if (adjust_item == 2) // set minuteh
{
if (KeyNew <6)
{
AlarmTime2.minuteh = KeyNew;
lcd_write_data(AlarmTime2.minuteh + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_hourl_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_minutel_addr);
}
}
else if (adjust_item == 3) // set minutel
{
if ((KeyNew >=0) & (KeyNew <=9))
{
AlarmTime2.minutel = KeyNew;
lcd_write_data(AlarmTime2.minutel + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
lcd_write_inst(time_secondh_addr);
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_minuteh_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_secondh_addr);
}
}
else if (adjust_item == 4) // set secondh
{
if (KeyNew <6)
{
AlarmTime2.secondh = KeyNew;
lcd_write_data(AlarmTime2.secondh + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_minutel_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_secondl_addr);
}
}
else if (adjust_item == 5) // set secondl
{
if ((KeyNew >=0) & (KeyNew <=9))
{
AlarmTime2.secondl = KeyNew;
lcd_write_data(AlarmTime2.secondl + '0');
//lcd_write_inst(0x10); // move cursor back
adjust_item ++;
lcd_write_inst(time_secondl_addr+3);
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_secondh_addr);
}
else if(KeyNew == key_right)
{
adjust_item ++;
lcd_write_inst(time_secondl_addr+3);
}
}
else if (adjust_item == 6) // set on/off
{
if ((KeyNew == key_up) | (KeyNew == key_down))
{
if (Alarm2Enable)
{
Alarm2Enable =false; // disable alarm2
lcd_write_data('f');
lcd_write_data('f');
}
else
{
Alarm2Enable =true; // enable alarm2
lcd_write_data('n');
lcd_write_data(' ');
}
//lcd_write_inst(time_secondl_addr+3);
adjust_item = 0;
lcd_write_inst(time_hourh_addr);
Alarm2Cnt = 0;
}
else if(KeyNew == key_left)
{
adjust_item --;
lcd_write_inst(time_secondl_addr);
}
else if(KeyNew == key_right)
{
adjust_item = 0;
lcd_write_inst(time_hourh_addr);
}
}

}

// -------------------------------------------------------
void main(void)
{
unsigned char cnt;
TRISC = 0x03; // PORTC.3 drive led,low active
PORTC_MAP = 0x00;
led = 0;
BackLightEn = 0;
BackLightTimer = 0;
PORTC = PORTC_MAP;
TRISA = 0xff; // low half byte as keyscan in
TRISE = 0x00;
ADCON0 = 0x00;
ADCON1 = 0x06; // all digital I/Os
lcd_init();
INTCON = 0x00;
lcd_write_inst(0x80); // set lcd ddram address
for (pStr = StrPower1;*pStr!=0;pStr++)
{
lcd_write_data(*pStr);
}
lcd_write_inst(0x0c); // LCD cursor off
PIR1 = PIR2 = 0x00;
T1CON = 0x0f; // T1CON: -- T1CKPS1 T1CPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON
TMR1H = 0x80;
TMR1L = 0x00;
TMR1IF = 0;
CCPR2H = 0x7f;
CCPR2L = 0xff;
CCP2CON = 0x0b; // compare mode,set ccp2if,reset tmr1
CCP2IF = 0;
for (cnt=5;cnt>0;cnt--) // test for 5sec.
{
lcd_write_inst(0xc0+8); // set LCD adress
lcd_write_data(cnt + '0');
while (CCP2IF == 0) // wait for timer1 overflow
{
restart_wdt();
}
//TMR1H = 0x80;
CCP2IF = 0;
}
// write current date to lcd line 2
lcd_write_inst(0x01); // clear LCD display
lcd_write_inst(0xc0+3); // set LCD line2
lcd_write_data(CurrentDate.year1 + '0');
lcd_write_data(CurrentDate.year2 + '0');
lcd_write_data(CurrentDate.year3 + '0');
lcd_write_data(CurrentDate.year4 + '0');
lcd_write_data('/');
lcd_write_data(CurrentDate.monthh + '0');
lcd_write_data(CurrentDate.monthl + '0');
lcd_write_data('/');
lcd_write_data(CurrentDate.dayh + '0');
lcd_write_data(CurrentDate.dayl + '0');
Alarm1Enable = true; //false;
Alarm2Enable = true; //false;
INTCON = 0xc0; // set GIE & PEIE
//TMR1IE = 1; // enable timer1 interrupt
CCP2IE = 1; // enable ccp2 interrupt
CurrentMode = mode_time;
Alarm1Cnt = Alarm2Cnt = 0;
T2CON = 0x07; // T2CON: - TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
// timer2 enable,prescaler = 16
PR2 = PWM_period; // set pwm period
CCPR1L = PWM_DC; // set pwm duty cycle
CCP1CON = PWM_off;
while(1)
{
restart_wdt();
KeyOld = get_key();
delay_ms(20);
KeyNew = get_key();
if (((KeyNew & 0x0f) != 0x00) & (KeyNew == KeyOld))
{ // some key pressed
if (BackLightEn == 1) // back light not on
{
BackLightEn = 0; // enable back-light
BackLightTimer = 0; // start delay counter
}
else
{
if (KeyNew == key_0)
KeyNew = 0;
else if(KeyNew == key_1)
KeyNew = 1;
else if(KeyNew == key_2)
KeyNew = 2;
else if(KeyNew == key_3)
KeyNew = 3;
else if(KeyNew == key_4)
KeyNew = 4;
else if(KeyNew == key_5)
KeyNew = 5;
else if(KeyNew == key_6)
KeyNew = 6;
else if(KeyNew == key_7)
KeyNew = 7;
else if(KeyNew == key_8)
KeyNew = 8;
else if(KeyNew == key_9)
KeyNew = 9;
else if (KeyNew == key_mode) // MODE key pressed
set_mode();
else if (KeyNew == key_cancel) // cancel buzzy
{
led = 0;
CCP1CON = PWM_off;
BackLightEn = 1;
BackLightTimer = 0;
}
if (CurrentMode == mode_set_time)
{
set_time();
}
else if (CurrentMode == mode_set_date)
{
set_date();
}
else if (CurrentMode == mode_set_alarm1)
{
set_alarm1();
}
else if (CurrentMode == mode_set_alarm2)
{
set_alarm2();
}
}
do // wait for key released
{
delay_ms(30);
KeyNew = get_key();
restart_wdt();
BackLightTimer = 0; // key pressed yet
}while ((KeyNew& 0x0f) != 0x00);
KeyOld = KeyNew = 0x00;
}
if ((CurrentMode == mode_set_time) | (CurrentMode == mode_time))
{ // refresh time display,bacause int_timer1 dosn't do this
lcd_addr = lcd_read_addr() & 0x7f; // save cursor location
lcd_write_inst(time_start_addr); // set LCD line1
lcd_write_data(CurrentTime.hourh + '0');
lcd_write_data(CurrentTime.hourl + '0');
lcd_write_data(':');
lcd_write_data(CurrentTime.minuteh + '0');
lcd_write_data(CurrentTime.minutel + '0');
lcd_write_data(':');
lcd_write_data(CurrentTime.secondh + '0');
lcd_write_data(CurrentTime.secondl + '0');
lcd_write_inst(lcd_addr | 0x80); // resume cursor location
}
if (CurrentMode == mode_time)
{ // refresh date display
lcd_addr = lcd_read_addr() & 0x7f; // save cursor location
lcd_write_inst(0xc0 + 3); // set LCD line2
lcd_write_data(CurrentDate.year1 + '0');
lcd_write_data(CurrentDate.year2 + '0');
lcd_write_data(CurrentDate.year3 + '0');
lcd_write_data(CurrentDate.year4 + '0');
lcd_write_data('/');
lcd_write_data(CurrentDate.monthh + '0');
lcd_write_data(CurrentDate.monthl + '0');
lcd_write_data('/');
lcd_write_data(CurrentDate.dayh + '0');
lcd_write_data(CurrentDate.dayl + '0');
lcd_write_inst(lcd_addr | 0x80); // resume cursor location
}
if (Alarm1Enable)
{
if((AlarmTime1.hourh == CurrentTime.hourh) & (AlarmTime1.hourl == CurrentTime.hourl)
& (AlarmTime1.minuteh == CurrentTime.minuteh) & (AlarmTime1.minutel == CurrentTime.minutel)
& (AlarmTime1.secondh == CurrentTime.secondh) & (AlarmTime1.secondl == CurrentTime.secondl))
{
Alarm1Alarm = true;
CCP1CON = PWM_on;
BackLightEn = 0;
}
if (Alarm1Cnt > 120) // two minutes
{
Alarm1Alarm = false;
Alarm1Cnt = 0;
BackLightEn = 1;
BackLightTimer = 0;
}
}
else
{
Alarm1Alarm = false;
Alarm1Cnt = 0;
}
if (Alarm2Enable)
{
if((AlarmTime2.hourh == CurrentTime.hourh) & (AlarmTime2.hourl == CurrentTime.hourl)
& (AlarmTime2.minuteh == CurrentTime.minuteh) & (AlarmTime2.minutel == CurrentTime.minutel)
& (AlarmTime2.secondh == CurrentTime.secondh) & (AlarmTime2.secondl == CurrentTime.secondl))
{
Alarm2Alarm = true;
CCP1CON = PWM_on;
BackLightEn = 0;
}
if (Alarm2Cnt > 120) // two minutes
{
Alarm2Alarm = false;
Alarm2Cnt = 0;
BackLightEn = 1;
BackLightTimer = 0;
}
}
else
{
Alarm2Alarm = false;
Alarm2Cnt = 0;
}
}
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分,通常嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板,事实上所有带有数字接口的设备,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整...

关键字: 嵌入式 语言 技术

摘 要:本作品由1.8寸TFT彩屏、DS1302时钟芯片,ADXL345三轴重力加速度芯片、E2PROM,锂 电池充放电保护板以及DC-DC升压模块组成,通过89C516RD+控制整个系统。DS1302起计时的功能, A...

关键字: 闹钟 时钟芯片 加速度芯片

语音编码器的主要功能就是把用户语音的PCM(脉冲编码调制)样值编码成少量的比特(帧)。这种方法使得语音在连路产生误码、网络抖动和突发传输时具有健壮性(Robustness)。在接收端,语音帧先被误码为PCM语音样值,然后...

关键字: 语音编码器 PCM 语言

模糊控制算法(理论知识)

关键字: 模糊控制 语言

任何一种“语言”,都是各种“语言特性”的组合。

关键字: 程序 语言 嵌入式

由于新冠疫情,口罩已经成为了一种日常用品。而日本似乎十分热衷于研究不同类型的口罩,例如为了应对夏季的“冰镇口罩”和带微型电扇的口罩,还有为了女性美观研发的“小脸美口罩”。 8月4日,据媒体报道,日本一

关键字: 口罩 日本 智能 翻译 语言

研究表明,人在老年时学习第二语言也可以改善认知功能。 虽然我们大多数人都容易学会技术,但学习语言从未如此简单。

关键字: Android 语言 verbling

航科院民用无人机检验中心在湖北武汉对易瓦特科技股份公司的EWZ-S8八旋翼无人机进行了无人机系统安全能力二级围栏检验。本次检验耗时3个多小时。检验中心检验员针对EWZ-S8八旋翼无人机进行了无人

关键字: 无人机 语言

什么是51单片机?它有什么注意事项?编程也好设计也罢,都要有遵循的规则。可以发挥自己的创新但是要顾全大局,不能随意的编程。下面分享关于51单片机编程的一些规则,希望能帮到大家,避免大家四处碰壁。

关键字: 51单片机 编程 语言

1月15日,打着中科院计算所出品、完全自主开发旗号的国产编程语言“木兰”引发广泛关注,但很快被发现是基于Python语言套壳、换皮而来的产物。 面对质疑,中科院计算所编译实验室员工、“木兰”语言研发团

关键字: 中科院 国产 木兰 编程 语言 刘雷 计算所 重罚
关闭
关闭