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

📄 led.c

📁 使用Atmel88芯片实现RS485通讯,Modbus通讯协议.在IVR_AVR环境中编译,文件完整.
💻 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])(void);  //定义函数指针数组.
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 + -