📄 时钟程序.c
字号:
#include<p18f452.h>
#include<pwm.h>
#include<adc.h>
#include<delays.h>
#include<timers.h>
#include"p18LCD.h"
void choosekey();
void timeprocess();
void timedisplay();
void setdisplay();
void temprocess(unsigned int AD_temp);
void PORDinitialize();
unsigned char displaycode(unsigned char);
void ring();
#pragma udata access My_Access_RAM
near unsigned int AD_temp;
union
{
unsigned int AD_10bit; // contant is 10-bit A/D Result
unsigned char AD[2]; // AD[0] is A/D Low byte, AD[1] is A/D High Byte
} near AD_Result;
#pragma udata
static char hourl=0,hourh=0,minl=9,minh=0,secl=0,sech=5,day=5;
int result=0;
unsigned char DS_Zero_FLG;
static int i=0,j=0;
const int r[]={100,0,100,0,100,0,100,0,200,0,200,0,200,0,200,0,400,0,400,0,400,0,400,0,600,0,600,0,600,0,600,0};
#pragma code high_vector=0x08
void low_interrupt (void)
{
_asm GOTO timeprocess _endasm
}
#pragma code
#pragma interruptlow timeprocess save=PROD
void choosekey(){
if(INTCONbits.INT0IF==1) //有外部中断
{INTCONbits.INT0IF=0;
//测试ra4 ?????
while(PORTAbits.RA4==1){ //RA4按下,设定时间
OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_3ANA_0REF,
ADC_CH0 & ADC_INT_OFF);
//AD模块初始化,用于选择按键,通道0
Delay10TCYx(5); //delay
ConvertADC(); //start adc
while(BusyADC()) {;}
result=ReadADC(); //read result
CloseADC();
if(((result/100)==5)&&(((result%100)/10)==9))
{ Delay10KTCYx(80);minl++;
if(minl==10) minl=0;setdisplay();} //k4设置分低位
else if(((result/100)==3)&&(((result%100)/10)==4))
{Delay10KTCYx(80);
minh++;
if(minh==6) minh=0;setdisplay();} //k3设置分高位
else if(((result/100)==4)&&(((result%100)/10)==0))
{Delay10KTCYx(80);
hourl++;
if((hourl==10)||((hourl>=4)&&(hourh>=2))) hourl=0;
setdisplay();
} //k2设置小时低位
else if(((result/100)==5)&&(((result%100)/10)==1))
{Delay10KTCYx(80);
hourh++;
if((hourh==3)||((hourl>=4)&&(hourh>=2))) hourh=0;
setdisplay();
} //k1设置小时高位
else if(((result/100)==3)&&(((result%100)/10)==9))
{Delay10KTCYx(80);
day++;
if(day==8) day=0; setdisplay(); }
} //k9设置星期
}
timedisplay();} //通过AD选择按键以设置时间
void setdisplay(){
LCD_Set_Cursor(0,2);
putcLCD(displaycode(hourh));
LCD_Set_Cursor(0,3);
putcLCD(displaycode(hourl));
LCD_Set_Cursor(0,4);
putcLCD(':');
LCD_Set_Cursor(0,5);
putcLCD(displaycode(minh));
LCD_Set_Cursor(0,6);
putcLCD(displaycode(minl));
LCD_Set_Cursor(0,7);
putcLCD(':');
LCD_Set_Cursor(0,8);
putcLCD(displaycode(sech));
LCD_Set_Cursor(0,9);
putcLCD(displaycode(secl));
LCD_Set_Cursor(0,11);
switch(day){
case 1: putcLCD('M');
putcLCD('o');
putcLCD('n');break;
case 2: putcLCD('T');
putcLCD('u');
putcLCD('e');break;
case 3: putcLCD('W');
putcLCD('e');
putcLCD('d');break;
case 4: putcLCD('T');
putcLCD('h');
putcLCD('u');break;
case 5: putcLCD('F');
putcLCD('r');
putcLCD('i');break;
case 6: putcLCD('S');
putcLCD('a');
putcLCD('t');break;
case 7: putcLCD('S');
putcLCD('u');
putcLCD('n');
}
LCD_Set_Cursor(1,4);
putcLCD('S');
putcLCD('e');
putcLCD('t');
putcLCD(' ');
putcLCD('t');
putcLCD('i');
putcLCD('m');
putcLCD('e');
putcLCD(' ');
} //设置时间时的显示
unsigned char displaycode(unsigned char data)
{ if(data==0)
{ if(DS_Zero_FLG) return' ';
else return '0';
}
else { DS_Zero_FLG=0;
return(data+='0');
}
} //将要显示的数据转换为ASC码
void timeprocess(){
if(INTCONbits.TMR0IF==1)
{INTCONbits.TMR0IF = 0;
secl++;
if(secl==10){
secl=0;sech++;
}
if(sech==6){sech=0;minl++;}
if(minl==10){minl=0;minh++;
ring();} //10分钟时铃声响
if(minh==6){minh=0;hourl++;}
if(hourl==10){hourh++;hourl=0;}
if((hourh==2)&&(hourl==4)){secl=0;sech=0;minl=0;minh=0;
hourl=0;hourh=0;day++;
if(day==8) day=1; }
TMR0H=0XC2;
TMR0L=0XF8;
timedisplay(); }
choosekey();
} //时间处理
void timedisplay(){ //显示时间
LCD_Set_Cursor(0,2);
putcLCD(displaycode(hourh));
LCD_Set_Cursor(0,3);
putcLCD(displaycode(hourl));
LCD_Set_Cursor(0,4);
putcLCD(':');
LCD_Set_Cursor(0,5);
putcLCD(displaycode(minh));
LCD_Set_Cursor(0,6);
putcLCD(displaycode(minl));
LCD_Set_Cursor(0,7);
putcLCD(':');
LCD_Set_Cursor(0,8);
putcLCD(displaycode(sech));
LCD_Set_Cursor(0,9);
putcLCD(displaycode(secl));
LCD_Set_Cursor(0,11);
switch(day){
case 1: putcLCD('M');
putcLCD('o');
putcLCD('n');break;
case 2: putcLCD('T');
putcLCD('u');
putcLCD('e');break;
case 3: putcLCD('W');
putcLCD('e');
putcLCD('d');break;
case 4: putcLCD('T');
putcLCD('h');
putcLCD('u');break;
case 5: putcLCD('F');
putcLCD('r');
putcLCD('i');break;
case 6: putcLCD('S');
putcLCD('a');
putcLCD('t');break;
case 7: putcLCD('S');
putcLCD('u');
putcLCD('n');
}
}
void ring(){
OpenPWM1(0xff);
if(j==32) j=0;
i=r[j++];
SetDCPWM1(i);
Delay10KTCYx(100);
ClosePWM1();
}
void PORTinitialize()
{
TRISD=0; //D口用于输出
INTCONbits.INT0IE=1; //使能INT0外部引脚中断
INTCON2bits.INTEDG0=1; //上升沿触发中断
PORTD=0x00;
TRISA=0XFB; //
TRISB=0XFF;
TRISCbits.TRISC2=0;
}
void temprocess(unsigned int AD_temp) //温度处理
{
putcLCD(' ');
putcLCD('T');
putcLCD('e');
putcLCD('m');
putcLCD('p');
putcLCD('='); DS_Zero_FLG=1; putcLCD(displaycode(AD_temp/1000)); AD_temp=AD_temp%1000; putcLCD(displaycode(AD_temp/100)); AD_temp=AD_temp%100; putcLCD(displaycode(AD_temp/10)); AD_temp=AD_temp%10; putcLCD(AD_temp+='0');
putcLCD(' ');
putcLCD('C');
putcLCD(' ');
}
void main()
{ OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_3ANA_0REF,
ADC_CH1 & ADC_INT_OFF);
PORTinitialize();
OpenTimer0(TIMER_INT_ON&T0_16BIT&T0_SOURCE_INT&T0_PS_1_256);
OpenTimer2(T2_PS_1_4&T2_POST_1_16);
INTCONbits.GIE = 1;
TMR0H=0XC2;
TMR0L=0XF8;
OpenLCD( );
timeprocess();
timedisplay();
while(1)
{OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_3ANA_0REF,
ADC_CH1 & ADC_INT_OFF);
ADCON0bits.GO=1; // Start to convert the A/D while(ADCON0bits.GO);
Delay10KTCYx(255) ; // Waiting A/D until done AD_temp=ReadADC();
AD_temp=AD_temp/10;
LCD_Set_Cursor(1,1);
temprocess(AD_temp);}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -