⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 71.c

📁 写小数并在数码管上显示出来。并显示至少两位小数。
💻 C
字号:
#include<math.h>       /*数学函数库*/
#include<absacc.h>     /*绝对地址访问函数*/
#include<intrins.h>    /*内部函数*/
#include"C8051F040.h"  /*C8051F040头文件*/

#define Decoding 0x09     /*译码模式*/
#define Brightness 0x0A   /*亮度*/
#define BoundaryScan 0x0B /*扫描界限*/
#define Brownout 0x0C     /*掉电模式*/
#define DisplayTest 0x0F  /*显示测试*/

typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;

//显示部分
uchar xdata dispbuff[7];
uchar bit_sym=0,bit_int,bit_dec,bit_all;    /*符号位,整数位,小数位及全部位数*/
float xdata part_dec;             /*小数部分*/
ulong xdata part_int,part_dec_int;/*整数部分和小数部分取整*/
uchar num[13]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x00,0xFF,0x01};/*从0~9及全灭,全亮和"-"*/
sbit dis_LOAD=P3^2; /*MAX7219 Load-Data Input: rising edge*/
sbit dis_DIN=P3^0;  /*MAX7219 Serial-Data Input: rising edge*/
sbit dis_CLK=P3^3;  /*MAX7219 Serial-Clock Input: maximum 10MHz*/

//延时纳秒
void delayns(void) 
{
   	  _nop_();
      _nop_();
      _nop_();
      _nop_();
}

//传送1字节(8位)
void SendChar (uchar ch)
{
    uchar i,temp;
    dis_CLK=0;
    for (i=0;i<8;i++)
    {
        temp=ch&0x80;
        ch=ch<<1;
        if(temp)
        {
            dis_DIN=1;
            delayns();
            dis_CLK=1;
            delayns();
            dis_CLK=0;
        }
        else
        {
            dis_DIN=0;
            delayns();
            dis_CLK=1;
            delayns();
            dis_CLK=0;
        }
    }
}

//向MAX7219写入字(16位)
void WriteWord (uchar addr,uchar num)
{
    dis_LOAD=0;
    delayns();
    SendChar(addr);
    delayns();
    SendChar(num);
    delayns();
    dis_LOAD=1;
    delayns();


}

//数值显示
void dis_result()
{
    WriteWord(0x01,dispbuff[5]);
    WriteWord(0x02,dispbuff[4]);
    WriteWord(0x03,dispbuff[3]);
    WriteWord(0x04,dispbuff[2]);
    WriteWord(0x05,dispbuff[1]);
    WriteWord(0x06,dispbuff[0]);
}

//利用递归法实现指数运算
ulong power(ulong number,uint index)reentrant
{                                        
     ulong result;
     if(index==0) result=1;
     else result=number*power(number,index-1);
     return(result);
}

//数值计算
void disp(float f)
{
     int i,j;
     if(f<0.0)
     {
      bit_sym=1;
      f=-f;
     }
     part_int=(long)f;
     part_dec=f-part_int;
     part_dec_int=(long)(part_dec*100000);/*小数部分取整*/
     bit_dec=5;/*小数部分的最多位数*/
     bit_int=1;/*整数部分的最少位数*/
     bit_all=1;/*总显示的最少位数*/
     //计算小数位数
     for(i=1;i<=5;i++)
     {
       if(part_dec_int%(power(10,i))==0)  
       bit_dec=bit_dec-1;
     }
     //计算整数位数
     for(i=0;i<=5;i++)
     {
       if(part_int>=power(10,i)) 
       bit_int=i+1;
     }
     //总的显示位数最多为6
     if(bit_dec+bit_int+bit_sym>6) 
     bit_dec=6-bit_int-bit_sym;
     //总的显示位数
     bit_all=bit_sym+bit_int+bit_dec;

    
    
     if(bit_dec>0)
     {
         for(i=5-bit_int-bit_sym,j=5;i>=0,j>=1;i--,j--)
         {
           dispbuff[i]=num[(part_dec_int%(power(10,j)))/(power(10,j-1))];/*该语句实现对各位的求取*/
         }
     }
    
	 
	    for(i=5-bit_int-bit_sym+1,j=bit_int;i<=5,j>=1;i++,j--) 
		{
		   dispbuff[i]=num[(part_int%(power(10,j)))/(power(10,j-1))];
		}    
     
    //显示符号位
     if(bit_sym==1)
	 
        dispbuff[5]=num[12];
		
	 
    
     //小数点位置
     if(bit_dec>0)     
     dispbuff[5-bit_int+1]=dispbuff[bit_dec]+0x80;
     //位不足则高位不显示
     if(6-bit_all>0) 
     {
       for(i=0;i<6-bit_all;i++)
       {
        dispbuff[bit_all+i]=num[10];
       }
     }
}

void ConfigC8051F040()
{
    int i;       /*延时计数器*/
//看门狗禁止
	WDTCN=0x07;  /*设置看门狗超时间隔*/	
   WDTCN=0xDE;   
   WDTCN=0xAD;
//交叉开关使能配置,使得P0~P3口能输出
	SFRPAGE=0x0F;
   XBR0=0x00;	
	XBR1=0x00;	
	XBR2=0x40;
 	XBR3=0x00;   
//管脚输出配置
 	SFRPAGE=0x0F;
   P3MDOUT=0x0F; /*P3[3:0]推挽输出,用以显示部分*/ 
//晶振配置
    SFRPAGE=0x0F;
    OSCXCN=0x77;  
 /*配置为外部石英晶振2分频模式,且配置相应频率的驱动电流*/
	for(i=0;i<256;i++);   /*等待外部晶振稳定*/
	while(!(OSCXCN & 0x80)); 
    /*查询XTLVLD是否为1,若为1,表明外部晶振稳定,可切换到外部时钟*/
    CLKSEL=0x01;    /*选择外部晶振*/
    OSCICN=0x00;    /*将内部晶振关闭,也可不关闭,不关闭时MCU耗能高*/
}

//MAX7219初始化
void InitDis (void)
{
	WriteWord(Brownout,0x00);     /*设置电源工作模式*/
	WriteWord(BoundaryScan,0x06); /*设置扫描界限*/
	WriteWord(Brightness,0x05);   /*设置亮度*/
	WriteWord(Decoding,0x00);     /*设置译码模式*/
    WriteWord(DisplayTest,0x00);  /*设置非测试模式*/
	WriteWord(Brownout,0x01);     /*设置电源工作模式*/
}

main()
{
	 ConfigC8051F040();
    InitDis();
    disp(5.3800);
	 dis_result();
    WriteWord(0x07,0x04);/*发光二极管显示*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -