微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于PIC16F877A的万年历程序

基于PIC16F877A的万年历程序

时间:11-13 来源:互联网 点击:

void write_com(unsigned char cmdcode)
{

Rs=0; //选择指令
RW=0; //选择写
PORTB=cmdcode;//写指令码
asm("NOP");
asm("NOP");
asm("NOP");
Ce=1;//开读写
asm("NOP");
asm("NOP");
asm("NOP");
Ce=0;//关读写
}

void write_data(unsigned char Rsspdata)
{
Rs=1;//选择数据
RW=0;//选择写
PORTB=Rsspdata;
asm("NOP");
asm("NOP");
asm("NOP");
Ce=1;//开读写
asm("NOP");
asm("NOP");
asm("NOP");
Ce=0;//关读写
}

void Clr_Scr(void)
{
unsigned char j,k;
Cs1=1;
Cs2=1;
write_com(Page_Add+0);//定位到第0页(页起始位置0-7)
write_com(Col_Add+0);//定位到第0列(列起始位置0-63)
for(k=0;k<8;k++)
{
write_com(Page_Add+k);
for(j=0;j<64;j++) write_data(0x00);//清屏
}
}

void write_x_y(unsigned char x,unsigned char y)
{
y=y&0x7f;//限制列y在0~127
x=x&0x07;//限制行x在0~7
if(y<64)//在左屏
{
Cs1=1;
Cs2=0;//左屏可设置
write_com(Col_Add+y);//设置列地址
}
else //在右屏
{
Cs1=0;
Cs2=1;//右屏可设置
y&=0x3f;//将y在改为0~64的序列(y-64)
write_com(Col_Add+y);//设置列地址
}
write_com(Page_Add+x);//设置为当前页
}

void init_lcd(void)
{
delay(250);//延时48 ms(通过MPLAB IDE测得)
delay(250);
Cs1=1;
Cs2=1; //选择全屏(CS2=1,CS1=0:左屏,CS2=0,CS1=1:右屏)
delay(250);
write_com(Rssp_Off);//显示关
write_com(Page_Add+0);//定位到第0页指令(页起始位置0-7)
write_com(Start_Line+0);//定位从DDRAM中的第0行开始往屏幕上显示
write_com(Col_Add+0);//定位到第0列指令(列起始位置0-63)
write_com(Rssp_On);//显示开
}

void write_english(unsigned char x,unsigned char y, unsigned char en)
{
unsigned char j=0,i=0;
for(j=0;j<2;j++) //使用两行显示一个字符
{
write_x_y(x+j,y);//写地址
for(i=0;i<8;i++) write_data(shuzi[en*16+8*j+i]);//使用8列显示一个字符
}
}
void write_chinese(unsigned char x,unsigned char y, unsigned char hz)
{
unsigned char j=0,i=0;
for(j=0;j<2;j++)
{
write_x_y(x+j,y);
for(i=0;i<16;i++) write_data(hanzi[hz*32+16*j+i]);
}
}

void RTInputByte(unsigned char d)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(d&0x01)
T_IO=1;
else
T_IO=0;
d=d>>1;
asm("NOP");
asm("NOP");
asm("NOP");
T_CLK = 1;
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
T_CLK = 0;
asm("NOP");
asm("NOP");
asm("NOP");
}
}

unsigned char RTOutputByte(void)
{
unsigned char i,b;
TRI=1;
for(i=8; i>0; i--)
{
b= b>>1; /*相当于汇编中的 RRC */
if(T_IO==1)
b|=0x80;
else
b&=0x7f;
T_CLK = 1;
asm("NOP");
T_CLK = 0;
}
TRI=0;
return b;
}

void W1302(unsigned char ucAddr, unsigned char ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}

unsigned char R1302(unsigned char ucAddr)
{
unsigned char ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}

void Set1302(unsigned char *pClock)
{
unsigned char i;
unsigned char ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}

void Get1302(unsigned char ucCurtime[])
{
unsigned char i;
unsigned char ucAddr = 0x81;
for (i=0; i<7; i++)
{
ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}

void timerinit(void)
{
T1CON=0X01;
TMR1IF=0; //清除TMR1中断标志
TMR1IE=1; //TMR1中断允许
TMR1H=0x3C; //赋初值,以便TMR1精确地每50ms中断一次
TMR1L=0xC9;
PIR1=0;
PEIE=1;
GIE=1;
}

void interrupt T1(void)
{
if(TMR1IF==1) //中断类型判断
{
TMR1H=0X3C;
TMR1L=0xC0;
TMR1IF=0;
if(++n>19)//n=20时 为1s计时
{
display_time=1;
n=0;
}
if (n==10) tem_en=1; //当n=10,启动温度显示,以错开时间显示的时间
if(tem_en)
if(++ n2 >19)//n2=20时 为1s计时
{
display_tem=1;
n2=0;
}
}
}

void main(void)
{
unsigned char j,t,k;
init();
init_lcd();//初始化屏幕
Clr_Scr();//清屏
//画屏幕中央分割竖线
for(j=0;j<8;j++)
{write_x_y(j,58);
write_data(0xff);
}
for(j=0;j<8;j++)
{write_x_y(j,59);
write_data(0xff);
}
//结束画线

Get1302(timebuf); //获取系统时间
if(timebuf[0]==0) //获取时间不正确,则时间初始化
{
timebuf[6]=0x10;//10年
timebuf[4]=0x05;//05月
timebuf[3]=0x05;//01日
timebuf[5]=0x06;//星期6(1-7)
timebuf[2]=0x21;//21点
timebuf[1]=0x46;//46分
timebuf[0]=0x02;//02秒
Set1302(timebuf); //将以上时间写入时钟芯片
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top