附2:源程序代码
#include<pic.h> //调用pic.h头函数
__CONFIG(XT & WDTDIS & LVPDIS); //设置单片机工作模式
#define uchar unsigned char //无符号字符型定义符重说明
#define uint unsigned int //无符号整型定义符重说明
#define lcd_rs RA1 //---LCD端口定义---
#define lcd_rw RA2
#define lcd_e RA3
#define i_o RB5 //---DS1302端口定义---
#define sclk RB6
#define rst RB7
#define K1 RB1//---键盘端口定义---
#define K2 RB2
#define K3 RB3
uchar test=7,sw[]={5,5,2,9,1,0,3};
uchar presetTime[]={0x00,0x30,0x09,0x13,0x05,0x03,0x21,0x00};
//初始时间日期"秒、分、小时、年、月、星期 、日 " 存放表
uchar dateTime[7];
uchar bell_n=3,yuzhi[][3]={0x00,0x30,0x01,0x15,0x30,0x02,0x30,0x30,0x03};
const uchar digit[]={"0123456789.-:"}; //定义字符数组显示数字
const uchar weekstr[][4]={"SUN","MON","TUE","WEN","THR","FRI","STA"};
数组显示
uchar time_rx @ 0x30; //定义接收寄存器
static volatile bit time_rx7 @ (unsigned)&time_rx*8+7;
//接收寄存器的最高位
void delay(uchar n)//---延时函数---
{
uchar i;
for(i=0;i<50;i++);
}
void port_init() //---端口初化函数---
{
// ADCON1=0X07; //设置A口为普通I/O口
TRISA=0X00; //设置A口为输出
TRISB=0X1f; //设置A口为输出
TRISC=0X00; //设置C口为输出
//定义字符
TRISE0=0;
}
//------DS1302时间控制有关函数--------
uchar time_read_1() //读一个字节函数子程序
{
int j; //设置循环变量
TRISB5=1; //设置数据口方向为输入
for(j=0;j<8;j++) //连续读取8bit
{
sclk=0; //拉低时钟信号
time_rx=time_rx>>1; //接收寄存器右移1位
time_rx7=i_o; //把接收到的数据放到接收寄存器的最高位 sclk=1; //拉高时钟信号
}
TRISB5=0; //恢复数据口方向为输出
sclk=0; //拉低时钟信号
return(time_rx); //返回读取到的数据
}
void time_write_1(uchar time_tx) //写一个字节数据函数子主程序
{
int j; //设置循环变量
for(j=0;j<8;j++) //连续写8bit
{
i_o=0; //先设置数据为0
sclk=0; //时钟信号拉低
if(time_tx&0x01) //判断待发送的数据位是0或1
{
i_o=1; //待发送数据位是1
}
time_tx=time_tx>>1; //待发送的数据右移1位
sclk=1; //拉高时钟信号
}
sclk=0; //写完一个字节,拉低时钟信号
}
void get_time() //读取时间函数子程序
{
int i; //设置循环变量
rst=1; //使能DS1302
time_write_1(0xbf); //发送多字节读取命令
for(i=0;i<7;i++) //连续读取7个字节数据
{
dateTime[i]=time_read_1(); //调用读取1个字节数据的函数
delay(100);
}
rst=0; //复位DS1302
}
void set_time() //设置时间函数子程序
{
int i; //定义循环变量
rst=1; //使能DS1302
time_write_1(0xbe); //时钟多字节写命令
for(i=0;i<8;i++) //连续写8个字节数据
{
time_write_1(presetTime[i]); //调用写一个字节函数
delay(100);
}
rst=0; //复位
}
void ds1302_init() //DS1302初始化函数子程序
{
sclk=0; //拉低时钟信号
rst =0; //复位DS1302
rst=1; //使能DS1302
time_write_1(0x8e); //发控制命令
time_write_1(0); //允许写DS1302
rst=0; //复位
}
//------LCD1602显示控制有关函数--------
void lcd_writeComd(uchar cmdChar) //---写命令函数---
{
PORTC=cmdChar;
lcd_rs=0; //该字节数据为命令,而不是数据
lcd_rw=0; //此次操作为写,而不是读
lcd_e=0; //拉低使能信号
delay(50); //保持使能信号为低一段时间
lcd_e=1; //拉高使能信号,建立LCD操作所需要的上升沿 }
void lcd_init() //---LCD初始化函数---
{
lcd_writeComd(0x01); //清除显示
lcd_writeComd(0x38); //8位2行5*7点阵
lcd_writeComd(0x0c); //显示开,光标关,光标不闪烁
lcd_writeComd(0x06); //显示光标移动
}
void lcd_writeData(uchar datx) //---向LCD写数据函数---
{
PORTC=datx; //待显示数据送PORTC口
lcd_rs=1; //该字节数据为数据,而不是命令
lcd_rw=0; //此次操作为写,而不是读
lcd_e=0; //拉低使能信号
delay(50); //保持使能信号为低一段时间
lcd_e=1; //拉高使能信号,建立LCD操作所需要的上升沿
…… 此处隐藏:3640字,全部文档内容请下载后查看。喜欢就下载吧 ……