📄 led.c
字号:
#include "system.h"
#include <INTRINS.H> //为调用nop空指令需要
/*共阳极8段LED段码表: "0"“1”“2”“3”“4”“5”“6”“7”“8”“9"*/
char code ledtable[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*送译码器的三个值 能够实现译码 即驱动8个数码管*/
sbit A = P3^4;
sbit D = P3^2;
sbit C = P3^3;
sbit E = P1^7; //小数点的放置
sbit DQ = P3^7; //温度输入口
unsigned char data disv[2] = {0x00,0x00}; //存放ADC通道0的电压值 //存放ADC通道1的电压值
unsigned char data disa[3] = {0x00,0x00,0x00}; //存放ADC通道1的电流值
unsigned char data display[3] = {0x00,0x00,0x00}; //显示单元数据,共3个,一个运算符暂用
#define Disdata P1
void LedDisp(void)
{
static char place = 0; //place决定哪位数码管点亮
unsigned char ledout; //最终送往显示端口的数据
//**************根据place的值扫描LED 8数码管********************
switch(place)
{
case 0:
A = 1;
D = 1;
C = 1;
ledout = 0xff;
ledout = ledtable[disv[0]]; //提取出0的LED显示代码
Disdata = ledout; //送到P1端口上显示
if(power < 10)
{
E = 0;
}
A = 1;
D = 1;
C = 1;
place = 1; //第1个数码显示完毕,转向2位显示
break;
case 1:
A = 1;
D = 1;
C = 1;
ledout = 0xff;
ledout = ledtable[disv[1]]; //提取出0的LED显示代码
Disdata = ledout; //送到P1端口上显示
A = 0;
D = 1;
C = 1;
place = 2; //第2个数码显示完毕,转向3位显示
break;
case 2:
A = 0;
D = 1;
C = 1;
ledout = 0xff;
ledout = ledtable[disa[0]]; //提取出0的LED显示代码
Disdata = ledout; //送到P1端口上显示
if(current < 10)
{
E = 0;
}
A = 1;
D = 0;
C = 1;
place = 3; //第3个数码显示完毕,转向4位显示
break;
case 3:
A = 1;
D = 0;
C = 1;
ledout = 0xff;
ledout = ledtable[disa[1]]; //提取出0的LED显示代码
Disdata = ledout; //送到P1端口上显示
if(current >= 10)
{
E = 0;
}
A = 0;
D = 0;
C = 1;
place = 4; //第4个数码显示完毕,转向5位显示
break;
case 4:
A = 0;
D = 0;
C = 1;
ledout = 0xff;
ledout = ledtable[disa[2]]; //提取出0的LED显示代码
Disdata = ledout; //送到P1端口上显示
A = 1;
D = 1;
C = 0;
place = 5; //第5个数码显示完毕,转向6位显示
break;
case 5:
A = 1;
D = 1;
C = 0;
/* if(n == 1)
{
ledout = 0xff;
Disdata = 0xbf; //写“-”
A = 0;
D = 1;
C = 0;
n = 0;
}
else
{
*/
ledout = 0xff;
ledout = ledtable[display[0]];
Disdata = ledout;
if(tmp < 10) //小数点判别
{
E = 0;
}
A = 0;
D = 1;
C = 0;
//第6个数码显示完毕,转向7位显示
// } place = 6;
break;
case 6:
A = 0;
D = 1;
C = 0;
ledout = 0xff;
ledout = ledtable[display[1]];
Disdata = ledout;
if((tmp>=10) && (tmp<100)) //小数点判别
{
E = 0;
}
A = 1;
D = 0;
C = 0;
place = 7; //第7个数码显示完毕,转向8位显示
break;
case 7:
A = 1;
D = 0;
C = 0;
ledout = 0xff;
ledout = ledtable[display[2]];
Disdata = ledout;
A = 0;
D = 0;
C = 0;
place = 0; //第8个数码显示完毕,转向1位显示
break;
}
}
/************将实际电压值转化为LED要显示的BCD码*******************/
void test(void)
{
unsigned int int_disv;
unsigned int int_number;
unsigned int int_temp;
if(power < 10)
{
int_disv = (unsigned int)(power * 10);
disv[0] = int_disv / 10; //取商 取出十位数字 送第一个LED显示
disv[1] = int_disv % 10; //取余,取出个位数字 送第二个LED显示
}
else
{
int_disv = (unsigned int)(power * 10);
disv[0] = int_disv / 100; //取商 取出十位数字 送第一个LED显示
disv[1] = (int_disv % 100)/10; //取余,取出个位数字 送第二个LED显示
}
if(current < 10)
{
int_number = (unsigned int)(current*100); //对ADC0809检查出的电压进行取整
disa[0] = int_number / 100; //取出第1位送入第三个数码管
disa[1] = ((int_number % 100) / 10); //取出第2位送入第四个数码管
disa[2] = (int_number % 10); //取出小数位送入第五个数码管
}
else
{
int_number = (unsigned int)(current*100); //对ADC0809检查出的电压进行取整
disa[0] = int_number / 1000; //取出第1位送入第三个数码管
disa[1] = ((int_number % 1000) / 100); //取出第2位送入第四个数码管
disa[2] = ((int_number %100) /10); //取出小数位送入第五个数码管
}
if(tmp < 10)
{
int_temp = (unsigned int)(tmp*100); //对ADC0809检查出的电压进行取整
display[0] = int_temp / 100; //取出第1位送入第三个数码管
display[1] = ((int_temp % 100) / 10); //取出第2位送入第四个数码管
display[2] = (int_temp % 10); //取出小数位送入第五个数码管
}
else
{
int_temp = (unsigned int)(tmp*100); //对ADC0809检查出的电压进行取整
display[0] = int_temp / 1000; //取出第1位送入第三个数码管
display[1] = ((int_temp % 1000) / 100); //取出第2位送入第四个数码管
display[2] = ((int_temp %100) /10); //取出小数位送入第五个数码管
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -