基于PIC16F887单片机的数字钟完整c程序代码.docx
- 文档编号:1473618
- 上传时间:2022-10-22
- 格式:DOCX
- 页数:25
- 大小:19.56KB
基于PIC16F887单片机的数字钟完整c程序代码.docx
《基于PIC16F887单片机的数字钟完整c程序代码.docx》由会员分享,可在线阅读,更多相关《基于PIC16F887单片机的数字钟完整c程序代码.docx(25页珍藏版)》请在冰豆网上搜索。
基于PIC16F887单片机的数字钟完整c程序代码
#include
__CONFIG(0x20F1);
__CONFIG(0x3FFF);//调试用
#defineLCD_ERD6//LCDE读写使能控制
#defineLCD_RWRD5//LCD读
(1)/写(0)控制线
#defineLCD_RSRD4//LCD寄存器选择数据
(1)指令(0)
//RD4-RD7分别接DB4-DB7,RD7为忙标志
#defineCOM0//在LCD_WRITE()中的第2参数为0表示写命令#defineDAT1//在LCD_WRITE()中的第2参数为1表示写数据
#definemodRB3//模式选择(时间、闹钟、温度、秒表)
#definesetRB0//选择按键
#defineaddRB1//加按键
#definemiuRB2//减按键
#defineRTR0b00000000//TC74的读温度命令
#defineTC74_ADD0b1001101//TC74的7位地址
#defineLINE10b10000000
#defineLINE20b11000000
signedcharhourt,mint,sect;//闹钟设置位
intf;//闹钟显示清零判断
charflag=0;//按键标志位
charWW,QW,BW,SW,GW,M;
chartable[]="MonTueWedThuFriSatSun";//星期
signedcharyear,month,day,week,hour,min,sec,a,T;
bank1charDD[16];//一行LCD显示数据暂存
charA[7];//DS1307读数
//====LCD程序
voidCSH(void);//初始化
voidLCD_CSH(void);//LCD初始化
voidLCD_BUSY(void);//检测LCD是否忙
charLCD_READ(void);//读LCD,忙检测用
voidLCD_WRITE(char,char);//LCD写1字节,命令或数据
voidLCD_WRITE_4(char,char);//LCD写半字节
voidDISP_C(char);//在指定行中显示字符,字符在数组DD中voidDISP_MENU(constchar*);//由常数数组显示整屏字符
voidDELAY_US(char);
voidDELAY(unsignedint);
voiddelaynms(unsignedint);
//===DS1307
voidIIC_SEND(char);
voidIIC_CSH(void);
voidREAD_DS1307(charaddr,charn);
voidwrite_DS1307(charaddr,chardata);
voidDS1307_CSH(void);//DS1307初始化
voidMENU_DS1307(void);
//==温度
voidDISP_T(signedcharR1);//温度在R1signedcharREAD_T(void);
voidclock();//闹钟
voidset_time(void);//按键
voidbcd_dec(charadr,charR);
chardec_bcd(chardec);
voidBCD(unsignedintR1);
voidguangbiao(void);//光标
//========主程序
voidmain()
{
CSH();
READ_DS1307(0,7);//读DS1307
if(A[0]&0x80)
DS1307_CSH();//判断是否初始化
while
(1)
{
clock();
set_time();//按键检测
delaynms(50);
if(flag==0)
{READ_DS1307(0,7);//读DS1307
MENU_DS1307();//显示DS1307
T=READ_T();//读温度
DISP_T(T);//显示温度
}
}
}
//========初始化端口
voidCSH(void)
{
TRISD=0b00000000;//控制LCD1604,全为输出
RD7=1;//背光
TRISB=0x0FF;
RBPU=0;
WPUB=0x0FF;
ANSELH=0;
PORTB=0x00;
//===PWM设置
TRISC1=0;//RC1为输出
RC1=0;
PR2=124;//周期为1ms
CCPR2L=0x32;
CCP2CON=0b00000000;//关闭PWM
T2CON=0b00000110;//TMR2预分频1:
16,开始工
IIC_CSH();
LCD_CSH();
}
//LCD模块初始化
voidLCD_CSH(void)
{DELAY(20);//延时20ms
LCD_WRITE_4(0b0011,COM);//发送控制序列
DELAY_US(10);//延时100us
LCD_WRITE_4(0b0011,COM);//发送控制序列
DELAY_US(10);//延时100us
LCD_WRITE_4(0b0011,COM);//发送控制序列
DELAY_US(10);//延时100us
LCD_WRITE_4(0b0010,COM);//4位数据格式
LCD_BUSY();//LCD忙检测
LCD_WRITE(0b00101000,COM);//4位数据格式,2行,5×7点阵
LCD_WRITE(0b00001100,COM);//D(d2)=1:
打开显示,C(d1)=1:
光标打开,B(d0)=1:
光标不闪烁
LCD_WRITE(0b00000001,COM);//清除显示
DELAY
(2);//延时2ms
LCD_WRITE(0b00000110,COM);//输入模式,I/D(d1)=1:
地址加1,S(d0)=1:
显示移位关闭
}
//========读LCD状态
charLCD_READ(void)
{unsignedcharR1;
TRISD|=0X0F;//LCD数据线为输入
LCD_RS=0;//寄存器选择
LCD_RW=1;NOP();//读为1
LCD_E=1;NOP();//使能
R1=0;//短延时
R1=(PORTD<<4)&0xF0;//读数据的高4位给R1高四位
LCD_E=0;NOP();//读数据结束
LCD_E=1;NOP();//使能
R1|=(PORTD&0x0F);//读PORTD的低4位,R1的高4位不变!
LCD_E=0;NOP();//读数据结束
LCD_RW=0;
return(R1);
}
//写一字节数R1,FLAG为写命令或数据选择,0为写命令,1为写数据
//写之前先检查是否忙,写完后延时100us,分二次写4位数据/命令
voidLCD_WRITE(charR1,charFLAG)
{charR2;
TRISD&=0XF0;
LCD_BUSY();
R2=R1&0xF0;//低4位清0
R2=R2>>4;//取高4位
LCD_WRITE_4(R2,FLAG);//先写高4位
R2=(R1&0x0F);//高4位清0,取低4位
LCD_WRITE_4(R2,FLAG);//再送低4位
DELAY_US(10);//延时100us
}
//写R1的低4位,FLAG为寄存器选择,1为命令,0为数据
voidLCD_WRITE_4(charR1,charFLAG)
{TRISD&=0XF0;
LCD_RW=0;NOP();//写模式
LCD_RS=FLAG;NOP();//寄存器选择
PORTD&=0xF0;NOP();//RD低4位先清0
LCD_E=1;NOP();//使能
R1=(R1&0x0F);//R1低4位送至低4位PORTD|=R1;NOP();//送4位
LCD_E=0;NOP();//数据送入有效,下降沿送入
LCD_RS=0;NOP();
PORTD&=0xF0;//RD低4位清0
}
//========检测LCD是否忙
voidLCD_BUSY(void)
{unsignedcharR1;
while
(1)
{R1=LCD_READ();//读寄存器
if((R1&0x80)==0x00)//最高位为忙标志位break;
};
}
//======延时(n)ms
voidDELAY(unsignedintn)
{
unsignedintj;
chark;
for(j=0;j for(k=246;k>0;k--)NOP(); } //======延时(n)ms voiddelaynms(unsignedintn) { unsignedintj; chark; for(j=0;j for(k=246;k>0;k--)NOP(); } //======延时(n×10)us voidDELAY_US(charn) {charj; for(j=0;j {NOP();NOP();} } //=======DS1307有关子程序 //===DS1307初始化 voidDS1307_CSH() { write_DS1307(0x00,0X00);//秒钟设置 write_DS1307(0x01,0x01);//分钟设置 write_DS1307(0x02,0x01);//小时设置 write_DS1307(0x03,0X01);//星期天设置 write_DS1307(0x04,0x01);//日月设置 write_DS1307(0x05,0x05);//月设置 write_DS1307(0x06,0x12);//年设置 write_DS1307(0x07,0x70);//7脚方波允许,输出1HZ } //==IIC初始化 voidIIC_CSH() {TRISC=0b00011000;//SDA,SCL设置为输入 SSPCON=0b00101000;//同步串口使能(SSPEN),主控方式 SMP=0;//使能高速模式(400kHz)的压摆率控制 SSPADD=4;//主控模式为波特率值,每位时间T=(SSPADD+1)/Tcy=5us} //发送数R并等待发送完成,收到从机的应答信号 voidIIC_SEND(charR) {SSPBUF=R;//发送 while(RW==1);//在主动模式下,判断发送是否完成
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 PIC16F887 单片机 数字 完整 程序代码