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

📄 led.c

📁 单片机中的ADC模块
💻 C
字号:
/**********************************
** file_name led.c             **
** describe  七段数码管函数        **
** auther    芯生  **
** Time      2007-12-14          **
***********************************/

#include <iom128v.h>
#include <macros.h>
#include "stdtypes.h"
#include "led.h"

//共阳极,LED数据 不显点,亮的段为1,连接为P0~P7对应a~g,dp
const led_data[16]={
      0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
	    0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
	  };

/***********************
**8M时为 1000.25us
**4M时为 999.5us
**xtal 为晶振频率,单位为Mhz
************************/
void delay_1ms(void)
{
 unsigned int i;
 for(i=200;i>0;i--)
  ;
}
/***********************
**毫秒级延时
************************/
void delay_ms(unsigned int n)
{
 unsigned int i;
 for(i=n;i>0;i--)
 delay_1ms();
}
	  	  
/***********************
** 初始化对应端口为输出 
** ABCD 和 abcdefg dpi 共12个IO口
** 默认为 PD(4567) 和 PA(012345678)                                                                                                                                                                                                                                                                    
***********************/
void led_init(void)
{
 led_ddr = 0xFF; //abcdefg dpi               各位设为输出
 led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
 
 //初始化全灭
 led_port = 0xFF;
 led_contrl_port |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d);
}

/***********************
** 显示一位
** 输入:count显示在第几位(3210),data 要显示的数(0~f)
************************/
void display_one(UNS8 count, UNS8 data)
{

 led_contrl_port &= ~(1<<count); //选中对应要显示的位,从右至左,4567
 led_port = led_data[data];    //显示的数
 
 //如果对位进行了调整,就不在是4567,而是对应的值
}

/***********************
** 显示四位整数
** 输入:要显示的四位数data,显示模式mode,1为补零显示模式,默认不显示零
** 说明:可以小于四位数,mode=1时 自动补零
************************/
void display(UNS16 data,UNS8 mode)
{
UNS8 temp;
 //千位
 if(data>=1000)
 {//补零
   temp=data/1000;
   display_one(7,temp);
   delay_ms(6);  //6ms 是个经验值,刚好无闪烁,并且亮度较高
   led_contrl_port |= (1<<7);
 
 }
 else
  {  if(mode==1)
    {
    display_one(7,0);
    delay_ms(6);
    led_contrl_port |= (1<<7);
	}
  } 
 
 //百位
 if(data>=100)
 {
  temp=(data%1000)/100;
  display_one(6,temp);
  delay_ms(6);
  led_contrl_port |= (1<<6);
 }
 else
 {
  if(mode==1)
  {
  display_one(6,0);
  delay_ms(6);
  led_contrl_port |= (1<<6);
  }
 }
 //十位
 if(data>=10)
 {
  temp=(data%100)/10;
  display_one(5,temp);
  delay_ms(6);
  led_contrl_port |= (1<<5);
 }
 else
 {
  if(mode==1)
  {
  display_one(5,0);
  delay_ms(6);
  led_contrl_port |= (1<<5);
  }
 }
 //个位
  temp=data%10;
  display_one(4,temp);
  delay_ms(6);
  led_contrl_port |= (1<<4);
}

/***********************
** 显示四位浮点数 本函数占用 mega16 的空间 19%
** 输入:要显示的四位数
** 说明:可以小于四位数,自动补零
************************/

void display_float(float data)
{
 UNS8 temp;
 UNS16 temp2; //用于把浮点数变为整形
 // 人为保证data的值,可以不要错误处理。
 if (data>=1000)
 {
  led_error();
 }
 if (data<=0)
 {
  led_error();
 }
 //
 if(data<1)       //比如 0.123
 {
  display_one(7,0);   //显示0.
  led_port &= 0x7F; //点亮对应小数点
  delay_ms(6);
  led_contrl_port |= (1<<7);
  
  temp=(data*10);   // 0.123*10 = 1
  display_one(6,temp);
  delay_ms(6);
  led_contrl_port |= (1<<6);
  
  temp2=(data*100);
  temp=temp2%10; // 0.123*100%10 = 2
  display_one(5,temp);
  delay_ms(6);
  led_contrl_port |= (1<<5);
  
  temp2=(data*1000);
  temp=temp2%10; // 0.123*100%10 = 3
  display_one(4,temp);
  delay_ms(6);
  led_contrl_port |= (1<<4);
 }
 else if(data<10)  //比如1.234
 {
  temp=(data/1);   // 1.234/1 = 1
  display_one(7,temp);
  led_port &= 0x7F; //点亮对应小数点
  delay_ms(6);
  led_contrl_port |= (1<<7);
  //第一位小数
  temp2=(data*10);
  temp=temp2%10; // 1.234*10%10 = 2
  display_one(6,temp);
  delay_ms(6);
  led_contrl_port |= (1<<6);
  //第二位小数
  temp2=(data*100);
  temp=temp2%10; // 1.234*100%10 = 3
  display_one(5,temp);
  delay_ms(6);
  led_contrl_port |= (1<<5);
  //第三位小数
  temp2=(data*1000);
  temp=temp2%10; // 1.234*1000%10 = 4
  display_one(4,temp);
  delay_ms(6);
  led_contrl_port |= (1<<4);
 }
 else if(data<100)   // 例如12.34
 {
  temp2=data;
  temp=(temp2/10);   // 12.34/10=1
  display_one(7,temp);
  delay_ms(6);
  led_contrl_port |= (1<<7);
  
  temp2=data;
  temp=(temp2%10);   // 12.34%10=2
  display_one(6,temp);
  led_port &= 0x7F; //点亮对应小数点
  delay_ms(6);
  led_contrl_port |= (1<<6);
  
  temp2=(data*10);
  temp=temp2%10; // 12.34*10%10=3
  display_one(5,temp);
  delay_ms(6);
  led_contrl_port |= (1<<5);
  
  temp2=(data*100);
  temp=temp2%10;// 12.34*100%10=4
  display_one(0,temp);
  delay_ms(6);
  led_contrl_port |= (1<<4);
 }
 else if(data<1000)  //比如123.4
 {
  temp2=data;
  temp=(temp2/100);// 123.4/100=1
  display_one(7,temp);
  delay_ms(6);
  led_contrl_port |= (1<<7);
  
  temp2=data/10;
  temp=temp2%10;// 123.4/10%10=2
  display_one(6,temp);
  delay_ms(6);
  led_contrl_port |= (1<<6);
  
  temp2=data;
  temp=(temp2%10);// 123.4%10=3
  display_one(5,temp);
  led_port &= 0x7F; //点亮对应小数点
  delay_ms(6);
  led_contrl_port |= (1<<5);
  
  temp2=(data*10);
  temp=temp2%10;// 123.4*10%10=4
  display_one(4,temp);
  delay_ms(6);
  led_contrl_port |= (1<<4);
 }
 else led_error();
}

/***********************************************
** 显示浮点数 本函数占用 mega16 的空间 9%,有一点闪烁感,可将display中的延时调小
** 思路二:直接显示整数,再显示点
** 注意:输入的data必须为小于1000的四位小数(0.234,1.23,12.45,224.8) 等
***********************************************/

void display_float2(float data)
{
 UNS16 temp;
 if(data>1000)
 {
 temp=data;
 display(temp,1);
  return;
 }
 if(data>100)   //比如123.4
 {
  temp=data*10;
  display(temp,0); //普通模式显示 1234
  led_contrl_port |= (1<<5); //选中第三位
  led_port = 0x80; //点亮对应小数点
  delay_ms(6);
  led_contrl_port &=~ (1<<5);
  return;
 }
 if(data>10)   //比如12.34
 {
  temp=data*100;
  display(temp,0); //普通模式显示 1234
  led_contrl_port |= (1<<6); //选中第二位
  led_port = 0x80; //点亮对应小数点
  delay_ms(6);
  led_contrl_port &=~ (1<<6);
  return;
 }
 if(data>1)   //比如1.234
 {
  temp=data*1000;
  display(temp,0); //普通模式显示 1234
  led_contrl_port |= (1<<7); //选中第一位
  led_port = 0x80; //点亮对应小数点,这里用等于,否则display函数的显影有残留。
  delay_ms(6);
  led_contrl_port &=~ (1<<7);
  return;
 }
}

/***********************************************
** 异常处理,led全亮 8。8。8。8。
***********************************************/
void led_error(void)
{
 // 以下两句将会使LED全亮,如果立即更改状态,将看不出来效果
  led_port = 0xFF;
  led_contrl_port |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d);
}

⌨️ 快捷键说明

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