📄 demo_15_2.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 + -