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;
    }
}
分钟计时
原文地址:https://www.cnblogs.com/bymeet/p/14348404.html