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

📄 demo_15_2.c~

📁 AVR单片机嵌入式系统原理与应用实践例码
💻 C~
字号:
/*********************************************
File name			: Demo_15_2.c
Chip type           : ATmega16
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*********************************************/
#include <mega16.h>
#define SS	PORTB.4
#define dv  196         // 5v*100/255

flash char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
flash char position[6]={0xfe,0xfd,0xfb};

char dis_buff[3];
char posit;
char ad_reslt;
unsigned int vot;

void display(void) // 3位LED数码管动态扫描函数
{
	PORTC = 0xff;
	PORTA = led_7[dis_buff[posit]];
	if (posit==2) PORTA |= 0x80;
	PORTC = position[posit];
	if (++posit >=3 ) posit = 0;
}

void vot_to_disbuffer(void) // 电压值送显示缓冲区函数
{
	dis_buff[2] = vot/100;
	vot = vot%100;
	dis_buff[1] = vot/10;
	dis_buff[0] = vot%10;
}

// SPI中断服务
interrupt [SPI_STC] void spi_isr(void)
{
	ad_reslt=SPDR;			// 读取TLC594转换值
	SS = 1;					// 抬高SS完成1次SPI操作  
	vot= ((unsigned int)ad_reslt*dv)/100;	// AD结果转化成电压
	vot_to_disbuffer(); 		// 得到的电压值送显示缓冲区
}

// Timer0 比较匹配中断服务 2ms一次
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
	display(); 				// 调用LED 扫描显示
    SS = 0;                 // 每隔2ms选通TLC594
	SPDR=0x00;              // 启动SPI
}

void main(void)
{
	PORTA=0x00;		// 数码管短输出
	DDRA=0xFF;
	PORTB=0x40;		// SPI接口
	DDRB=0x90;      // BB,CLK输出, MISO输入上拉有效  
	PORTC=0x07;		// 数码管位选通
	DDRC=0x07;
	// T/C0 初始化
	TCCR0=0x0B;
	OCR0=0x7C;
	TIMSK=0x02;
	//SPI初始化
	SPCR=0xD0;      // 主机方式,模式0,高位在前
	SPSR=0x00;      // SPI时钟 1M
	#asm("sei") 	// 开放全局中断
	while(1){};
}

⌨️ 快捷键说明

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