zoukankan      html  css  js  c++  java
  • Keil C51学习 3 数码管和9999 计数器

    博主用的这个主板通过CPLD实现类似3-8译码器功能来控制四位数码管,至于段选和位选这些不是很清楚。之后内容会补充

    以下代码实现四位数码管的最高位,闪烁显示0和1

     1 #include<reg52.h> //包含头文件,一般情况不需要改动,
     2 #include <absacc.h>
     3 #define SEG1 XBYTE[0xffec]
     4 #define SEG2 XBYTE[0xffed]
     5 #define SEG3 XBYTE[0xffee]
     6 #define SEG4 XBYTE[0xffef]
     7 #define uchar unsigned char    //头文件包含特殊功能寄存器的定义
     8 void delay100ms(unsigned char num);
     9 //共阳
    10 uchar code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, //0-9
    11                                         0x88,0x83,0xc6,0xa1,0x86,0x8e,//A-F
    12     0x7f//
    13 };
    14 
    15 
    16 
    17 /*------------------------------------------------
    18                 四位数码管使用
    19 ------------------------------------------------*/
    20 void main (void)
    21 {
    22     uchar x=0x3;
    23     bit flag=0;
    24     SEG1=SEG2=SEG3=SEG4=0xff;//全灭
    25     while(1)
    26     {
    27         flag=1;
    28         SEG1=smg[flag];
    29         delay100ms(5);
    30         flag=0;
    31         SEG1=smg[flag];
    32         delay100ms(5);
    33     }
    34 }
    35 //延时函数
    36 void delay100ms(unsigned char num)
    37 {
    38     unsigned char n,m;
    39     for(;num;num--)
    40     {
    41         for(n=500;n;n--)
    42         {
    43             for(m=500;m;m--);
    44         }
    45     }
    46 }
    四位数码管使用

    指针实现数据管显示

    #include <reg52.h>
    #include <absacc.h>
     #define SEG1 XBYTE[0xffec]
     #define SEG2 XBYTE[0xffed]
     #define SEG3 XBYTE[0xffee]
     #define SEG4 XBYTE[0xffef]
    void delay(unsigned int); //延时函数声明。
    /****************************************************************************** 
    数码管显示段码(共阳),0、1、2、3、4、5、6、7、8、9。
    ******************************************************************************/ 
    unsigned char data dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 
    void main(void) 
    {unsigned char i,*p; 
    while(1) 
    { 
     p=dis; //取数组的首地址赋给指针p,数组名代表了数组的首地址。
     for(i=0;i<9;i++) 
     { 
    SEG4=*p++; //取数组中的元素,同时指针加1指向下一个元素。
    
     delay(100); //调用延时函数。
     } 
    } 
    } 
    /*******************************延时函数**************************************/ 
    void delay(unsigned int i) 
    { 
     unsigned int j; 
     for(;i!=0;i--) 
     for(j=3000;j!=0;j--) ; 
    }
    指针实现数据管显示

    0-9999 计数器

     1 #include<reg52.h> //包含头文件,一般情况不需要改动,
     2 #include <absacc.h>
     3 #define SEG1 XBYTE[0xffec]
     4 #define SEG2 XBYTE[0xffed]
     5 #define SEG3 XBYTE[0xffee]
     6 #define SEG4 XBYTE[0xffef]
     7 #define uchar unsigned char    //头文件包含特殊功能寄存器的定义
     8 void delay100ms(unsigned char num);
     9 //共阳
    10 uchar code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90   //0-9
    11 };
    12 unsigned int count;
    13 /*------------------------------------------------
    14                 四位数码管 0-9999
    15 ------------------------------------------------*/
    16 void main (void)
    17 {
    18     bit flag=0;
    19     SEG1=SEG2=SEG3=SEG4=0xff;//全灭
    20     
    21     if(count>9999)
    22     {
    23         count=0;
    24     }
    25     while(1)
    26     {
    27           SEG4 = smg[count%10];
    28             SEG3 = smg[count/10%10];    
    29             SEG2 = smg[count/100%10];
    30             SEG1 = smg[count/1000%10];
    31         count++;
    32         delay100ms(5);
    33     }
    34 }
    35 //延时函数
    36 void delay100ms(unsigned char num)
    37 {
    38     unsigned char n,m;
    39     for(;num;num--)
    40     {
    41             for(n=500;n;n--)
    42         {
    43             for(m=500;m;m--);
    44         }
    45     }
    46 }
    0-9999计数器

     分钟计时器

    #include<reg52.h>//包含访问sfr库函数
    #include<intrins.h>//包含访问内联库函数
    #include <absacc.h>  
    typedef unsigned int uint;      //对数据类型进行声明定义
    typedef unsigned char uchar;    
    sbit P10=P1^0;
    sbit k1=P3^2;           //包含绝对地址访问库函数
    #define SEG1 XBYTE[0xffec]
    #define SEG2 XBYTE[0xffed]
    #define SEG3 XBYTE[0xffee]
    #define SEG4 XBYTE[0xffef]
    //共阳
    uchar code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };//0-9
    /*
        精确定时1秒闪烁LED
     */
     uint count;
    
    unsigned char led=0xff,mask=0x1;
    main()
    {
            RCAP2H=0X10; //赋值52 0X1000,溢出30次等于1秒
            RCAP2L=0X00;
            TR2=1;    //启动定时器
            ET2=1;    //打开定时器2中断
            EA=1;        //打开总中断
         SEG1=SEG2=SEG3=SEG4=0xff;//全灭
        while(1)
        {
             SEG4 = smg[count%10];
         SEG3 = smg[count/10%6];    
         SEG2 = smg[count/60%10];
         SEG1 = smg[count/600%10];
        }
    }
    
    //定时器2中断
    timer2() interrupt 5    //定时器2中断是5号
    {
        static uchar t;
        TF2=0;
        t++;
        if(t==30)
        {
            t=0;
             count++;
            P10=~P10;
        }
    }
    分钟计时
  • 相关阅读:
    C# Linq to XML
    C# StopWatch
    C# 深拷贝代码
    基础练习 完美的代价
    基础练习 矩形面积交
    基础练习 矩阵乘法 时间限制:1.0s 内存限制:512.0MB
    阶乘计算 高精度
    杨辉三角形 递归与非递归
    数的分解 时间限制:1000 ms | 内存限制:65535 KB 难度:1
    数列排序 sort qsort
  • 原文地址:https://www.cnblogs.com/bymeet/p/14348404.html
Copyright © 2011-2022 走看看