历史上的今天
今天是:2024年11月12日(星期二)
2019年11月12日 | AVR万年电子日历C程序
2019-11-12 来源:51hei
main.c如下:
#include "iom16v.h"
#include "ds1302.h"
#include "macros.h"
#include "lcd12864.h"
#define xtal 1
uchar disp_time[33]="2008年11月27日 21:49:00 星期日";
uchar week[14] = "一二三四五六天";
/*----------键盘相关声明-------------------------------------*/
#define key (PINA & BIT(0)) //功能键
#define key1 (PINA & BIT(1)) //只有加1键
uchar sum,keyflag=0; //调用时,分,秒,标志,调用键盘处理标志.
/*延时函数*/
void delay_ms(unsigned char i) {
unsigned char a, b;
for (a = 1; a < i; a++) {
for (b = 1; b; b++) {
;
}
}
}
/*********时间写屏刷新函数***********/
void disp_reset(void)
{
// disp_time[0] = time_buf[0]/10+48; //年
// disp_time[1] = time_buf[0]%10+48;
disp_time[2] = time_buf[1] /10+48;//年
disp_time[3] = time_buf[1] %10+48;
disp_time[6] = time_buf[2] /10+48;//月
disp_time[7] = time_buf[2] %10+48;
disp_time[10] = time_buf[3] /10+48;//日
disp_time[11] = time_buf[3] %10+48;
disp_time[16] = time_buf[4] /10+48;//时
disp_time[17] = time_buf[4] %10+48;
disp_time[19] = time_buf[5]/10+48;//分
disp_time[20] = time_buf[5]%10+48;
disp_time[22] = time_buf[6]/10+48;//秒
disp_time[23] = time_buf[6]%10+48;
disp_time[30] = time_buf[7]/10+48;//周
disp_time[31] = time_buf[7]%10+48;
switch (time_buf[7]%16)
{
case 0:
//LCD_PutStr(2,4,"日");
disp_time[30] =week[0];
disp_time[31] =week[1];
break;
case 1:
//LCD_PutStr(2,4,"一");
disp_time[30] =week[2];
disp_time[31] =week[3];
break;
case 2:
//LCD_PutStr(2,4,"二");
disp_time[30] =week[4];
disp_time[31] =week[5];
break;
case 3:
disp_time[30] =week[6];
disp_time[31] =week[7];
break;
case 4:
disp_time[30] =week[8];
disp_time[31] =week[9];
break;
case 5:
disp_time[30] =week[10];
disp_time[31] =week[11];
break;
case 6:
disp_time[30] =week[12];
disp_time[31] =week[13];
break;
default:
break;
}
LCD_PutStr(0,0,"当前日期是:");
LCD_PutStr(1,0,disp_time);
}
/*---------------按键处理相关函数--------------------------*/
/************************************************************
函数名称:void scanner()
功能描述: 按键函数
*************************************************************/
void scanner()
{ uchar i,j;
if(!key) //功能键按下
{ delay_ms(500); //延时500MS
if(!key) //还按下,退出时间调整
{ keyflag=0; //标志位为0
sum=0; //清0
LCD_WriteCmd(0x0C);//清闪烁
LCD_PutStr(3,0," ");
for(i=0;i<7;i++) //十进制转十六进制
{ j=time_buf[ i]/10;
time_buf=time_buf%10;
time_buf=time_buf+16*j;
}
ds1302_init();//DS1302初始化
delay_ms(10);
ds1302_write_time();//写入1302
while(!key); //等待释放
delay_ms(10); //延时消抖
}
else //500MS内放开
{ keyflag=1; //标志为1,进行时间调整
sum++; //功能键加1
switch (sum)
{
case 1:
LCD_PutStr(3,0,"请调整年份");
break;
case 2:
LCD_PutStr(3,0,"请调整月份");
break;
case 3:
LCD_PutStr(3,0,"请调整日期");
break;
case 4:
LCD_PutStr(3,0,"请调整时钟");
break;
case 5:
LCD_PutStr(3,0,"请调整分钟");
break;
case 6:
LCD_PutStr(3,0,"请调整秒钟");
break;
case 7:
LCD_PutStr(3,0,"请调整星期");
break;
default:
break;
}
if(sum==8)
sum=0;
switch(sum)
{
case 1: // 年闪烁
LCD_WriteCmd(0x90+1);
LCD_WriteCmd(0x0f);
break;
case 2: //为2,月闪烁
// write_single(3,2,"-?");
LCD_WriteCmd(0x90+3);
break;
case 3: //日闪烁
LCD_WriteCmd(0x90+5);
break;
case 4: //时闪烁
LCD_WriteCmd(0x88+0);
break;
case 5: //分闪烁
//LCD_WriteCmd(0x88+4);
write_single(3,2,"0");
LCD_WriteCmd(0x06); //写入时,游标右移动
break;
case 6: //秒闪烁
LCD_WriteCmd(0x88+3);
break;
case 7: //星期闪烁
LCD_WriteCmd(0x88+7);
break;
}
}
}
if(sum) //功能键按下
{
if(!key1)
{ delay_ms(10);
if(!key1)
{ while(!key1);//等待加1键释放
delay_ms(10);
if(sum==1) //年
{ time_buf[1]++;
if( time_buf[1] ==100)
time_buf[1]=0;
disp_reset();
}
if(sum==2) //月
{
time_buf[2]++;
if( time_buf[2] ==13)
time_buf[2]=1;
disp_reset();
}
if(sum==3)//日
{ time_buf[3]++;
if( time_buf[3] ==32)
time_buf[3]=1;
disp_reset();
}
if(sum==4)//时
{
time_buf[4]++;
if( time_buf[4] ==24)
time_buf[4]=0;
disp_reset();
}
if(sum==5)//分
{ time_buf[5]++;
if( time_buf[5] ==60)
time_buf[5]=0;
disp_reset();
}
if(sum==6)//秒
{time_buf[6]++;
if( time_buf[6] ==60)
time_buf[6]=0;
disp_reset();
}
if(sum==7)//星期
{ time_buf[7]++;
if( time_buf[7] ==7)
time_buf[7]=0;
disp_reset();
}
}
}
}
}
void main(void) {
unsigned char temp;
PORTA = 0xFF; /*打开上拉*/
DDRA = 0x00; /*方向输入*/
PORTB = 0xF0; /*电平设置*/
DDRB = 0xFF; /*方向输出*/
PORTC = 0x7F;
DDRC = 0x80;
PORTD = 0xFF;
DDRD = 0x00;
DDRD &= ~BIT(7);
PORTD &= ~BIT(7);
DDRC |=BIT(6); //设置输出
PORTC &= ~BIT(6); //L:serial mode 串行
DDRC &= ~BIT(7);
PORTC &= ~BIT(7);
delay_ms(20);
LCD_Init();
ds1302_init();
delay_ms(10);
ds1302_write_time();
while (1) {
scanner();
if(!keyflag)
{
delay_ms(20);
ds1302_read_time();
disp_reset();
}
}
}
DS1302.H包括如下
#include "iom16v.h"
/*复位脚*/
#define RST_CLR PORTC &= ~(1 << PC4)/*电平置低*/
#define RST_SET PORTC |= (1 << PC4)/*电平置高*/
#define RST_IN DDRC &= ~(1 << PC4)/*方向输入*/
#define RST_OUT DDRC |= (1 << PC4)/*方向输出*/
/*双向数据*/
#define IO_CLR PORTC &= ~(1 << PC3)/*电平置低*/
#define IO_SET PORTC |= (1 << PC3)/*电平置高*/
#define IO_R PINC & (1 << PC3)/*电平读取*/
#define IO_IN DDRC &= ~(1 << PC3)/*方向输入*/
#define IO_OUT DDRC |= (1 << PC3)/*方向输出*/
/*时钟信号*/
#define SCK_CLR PORTC &= ~(1 << PC2)/*时钟信号*/
#define SCK_SET PORTC |= (1 << PC2)/*电平置高*/
#define SCK_IN DDRC &= ~(1 << PC2)/*方向输入*/
#define SCK_OUT DDRC |= (1 << PC2)/*方向输出*/
#define ds1302_sec_add 0x80 //秒数据地址
#define ds1302_min_add 0x82 //分数据地址
#define ds1302_hr_add 0x84 //时数据地址
#define ds1302_date_add 0x86 //日数据地址
#define ds1302_month_add 0x88 //月数据地址
#define ds1302_day_add 0x8a //星期数据地址
#define ds1302_year_add 0x8c //年数据地址
#define ds1302_control_add 0x8e //控制数据地址
史海拾趣
|
最近开始学linux,班里许多同学都装了VMWARE的虚拟机,装了ubuntu系统,可是不知道如果设置上网,网上找的一些教程之类的大都不太好用。。 不知道哪位牛人能给小弟们一个解决方法。。越详细越好。。毕竟我们还是菜鸟 ...… 查看全部问答> |
|
请教2440 camera分配的是irq6 该irq可能由INTSUB_CAM_P INTSUB_CAM_C 引起 有的资料上说中断由VSYNC垂直同步信号引起 这个由VSYNC触发的中断到底是 INTSUB_CAM_P还是INTSUB_CAM_C ?? … 查看全部问答> |
|
如题: 我现在已经可以正确读写小于0x00040000的存储空间,这是在DSPP为0的情况下读的 我把DSPP设为1后就写不进去了,读出的也不对(写0x12345678,读出是以前DSPP为0时写进去的值,也就是说应该是没写进去) 是芯片只允许读0x00040000以内的memo ...… 查看全部问答> |
|
1、图像采集技术 LED电子显示屏要显示真彩图像,必须首先解决视频信号的实时采集,将模拟视频信号采集为数字视频图像。早期的做法是利用视频采集卡和一些带特征口(Feature-connect)的VGA卡相结合来实现。 视频采集卡用来捕获视频图像, ...… 查看全部问答> |
|
STM32F手册上在I2C一章中在“Master receiver”部分指出,主机为了能够在从从机接收到最后一个字节能够产生非应答信号(NACK)信号,主机必须在读完倒数第二个接收字节的时候清除ACK位;主机为了能够在从从机接收到最后一个字节能够产生停止 ...… 查看全部问答> |




