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

📄 led4.c

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 C
字号:
/*
模块说明:

	LED数码管中断动态显示程序。
	1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
	2、动态调度由片内定时器1中断产生,中断周期为5mS。
	3、内部1 M晶振,程序采用单任务方式,软件延时。
	4、此模块文件为使用文件,可直接用于项目中。
	
	
*/
#include "iom128v.h"
#include <macros.h>

unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0};

/*
前4位为显示数值。
最后一位为小数点显示位置。
*/
unsigned char led_buf[] = {0, 0, 0, 0, 1};	/*显示信息*/

/*------------------------------------------------------------------*-

	 Disp_Init()
	 显示初始化

-*------------------------------------------------------------------*/
void disp_init(void) {

	/*初始化定时器*/
	OCR1A = 625;							/*计数周期为5mS,F=1M*/
	TIMSK |= (1 << OCIE1A);					/*比较中断A允许*/
	TCCR1A = 0x00;
	TCCR1B = (1 << WGM12);					/*定时器工作在CTC计数器模式*/
	TCCR1B |= (1 << CS11);					/*设置定时器的分频值为8分频*/
	
	/*SPI接口初始化*/
	
	DDRB = 0xFF;							/* 设置PB口为输出*/
	SPCR = (1<<SPE) | (1<<MSTR)
		| (1<<SPR1) | (1<<SPR0);			/* 使能SPI 主机模式,设置时钟速率为fck/128 */
	
	/*中断使能*/
	SEI();
}

/*------------------------------------------------------------------*-
  
 	Int_TCCR1A()
 	LED数码管动态显示函数

	定时器'T1',A组比较中断产生5mS周期性中断
	在中断里刷新显示
 
-*------------------------------------------------------------------*/
#pragma interrupt_handler Int_TCCR1A: 13
void Int_TCCR1A(void) {

	unsigned char temp;
	static unsigned char i;
	
	PORTB &= ~(1 << PB0);					/*准备锁存*/
	PORTB |= 0xF0;							/*复位段选择口*/
	PORTB |= (1 << PB0);					/*锁存数据*/
	if (i == 3) {
		PORTB &= ~(1 << PB6);				/*由于此处显示数值滞后一个周期所以显示位也要修改*/
		}									/*此处逻辑性很强,如不能理解可先跳过,以后熟练来再看*/
	if (i == 2) {
		PORTB &= ~(1 << PB5);
		}
	if (i == 1) {
		PORTB &= ~(1 << PB4);
		}
	if (i == 0) {
		PORTB &= ~(1 << PB7);
		}
	temp = led_buf[i] % 16;					/*滤除溢出的数值*/
	temp = disp[temp];						/*取出当前显示信息*/
	if (led_buf[4] == i) {					/*显示小数点*/
		SPDR = temp & 0x7F;
		}
	else {
		SPDR = temp;
		}

	i ++;
	if (i > 3) {							/*溢出处理*/
		i = 0;
		}
}

⌨️ 快捷键说明

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