📄 led._c
字号:
/**********************************
** file_name led.c **
** describe 七段数码管函数 **
** auther 古欣 www.avrvi.com **
** Time 200-2-25 **
** temp=(data*1000)%1; 这个式子中的%为取余数,temp为data的第三位小数,0.023(data) --> 3(temp)
***********************************/
#include "config.h"
//LED数据 不显点,亮的段为1,连接为P0~P7对应a~g,dp
const led_data[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x73,0x39,0x63,0x79};
/***********************
** 初始化对应端口为输出
** ABCD 和 abcdefg dpi 共12个IO口
** 默认为 PB(0123) 和 PA
***********************/
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全亮,如果立即更改状态,将看不出来效果
// 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(uint8 count, uint8 data)
{
led_port = led_data[data]; //显示的数
led_contrl_port |= (1<<count); //选中对应要显示的位,从右至左,0123
//如果对位进行了调整,就不在是0123,而是对应的值
}
/***********************
** 显示四位整数
** 输入:要显示的四位数data,显示模式mode,1为补零显示模式,默认不显示零
** 说明:可以小于四位数,mode=1时 自动补零
************************/
void display(uint16 data,uint8 mode)
{
uint8 temp;
//千位
if(data>=1000)
{
temp=data/1000;
display_one(3,temp);
delay_ms(6); //6ms 是个经验值,刚好无闪烁,并且亮度较高
led_contrl_port &=~ (1<<3);
}
else
{//补零
if(mode==1)
{
display_one(3,0);
delay_ms(6);
led_contrl_port &=~ (1<<3);
}
}
//百位
if(data>=100)
{
temp=(data%1000)/100;
display_one(2,temp);
delay_ms(6);
led_contrl_port &=~ (1<<2);
}
else
{
if(mode==1)
{
display_one(2,0);
delay_ms(6);
led_contrl_port &=~ (1<<2);
}
}
//十位
if(data>=10)
{
temp=(data%100)/10;
display_one(1,temp);
delay_ms(6);
led_contrl_port &=~ (1<<1);
}
else
{
if(mode==1)
{
display_one(1,0);
delay_ms(6);
led_contrl_port &=~ (1<<1);
}
}
//个位
temp=data%10;
display_one(0,temp);
delay_ms(6);
led_contrl_port &=~ (1<<0);
}
/***********************
** 显示四位浮点数 本函数占用 mega16 的空间 19%
** 输入:要显示的四位数
** 说明:可以小于四位数,自动补零
************************/
void display_float(float data)
{
uint8 temp;
uint16 temp2; //用于把浮点数变为整形
// 人为保证data的值,可以不要错误处理。
if (data>1000)
{
led_error();
}
if (data<0)
{
led_error();
}
//
if(data<1) //比如 0.123
{
display_one(3,0); //显示0.
led_port |= 0x80; //点亮对应小数点
delay_ms(6);
led_contrl_port &=~ (1<<3);
temp=(data*10); // 0.123*10 = 1
display_one(2,temp);
delay_ms(6);
led_contrl_port &=~ (1<<2);
temp2=(data*100);
temp=temp2%10; // 0.123*100%10 = 2
display_one(1,temp);
delay_ms(6);
led_contrl_port &=~ (1<<1);
temp2=(data*1000);
temp=temp2%10; // 0.123*100%10 = 3
display_one(0,temp);
delay_ms(6);
led_contrl_port &=~ (1<<0);
}
else if(data<10) //比如1.234
{
temp=(data/1); // 1.234/1 = 1
display_one(3,temp);
led_port |= 0x80; //点亮对应小数点
delay_ms(6);
led_contrl_port &=~ (1<<3);
//第一位小数
temp2=(data*10);
temp=temp2%10; // 1.234*10%10 = 2
display_one(2,temp);
delay_ms(6);
led_contrl_port &=~ (1<<2);
//第二位小数
temp2=(data*100);
temp=temp2%10; // 1.234*100%10 = 3
display_one(1,temp);
delay_ms(6);
led_contrl_port &=~ (1<<1);
//第三位小数
temp2=(data*1000);
temp=temp2%10; // 1.234*1000%10 = 4
display_one(0,temp);
delay_ms(6);
led_contrl_port &=~ (1<<0);
}
else if(data<100) // 例如12.34
{
temp2=data;
temp=(temp2/10); // 12.34/10=1
display_one(3,temp);
delay_ms(6);
led_contrl_port &=~ (1<<3);
temp2=data;
temp=(temp2%10); // 12.34%10=2
display_one(2,temp);
led_port |= 0x80; //点亮对应小数点
delay_ms(6);
led_contrl_port &=~ (1<<2);
temp2=(data*10);
temp=temp2%10; // 12.34*10%10=3
display_one(1,temp);
delay_ms(6);
led_contrl_port &=~ (1<<1);
temp2=(data*100);
temp=temp2%10;// 12.34*100%10=4
display_one(0,temp);
delay_ms(6);
led_contrl_port &=~ (1<<0);
}
else if(data<1000) //比如123.4
{
temp2=data;
temp=(temp2/100);// 123.4/100=1
display_one(3,temp);
delay_ms(6);
led_contrl_port &=~ (1<<3);
temp2=data/10;
temp=temp2%10;// 123.4/10%10=2
display_one(2,temp);
delay_ms(6);
led_contrl_port &=~ (1<<2);
temp2=data;
temp=(temp2%10);// 123.4%10=3
display_one(1,temp);
led_port |= 0x80; //点亮对应小数点
delay_ms(6);
led_contrl_port &=~ (1<<1);
temp2=(data*10);
temp=temp2%10;// 123.4*10%10=4
display_one(0,temp);
delay_ms(6);
led_contrl_port &=~ (1<<0);
}
else led_error();
}
/***********************************************
** 显示浮点数 本函数占用 mega16 的空间 9%,有一点闪烁感,可将display中的延时调小
** 思路二:直接显示整数,再显示点
** 注意:输入的data必须为小于1000的四位小数(0.234,1.23,12.45,224.8) 等
***********************************************/
void display_float2(float data)
{
uint16 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<<1); //选中第三位
led_port = 0x80; //点亮对应小数点
delay_ms(6);
led_contrl_port &=~ (1<<1);
return;
}
if(data>10) //比如12.34
{
temp=data*100;
display(temp,0); //普通模式显示 1234
led_contrl_port |= (1<<2); //选中第二位
led_port = 0x80; //点亮对应小数点
delay_ms(6);
led_contrl_port &=~ (1<<2);
return;
}
if(data>1) //比如1.234
{
temp=data*1000;
display(temp,0); //普通模式显示 1234
led_contrl_port |= (1<<3); //选中第一位
led_port = 0x80; //点亮对应小数点,这里用等于,否则display函数的显影有残留。
delay_ms(6);
led_contrl_port &=~ (1<<3);
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 + -