📄 lt-mini-m16-test.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd1602.h"
#include "ds1302.h"
#include "spi.h"
#include "usart.h"
#include "lcd12864.h"
#include "int.h"
#include "beep.h"
#include "adc.h"
#include "iic.h"
#include "ds18b20.h"
#include "smg.h"
#include "key.h"
static unsigned char DS1302_EXIST;
static volatile unsigned char init_date_p = 0;
static volatile unsigned char INITDATE[8]={0x30, //秒
0x01, //分
0x16, //时 24小时制
0x02, //日
0x11, //月
0x07, //星期
0x08, //年
0x80 //写保护
};
static unsigned char sCURDATE[]="20xxYYxxMMxxDDxxHHxxmmxxSS Weekxx";
static unsigned char dis_buf[2][17] =
{
{"2008/08/08 0.00V\0"},
{"08:08:08 00.0^C\0"},
};
static unsigned char smg_dis_buf[4] = {8,8,8,8};
static volatile char dis_flag = 1;//0:数码管与串口显示 1:1602显示
static volatile char hm_flag = 0;//0:显示分秒1:显示时分
int main(void)
{
unsigned int temp,temp1 = 0;
unsigned char temp2 = 0;
init_key();
init_1820();
temp = gettemp();
dis_buf[1][10] = (temp & 0xff) / 10 + '0';
dis_buf[1][11] = (temp & 0xff) % 10 + '0';
dis_buf[1][13] = (temp >> 8) % 10 + '0';
init_int();
LCD_Init();
init_USART();
init_SPI();
DS1302_EXIST=check_RTC();//检测DS1302的存在
if(DS1302_EXIST)
{
put_s("Send 'i' or 'I' to init time...");
put_s("Send 'r' or 'R' to read cur-time...");
}
else
{
put_s("RTC not found!");
}
sei();//使能全局中断
if(test_24c02())
{
beep_on();
DisplayListChar(0,0,"AT24C02 test OK!");
delay(30000);
beep_off();
delay(60000);
}
InitADC();
while(1)
{
un_init_smg();//停止数码管扫描
init_SPI();//初始化SPI
read_date(sCURDATE);//读取时间
un_init_SPI();//关闭SPI
if(!dis_flag)//数码管显示
{
if(get_key(0))
{
delay(1000);//延时消抖
if(get_key(0))
{
while(get_key(0));//等待按键抬起
hm_flag = 1;//显示时分
}
}
if(get_key(1))
{
delay(1000);//延时消抖
if(get_key(1))
{
while(get_key(1));//等待按键抬起
hm_flag = 0;//显示分秒
}
}
if(hm_flag)//显示时分
{
smg_dis_buf[0] = sCURDATE[14] - '0';
smg_dis_buf[1] = sCURDATE[15] - '0' + 0x10;
smg_dis_buf[2] = sCURDATE[18] - '0';
smg_dis_buf[3] = sCURDATE[19] - '0';
}
else//显示分秒
{
smg_dis_buf[0] = sCURDATE[18] - '0';
smg_dis_buf[1] = sCURDATE[19] - '0' + 0x10;
smg_dis_buf[2] = sCURDATE[22] - '0';
smg_dis_buf[3] = sCURDATE[23] - '0';
}
write_smg(smg_dis_buf);
}
if(dis_buf[1][7] != sCURDATE[23])//秒更新
{
temp1 = get_temp(temp2);
if((temp1 & 0xff) < 35)
{
dis_buf[1][10] = (temp1 & 0xff) / 10 + '0';
dis_buf[1][11] = (temp1 & 0xff) % 10 + '0';
dis_buf[1][13] = (temp1 >> 8) % 10 + '0';
}
temp2 ^= 1;
dis_buf[0][0] = sCURDATE[0];
dis_buf[0][1] = sCURDATE[1];
dis_buf[0][2] = sCURDATE[2];
dis_buf[0][3] = sCURDATE[3];
dis_buf[0][5] = sCURDATE[6];
dis_buf[0][6] = sCURDATE[7];
dis_buf[0][8] = sCURDATE[10];
dis_buf[0][9] = sCURDATE[11];
dis_buf[1][0] = sCURDATE[14];
dis_buf[1][1] = sCURDATE[15];
dis_buf[1][3] = sCURDATE[18];
dis_buf[1][4] = sCURDATE[19];
dis_buf[1][6] = sCURDATE[22];
dis_buf[1][7] = sCURDATE[23];
temp = ReadADC();
temp = (temp * 50) / 20;
dis_buf[0][11] = temp / 1000 + '0';
dis_buf[0][13] = temp % 1000 / 100 + '0';
dis_buf[0][14] = temp % 100 / 10 + '0';
if(dis_flag & 0x01)//液晶显示
{
DisplayListChar(0,0,dis_buf[0]);
DisplayListChar(0,1,dis_buf[1]);
}
else//串口与数码管
{
put_s(dis_buf[0]);
put_s(dis_buf[1]);
}
}
delay(2000);
}
}
SIGNAL(SIG_USART_RECV) //串口接收中断服务程序
{
unsigned char command;
command=UDR;
switch(command)
{
case 'I':
case 'i':
{
if (DS1302_EXIST)
{
init_date_p = 0x1d;
}
else
{
put_s("RTC not fund!");
}
break;
}
case 'R':
case 'r':
{
if (DS1302_EXIST)
{
put_s("Reading cur-time...");
init_SPI();
read_date(sCURDATE);
put_s(sCURDATE);
}
else
{
put_s("RTC not fund!");
}
break;
}
case 'E':
case 'e':
{
if(init_date_p == 0x0f)
{
init_date_p = 0;
put_s("RTC initing...");
init_SPI();
init_RTC(INITDATE);
read_date(sCURDATE);
put_s(sCURDATE);
}
break;
}
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{
if(init_date_p >= 0x10)
{
command -= '0';
if(init_date_p & 0x01)
{
INITDATE[(init_date_p & 0x0f) >> 1] = command << 4;
}
else
{
INITDATE[(init_date_p & 0x0f) >> 1] += command & 0x0f;
}
init_date_p --;
}
break;
}
default:
{
break;
}
}
}
SIGNAL(SIG_INTERRUPT0)//INT0中断服务程序
{
delay(5000);
if(PIND & (1 << PD2))
{
while(PIND & (1 << PD2));
beep_on();
delay(10000);
beep_off();
dis_flag = 1;//开1602显示
LCD_Init();
}
}
SIGNAL(SIG_INTERRUPT1)//INT1中断服务程序
{
delay(5000);
if(!(PIND & (1 << PD3)))
{
while(!(PIND & (1 << PD3)));
beep_on();
delay(10000);
beep_off();
dis_flag = 0;//开数码管显示
write_smg(smg_dis_buf);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -