访问手机版页面
你的位置:老古开发网 > Pic单片机 > PIC16系列单片机 > 正文  
如何利用PIC16F877单片机的c语言写一个时闹钟程序
内容导读:

用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;

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;

}

}

}

标签:PIC16F877单片机,闹钟,C语言,
来源:未知 作者:工程师周亮 时间:2018/10/30 15:53:00
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐