?? ad_led.c
字號:
/******************************************************
雙龍電子公司http://www.sl.com.cn
AT90S8535--AD轉換演示程序(ICCAVR)
作者:詹衛前
使用注意:1、應包含頭文件slavr.h
2、在工程選項中的Additional Lib中填入slavr
使用編譯器使用附加庫文件libslavr.a
3、使用SL-AVRAD實驗設備
接線說明:1、PA.0(PIN40)處接電平指示LED的短路塊斷開
2、A/D和VX之間的短路塊閉合
3、AREF(PIN32)和AVCC(PIN30)接VCC
4、AGND(PIN31)接GND
*******************************************************/
#include<io8535.h>
#include<slavr.h>
#include<macros.h>
/* 七段譯碼字形表 */
const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/* 顯示緩沖區 */
unsigned char ledbuff[6];
void port_init(void)//端口初始化
{
DDRD=0x3f;
DDRB=0xff;
PORTD=0xff;
PORTB=0xff;
}
void display(void)//六路動態掃描顯示電路
{
unsigned char i;
for (i=0;i<6;i++)
{
PORTB=ledbuff[i];//將顯示緩沖區數據送PORTB口
PORTD=~(1<<i); //開始顯示
delay_1ms(); //每一位顯示保持一定時間
PORTD|=(1<<i); //關閉顯示
}
}
unsigned int ad_con;//存放PA0的AD轉換結果
/* 將AD結果轉換成電壓 */
#define vref 497
void adctovol(unsigned int adc)
{
unsigned int temp;
unsigned char i;
unsigned char *char_p;
temp=(unsigned int)(((unsigned long)((unsigned long)adc*vref))/1024);
for(i=0;i<3;i++)
{
ledbuff[i]=tabel[temp%10];
temp=temp/10;
}
ledbuff[5]=tabel[0x0a];
ledbuff[4]=tabel[0x0d];
ledbuff[3]=0x40;
ledbuff[2]|=0x80;
}
/* AD轉換程序 */
#pragma interrupt_handler adc_isr:IT_ADC
void adc_isr(void)
{
unsigned int temp=0;
while(temp<6)
temp++;
ad_con=ADC;
ADCSR|=(1<<ADSC);//啟動轉換
}
//將AD轉換結果轉換成電壓數值,然后在LCD上顯示
void main(void)
{
unsigned char i;
port_init();
MCUCR=0;
ADMUX=0x00;//0通道
ADCSR=(1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|0x06;
SEI();
for(i=0;i<6;i++)
ledbuff[i]=tabel[0];
i=0;
while(1)
{
if((i==127)|(i==0))
adctovol(ad_con);//降低AD結果刷新速率
display(); //使末位閃爍不太明顯
i++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -