历史上的今天
今天是:2025年06月22日(星期日)
2018年06月22日 | PIC单片机(PIC16F877A)DS1302芯片程序
2018-06-22 来源:eefocus
#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define rs_h PORTC|=0x01
#define rs_l PORTC&=0xfe
#define rw_h PORTC|=0x02
#define rw_l PORTC&=0xfd
#define en_h PORTC|=0x04
#define en_l PORTC&=0xfb
#define rst_h PORTC|=0x08
#define rst_l PORTC&=0xf7
#define sck_h PORTC|=0x10
#define sck_l PORTC&=0xef
#define io_h PORTC|=0x20
#define io_l PORTC&=0xdf
#define SECADD 0X80//秒寄存器地址
#define MINADD 0x82
#define HRADD 0x84
#define DATEADD 0x86
#define MONTHADD 0x88
#define DAYADD 0x8a
#define YEARADD 0x8c
#define CONTROLADD 0x8e
#define PORT (PORTB)
void delayms(uint x);
void lcd_com(uchar com);
void lcd_dat(uchar dat);
void lcd_write(uchar c,uchar r,uchar dat);
void lcd_init(void);
void Ds1302Init(void);
void WriteByte(uchar dat);
uchar ReadByte(void);
uchar BCDtoDex(uchar dat);
uchar DextoBCD(uchar dat);
uchar ReadByte(void);
void Ds1302Write(uchar add,uchar dat);
uchar Ds1302Read(uchar add);
void main(void)
{
uchar sec,min,hr,date,month,day,year;
TRISB=0x00;
TRISC&=0xc0;
lcd_init();
Ds1302Init();
while(1)
{
sec=Ds1302Read(SECADD);
min=Ds1302Read(MINADD);
hr=Ds1302Read(HRADD);
date=Ds1302Read(DATEADD);
month=Ds1302Read(MONTHADD);
day=Ds1302Read(DAYADD);
year=Ds1302Read(YEARADD);
sec=BCDtoDex(sec);
min=BCDtoDex(min);
hr=BCDtoDex(hr);
date=BCDtoDex(date);
month=BCDtoDex(month);
day=BCDtoDex(day);
year=BCDtoDex(year);
lcd_write(0,1,0x32);
lcd_write(0,2,0x30);
lcd_write(0,3,0x30+year/10);
lcd_write(0,4,0x30+year%10);
lcd_write(0,6,0x30+month/10);
lcd_write(0,7,0x30+month%10);
lcd_write(0,9,0x30+date/10);
lcd_write(0,10,0x30+date%10);
lcd_write(0,14,0x30+day);
lcd_write(1,4,0x30+hr/10);
lcd_write(1,5,0x30+hr%10);
lcd_write(1,7,0x30+min/10);
lcd_write(1,8,0x30+min%10);
lcd_write(1,10,0x30+sec/10);
lcd_write(1,11,0x30+sec%10);
delayms(1005);//1ms
}
}
void Ds1302Init(void)
{
rst_l;
sck_l;
Ds1302Write(CONTROLADD,0);//关闭写保护
Ds1302Write(MINADD,DextoBCD(06));
Ds1302Write(HRADD,DextoBCD(19));
Ds1302Write(DATEADD,DextoBCD(20));
Ds1302Write(MONTHADD,DextoBCD(5));
Ds1302Write(DAYADD,DextoBCD(7));
Ds1302Write(YEARADD,DextoBCD(12));
Ds1302Write(SECADD,DextoBCD(30));//写秒,同时启动时钟
}
void WriteByte(uchar dat)//上升沿输出
{
uchar i;
TRISC&=0xdf;
for(i=8;i>0;i--)
{
sck_l;//低电平时数据线可变
if(dat&0x01)
io_h;
else
io_l;
sck_h;
dat>>=1;
}
}
uchar BCDtoDex(uchar dat)//BCD码转十进制
{
uchar i;
i=dat/16;
dat%=16;
i=i*10+dat;
return i;
}
uchar DextoBCD(uchar dat)//十进制转BCD码
{
uchar i;
i=dat/10;
dat%=10;
i=i*16+dat;
return i;
}
uchar ReadByte(void)//下降沿输出
{
uchar i;
uchar dat;
TRISC|=0x20;
for(i=8;i>0;i--)//要考虑之前写完后的状态,第一次进入此循环体即有下降沿
{
dat>>=1;
sck_l;
if(PORTC&0x20)
dat|=0x80;
sck_h;
}
return dat;
}
void Ds1302Write(uchar add,uchar dat)
{
rst_l;
sck_l;
rst_h;
WriteByte(add);//最低位置0表示写
WriteByte(dat);
rst_l;
}
uchar Ds1302Read(uchar add)
{
uchar dat;
rst_l;
sck_l;
rst_h;
WriteByte(add+1);//地址最低位置1表示读
dat=ReadByte();
rst_l;
return dat;
}
void delayms(uint x) //8M晶振下,延时1ms
{
uint y,z;
for(y=x;y>0;y--)
for(z=220;z>0;z--);
}
void lcd_init(void)//LCD1602初始化
{
lcd_com(0x38);
lcd_com(0x0c);
lcd_com(0x06);
lcd_write(0,5,0xb0);
lcd_write(0,8,0xb0);
lcd_write(1,6,0x3a);
lcd_write(1,9,0x3a);
}
void lcd_com(uchar com)//向LCD1602写命令
{
rs_l;
rw_l;
PORT=com;
delayms(1);
en_h;
delayms(1);
en_l;
}
void lcd_dat(uchar dat)//向LCD1602写数据
{
rs_h;
rw_l;
PORT=dat;
delayms(1);
en_h;
delayms(1);
en_l;
}
void lcd_write(uchar c,uchar r,uchar dat)//向LCD1602指定行、指定列、写数据
{
lcd_com(0x80+0x40*c+r);
lcd_dat(dat);
delayms(1);
}

史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 03:44 编辑 有时候用到需要精确延时之类的子程序时,用C语言比较难控制,这时候就可以在C中嵌入汇编 比较常用的keil中嵌入汇编的方法如下所示: 如图一,在C文件中要嵌入汇编的地方用#pragma asm和#pragma end ...… 查看全部问答> |
|
关于DDK开发中的Build SoftICE Symbols的问题,我编译的工程生成了.sys文件,但没有生成.nms等用于调试的文件,不知是否和下面的出错信息 以下是出错的内容,我不明白“Matching PDB file not found.”是什么意思,是不是说生成的.sys文件里面没有编译信息? --------------------Configuration: RepSample - Win32 Free-------------------- Compiling resources with DDK resource c ...… 查看全部问答> |
|
按照网上的教程交叉编译了一个linux的内核,在下载到arm2440上运行不了。显示的输出信息为: Read chip id = ec76 Nand flash status = c0, NandAddr=1 buf address :0x30008000 Set boot params = root=/dev/mtdblock2 load_ramdis ...… 查看全部问答> |
|
1. LPC2366的三个VDD(DCDC)(3V3)引脚是否一定要接3.3V电源?周立功的资料说这三个引脚不使用可以悬空。。。但是当这三个引脚悬空时整个单片机根本就没有工作,H-JTAG无法识别芯片,ISP也无法连接,说明这三个脚应该是给内部某些关键模块供电的 ...… 查看全部问答> |
|
ST-LINK2进行STM32FLASH调试偶尔不能进入调试(有图) 我使用ST-link2进行FLASH调试,前一段时间偶尔出现不能进入调试界面,给板子断电,然后关闭IAR,重新打开IAR又可以 ...… 查看全部问答> |
|
因杭研所发展迅速,急需大量人才,待遇优厚(硕士应届毕业8K),现有很多内部推荐名额,有兴趣的TX把简历发到我邮箱hyliu86@163.com, 合适的话我会联系你。 研发类岗位(软件,硬件,测试,操作系统等) 岗位要求: 1.学士学位及 ...… 查看全部问答> |




