📄 led._c
字号:
//LED device
#include <iom48v.h>
#include <macros.h>
#include "main.h"
#include "modbus.h"
#include "timer2.h"
static char aloneD[4];
//led
void (*pcled[10])(); //定义函数指针数组.
unsigned int LedShowLink;
// PB0 PB1 PB2 PB3 PB4 PB5 PD6 PD7
// A B C D E F G dp
void light_0(void)
{
//0000'0011
PORTB &= 0xc0;
PORTD |= 0x40;
}
void light_1(void)
{ //0010'0101
PORTB &= 0b11111001;
PORTB |= 0b00111001;
PORTD |= 0b01000000;
}
void light_2(void)
{ //0010'0101
PORTB &= 0b11100100;
PORTB |= 0b00100100;
PORTD &= 0b10111111;
}
void light_3(void)
{ //0000'1101
PORTB &= 0b11110000;
PORTB |= 0b00110000;
PORTD &= 0b10111111;
}
void light_4(void)
{ //1001'1001
PORTB &= 0b11011001;
PORTB |= 0b00011001;
PORTD &= 0b10111111;
}
void light_5(void)
{ //01001001
PORTB &= 0b11010010;
PORTB |= 0b00010010;
PORTD &= 0b10111111;
}
void light_6(void)
{ //01000001
PORTB &= 0b11000010;
PORTB |= 0b00000010;
PORTD &= 0b10111111;
}
void light_7(void)
{ //00011111
PORTB &= 0b11111000;
PORTB |= 0b00111000;
PORTD |= 0b01000000;
}
void light_8(void)
{ //00000001
PORTB &= 0b11000000;
//
PORTD &= 0b10111111;
}
void light_9(void)
{ //00001001
PORTB &= 0b11010000;
PORTB |= 0b00010000;
PORTD &= 0b10111111;
}
void led_init(void)
{
//段码 1: output; 0: input.
DDRD |= 0xc0; // 0b1100'0000
DDRB |= 0x3f; // 0b0011'1111
//位码
DDRC |= 0x3c; // 0b0011'1100
//
PORTC &= 0b11011111;
PORTC |= 0b00100000;
PORTC &= 0b11011111;
PORTC |= 0b00010000;
PORTC &= 0b11101111;
//连接
pcled[0] = light_0;
pcled[1] = light_1;
pcled[2] = light_2;
pcled[3] = light_3;
pcled[4] = light_4;
pcled[5] = light_5;
pcled[6] = light_6;
pcled[7] = light_7;
pcled[8] = light_8;
pcled[9] = light_9;
}
//位计算.
void CalculateSub(unsigned int Digit,char *p_aloneD)
{
*p_aloneD = (char)(Digit/1000);
Digit -= *p_aloneD++ * 1000;
*p_aloneD = (char)(Digit/100);
Digit -= *p_aloneD++ * 100;
*p_aloneD = (char)(Digit/10);
Digit -= *p_aloneD++ * 10;
*p_aloneD = (char)Digit;
p_aloneD = 0;
}
void sub2(void)
{
static int ShowDigit;
NOP();
ShowDigit = LedShowLink;// 0x4d2;//
CalculateSub(ShowDigit, &aloneD[0]);
NOP();
}
void subled(void)
{
static char ledbitcou=0b00000000;
// static char coui ; //用作数组aloneD[]下标.
char bytebit=0,byteT=0;
//为每位扫描. 1,置一,四位都不亮; 2,清零,点亮一个位.
if(ledbitcou == 0)
{
bytebit = 0b11111011;
}else if(ledbitcou == 1)
{
bytebit = 0b11110111;
}else if(ledbitcou == 2)
{
bytebit = 0b11101111;
}else if(ledbitcou == 3)
{
bytebit = 0b11011111;
}
//先清段码
// PORTA &= 0b11110000;
// PORTA |= bytebit;
PORTD |= 0b11000000; //包含了小数点
PORTB |= 0b11111100;
//置位位码
PORTC |= 0b00111100;
PORTC &= bytebit;
//置位段码
byteT = aloneD[ledbitcou];
(*pcled[byteT])(); //调用语句.
if(++ledbitcou == 4)
ledbitcou = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -