?? rtc._c
字號:
// **************************************************************
// *** 廣 州 天 河 雙 龍 電 子 公 司 ***
// *** http://www.sl.com.cn ***
// *** 實驗: RTC ***
// *** 作者:zxy@sl.com.cn ***
// *** 2006年3月28日 ***
// *** 目標MCU:MEGA169 晶振:內部(INT)8MHZ ***
// **************************************************************
//此實驗需具備AD轉換知識
//通過按鍵修改時鐘值,S1為選位鍵,S2為增1,S4為減1
#include <iom169v.h>
#include <macros.h>
//鍵值定義,以目標實驗板際測取鍵值范圍為準
#define s1 (adc_old<0x03)
//200h
#define s2 ((adc_old>0x180)&&(adc_old<0x220))
//2a6h
#define s3 ((adc_old>0x2B0)&&(adc_old<0x2CF))
//2fbh
#define s4 ((adc_old>0x2D0)&&(adc_old<0x310))
//326h
#define s5 ((adc_old>0x310)&&(adc_old<0x345))
extern const unsigned char seg_table[16];
extern unsigned char led_buff[3];
extern void delay_ms(unsigned int time);
extern void display(void);
unsigned int adc_rel;//AD轉換結果
unsigned int i=0,j=0,k=0;
//E、B口初始化
void portE_B(void)
{
DDRE=0xff;//E、B口初始化
PORTE=0xff;
DDRB|=0xf0;
PORTD|=0xf0;
}
//ADC初始化
void adc_init(void)
{
ADCSRA = 0x00; //設置前,先關閉ADC
ADMUX =(1<<REFS0)|(1<<MUX0);//選擇內部AVCC為基準,單端輸入口為ADC0
ACSR =(1<<ACD);//關閉模擬比較器,禁止位P148
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC時鐘64分頻
}
//定時器初始化
void timer2_init(void)
{
TIMSK2 = 0x00;
ASSR = 1<<AS2; //異步時鐘
TCNT2 = 0xE0; //定時時間1秒
TCCR2A = (1<<CS22)|(1<<CS21)|(1<<CS20); //分頻比1024,0x07
SEI();
}
#pragma interrupt_handler adc_isr:20 int_isr:6
//ADC完成中斷
void adc_isr(void)
{
adc_rel=ADC&0x3ff;
ADMUX=(1<<REFS0)|(1<<MUX0);//選擇內部AVCC為基準
ADCSRA|=(1<<ADSC);//啟動AD轉換
}
//定時器中斷
void int_isr(void)
{ int n;
TCNT2 = 0xE0;
led_buff[0]=seg_table[i]; //個位
led_buff[1]=seg_table[j]; //十位
led_buff[2]=seg_table[k]; //百位
i++;
if(i==10) //十進位
{
i=0;
j++;
if(j==6) //六進位
{
j=0;
k++;
if(k==10) //十進位
{i=0;j=0;k=0;}
}
}
}
unsigned int adc_old;
void keyScan(void)
{
if(adc_old!=adc_rel) //是否有鍵按下
adc_old=adc_rel; //有鍵按下,讀取鍵值
display();
while(s1) //是否為S1鍵
{ display();
delay_ms(200); //按鍵消抖25MS
adc_old=adc_rel; //讀取鍵值
//**********個位處理
while(!s1) //是否為S1鍵,不是S1時進入等待狀態,并選中個位
{
adc_old=adc_rel;
TIMSK2=0x00; //屏蔽定時器中斷
PORTE=seg_table[i]&0x7f; //點亮個位及其小數點
PORTB=0xef; //點亮個位
delay_ms(1);
PORTE=seg_table[j]; //點亮十位
PORTB=0XDF; //點亮十位
delay_ms(1);
PORTE=seg_table[k]; //點亮百位
PORTB=0XBF; //點亮百位
delay_ms(1);
adc_old=adc_rel; //讀取鍵值
if(s2) //是否為S3 ,如果是S3,個位加1
{
int x;
for(x=50;x>0;x--) //消抖且保證LED顯示正常
{
PORTE=seg_table[i]&0x7f;
PORTB=0xef;
delay_ms(1);
PORTE=seg_table[j];
PORTB=0XDF;
delay_ms(1);
PORTE=seg_table[k];
PORTB=0XBF;
delay_ms(1);
}
i++; //個位加1
if(i==10)
{
i=0;
}
}
if(s4) //是否為S4 ,如果是S4,個位減1
{int x;
for(x=50;x>0;x--) //消抖且保證LED顯示正常
{
PORTE=seg_table[i]&0x7f; //點亮個位及其小數點
PORTB=0xef; //點亮個位
delay_ms(1);
PORTE=seg_table[j]; //點亮十位
PORTB=0XDF; //點亮十位
delay_ms(1);
PORTE=seg_table[k]; //點亮百位
PORTB=0XBF; //點亮百位
delay_ms(1);
}
i--; //減1
if(i==-1)
{
i=9;
}
}
}
delay_ms(200);
adc_old=adc_rel;
//********十位處理
while(!s1) //同上
{
adc_old=adc_rel;
TIMSK2=0x00;
PORTE=seg_table[i]; //點亮個位
PORTB=0xef; //點亮個位
delay_ms(1);
PORTE=seg_table[j]&0x7f; //點亮十位及其小數點
PORTB=0XDF; //點亮十位
delay_ms(1);
PORTE=seg_table[k]; //點亮百位
PORTB=0XBF; //點亮百位
delay_ms(1);
adc_old=adc_rel;
if(s2)
{
int x;
for(x=50;x>0;x--)
//display();
{
PORTE=seg_table[i];
PORTB=0xef;
delay_ms(1);
PORTE=seg_table[j]&0x7f;
PORTB=0XDF;
delay_ms(1);
PORTE=seg_table[k];
PORTB=0XBF;
delay_ms(1);
}
j++; //加1
if(j==6)
{
j=0;
}
}
if(s4)
{
int x;
for(x=50;x>0;x--) //消抖且保證LED顯示正常
{
PORTE=seg_table[i]; //點亮個位
PORTB=0xef; //點亮個位
delay_ms(1);
PORTE=seg_table[j]&0x7f; //點亮十位及其小數點
PORTB=0XDF; //點亮十位
delay_ms(1);
PORTE=seg_table[k]; //點亮百位
PORTB=0XBF; //點亮百位
delay_ms(1);
}
j--; //減1
if(j==-1)
{
j=5;
}
}
}
delay_ms(200);
adc_old=adc_rel;
//******百位處理
while(!s1) //同上
{
adc_old=adc_rel;
TIMSK2=0x00;
PORTE=seg_table[i]; //點亮個位
PORTB=0xef; //點亮個位
delay_ms(1);
PORTE=seg_table[j]; //點亮十位
PORTB=0XDF; //點亮十位
delay_ms(1);
PORTE=seg_table[k]&0x7f; //點亮百位及其小數點
PORTB=0XBF; //點亮百位
delay_ms(1);
adc_old=adc_rel;
if(s2)
{
int x;
for(x=50;x>0;x--)
{
PORTE=seg_table[i]; //點亮個位及其小數點
PORTB=0xef; //點亮個位
delay_ms(1);
PORTE=seg_table[j]; //點亮十位
PORTB=0XDF; //點亮十位
delay_ms(1);
PORTE=seg_table[k]&0x7f; //點亮百位
PORTB=0XBF; //點亮百位
delay_ms(1);
}
k++; //加1
if(k==10)
{
k=0;
}
}
if(s4)
{int x;
for(x=50;x>0;x--)
{
PORTE=seg_table[i]; //點亮個位及其小數點
PORTB=0xef; //點亮個位
delay_ms(1);
PORTE=seg_table[j]; //點亮十位
PORTB=0XDF; //點亮十位
delay_ms(1);
PORTE=seg_table[k]&0x7f; //點亮百位
PORTB=0XBF; //點亮百位
delay_ms(1);
}
k--; //減1
if(k==-1)
{
k=9;
}
}
}
//***********
while(s1){adc_old=adc_rel;} //跳出
}
}
void main(void)
{
adc_init();//AD初始化
timer2_init();//定時器初始化
portE_B();
TIMSK2=1;
SEI();//使能全局中斷
while(1)
{
TIMSK2=1;
display(); //顯示
keyScan(); //鍵值掃描
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -