找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5152|回复: 6
打印 上一主题 下一主题
收起左侧

刚学PIC单片机,分享第一个电子时钟,定时器计时

[复制链接]
跳转到指定楼层
楼主


    #define _XTAL_FREQ 4000000 //晶振定义
    #include<pic.h> //头文件包含
//__CONFIG(0x3b31);//芯片配置字定义
// CONFIG1
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled)
// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)
    //宏定义
    #define uchar unsigned char
    #define uint unsigned int
    #define RS RC0 //命令数据选择
    #define RW RC1 //读写选择
    #define EN RC2 //使能
    uint count=0;
    uchar miao,fen,shi;
    /*******************延时函数部分******************
    大约延时1ms
    ************************************************/
    void delayms(uint ms)
    {
        uchar i,j;
        for(j=ms;j>0;j--)
        for(i=110;i>0;i--);
    }
   
    /*******************1602发送主函数******************
    ************************************************/
    void LCD_WRITE(uchar data,uchar com)
    {
        RS=com;//1表示数据;0表示命令
        PORTD=data;//将数据写入
        delayms(5);//延时
        EN=1;//使能
        delayms(5);//延时
        EN=0;//关闭
    }
    /*******************1602显示主函数******************
    //指定位置显示字符
    //输入:列地址X(0~15),行地址y(0~1)
    // 字符串指针*p,要显示的字符个数num
    ************************************************/
    void disp_1602(uchar x,uchar y,uchar *p,uchar num)
    {
        uchar i;
        for(i=0;i<num;i++)
        {
        if(0==y)
        x|=0x80;//第一行地址为0x80
        else
        x|=0xc0;//第二行地址为0xC0
        LCD_WRITE(x,0); //写地址命令
        LCD_WRITE(*p,1);//写数据
        x++;//地址加
        p++;//显示字符地址加
    }
    }
    /*******************初始化函数部分******************
    ************************************************/
    void LCD_init(void)
    {
        // ADCON1=0x07;//定义RE为数据口
         TRISC0=0;
         TRISC1=0;
         TRISC2=0;//RE口为输出
         RC0=0;
         RC1=0;
         RC2=0;//初始化输出低电平
         TRISD=0;//D口为输出
         PORTD=0;//输出0
         LCD_WRITE(0x38,0);//设置8位总线,双行显示
         LCD_WRITE(0x01,0);//清屏
         LCD_WRITE(0x0c,0);//开显示,关光标
         LCD_WRITE(0x06,0);//光标右移
         LCD_WRITE(0x80,0);//第一行显示位置
    }
    /*******************主程序函数******************
************************************************/
void main(void)
{
LCD_init();//端口初始化
    T1CKPS0=1;         
    T1CKPS1=1;                //前置分频器8分频
    TMR1CS=0;                 //TMR1工作于定时器方式
    TMR1L=(65536-12500)%256;  //定时12500个时钟
    TMR1H=(65536-12500)/256;
    GIE=1;     //总中断允许
    PEIE=1;    //外围功能模块中断允许
    TMR1IE=1;  //TMR1中断允许
    TMR1ON=1;  //启动TMR1
while(1)
{
            disp_1602(0,0,"Time:",5);//第一行显示temp:
            delayms(20);
            LCD_WRITE(0x80+5,0); //写地址命令
            LCD_WRITE(shi/10+0x30,1);//写数据
            LCD_WRITE(shi%10+0x30,1);//写数据
            LCD_WRITE(':',1);//写数据
            LCD_WRITE(fen/10+0x30,1);//写数据
            LCD_WRITE(fen%10+0x30,1);//写数据
            LCD_WRITE(':',1);//写数据
            LCD_WRITE(miao/10+0x30,1);//写数据
            LCD_WRITE(miao%10+0x30,1);//写数据      
}
}
//*********************中断服务程序******************
void interrupt isr(void)
{
  if(TMR1IE&&TMR1IF)      //判断是否为TMR1中断
  {
    TMR1L=(65536-12500)%256;
    TMR1H=(65536-12500)/256;
   
    TMR1IF=0;             //清TMR1中断标志位(必须用软件清零)  
    count++;
    if(count==10)
    {
        count=0;
        miao++;
        if(miao==60)
        {
            miao=0;
            fen++;
            if(fen==60)
            {
                fen=0;
                shi++;
                if(shi==24)
                    shi=0;
            }
        }
    }
  }
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:190577 发表于 2020-2-7 10:15 | 只看该作者
希望帮助需要的人
回复

使用道具 举报

板凳
ID:106272 发表于 2020-2-7 11:33 | 只看该作者
谢谢了,初学者,学习一下
回复

使用道具 举报

地板
ID:869854 发表于 2020-12-28 22:27 | 只看该作者
谢谢楼主,小萌新慢慢看
回复

使用道具 举报

5#
ID:870114 发表于 2020-12-29 11:49 | 只看该作者
谢谢楼主无私的分享,小萌新好好看好好学
回复

使用道具 举报

6#
ID:190577 发表于 2021-8-22 20:06 | 只看该作者
小菜鸡..... 发表于 2020-12-28 22:27
谢谢楼主,小萌新慢慢看

客气了,技术在于交流
回复

使用道具 举报

7#
ID:190577 发表于 2021-8-22 20:07 | 只看该作者
3310mad2 发表于 2020-2-7 11:33
谢谢了,初学者,学习一下

希望帮助需要的人
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表