博主用的这个主板通过CPLD实现类似3-8译码器功能来控制四位数码管,至于段选和位选这些不是很清楚。之后内容会补充
以下代码实现四位数码管的最高位,闪烁显示0和1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
指针实现数据管显示
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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 计数器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
分钟计时器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; } }