?? 4通道adc_t0定時中斷4位數(shù)碼管掃描顯示.c
字號:
// 多通道ADC_定時中斷4位數(shù)碼管掃描顯示.c T0 定時中斷; P1口段筆畫, 0=亮; P2口低4位作位選, 0=選中
#include <STC12C5410AD.H> // 單片機內(nèi)部專用寄存器定義
// 假定4個通道 P1.0 ~ P1.3
unsigned int adc[4]={0,0,0,0}; // 保存4個通道10位AD轉(zhuǎn)換結(jié)果
unsigned char adc_p=0; // 當(dāng)前ADC采樣通道號 0..3
unsigned char shrow_p=0; // 當(dāng)前4位LED顯示第幾通道(0..3)的ADC結(jié)果
sbit K1= P3^0; // 鍵K1輸入引腳定義
bit K1_b; // 前次鍵K1輸入狀態(tài)
/* T0_int 定時 時間常數(shù) 5ms=5000=1388H->EC78H f=12MH */
/* 5ms=4608=1200H->EE00H f=11.0592MH */
#define time_5ms_H 0xEE /* t=5ms for T0_INT_timer */
#define time_5ms_L 0x00
code unsigned char seg_tab[16]={ /* 顯示段筆劃 hgfedcba; 0=亮 */
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, /* 0,1,2,3,4,5,6,7,8,9 */
0x88,0x83,0xC6,0xA1,0x86,0x8E}; // A b C d E F
unsigned char led_buff[4]; /* 存放4位數(shù)碼管的段筆畫 */
unsigned char led_p=0; /* 待顯示的位 */
void delay(unsigned int i) { for(;i!=0;i--); }
// 將一整形量的值以4位10進制數(shù)顯示的段筆劃送顯示緩沖區(qū)
void led_fill_d(unsigned int n)
{ led_buff[3]=seg_tab[(unsigned char)(n%10)]; // 個位
n=n/10;
led_buff[2]=seg_tab[(unsigned char)(n%10)]; // 十位
n=n/10;
led_buff[1]=seg_tab[(unsigned char)(n%10)]; // 百位
n=n/10;
led_buff[0]=seg_tab[(unsigned char)(n%10)]; // 千位
}
//顯示一位。b=0,1,2,3 第幾位顯示指定
void shrow_1LED(unsigned char b)
{ P2 = P2 | 0x0F; // P2 口 LED 全滅. 0=亮
P1 = led_buff[b]; // 送段信號
P2 = P2 & (~(0x01<<b)); // 位選中, 該位亮
}
main()
{
TMOD= 0x11; /* 0001$0001 T1 & T0 are 16bit timers */
TH0 = time_5ms_H; /* T0 timer 5ms */
TL0 = time_5ms_L;
/* TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 */
TCON= 0x10; /* 0 0 0 1 0 0 0 0 */
/* start T0 xint1 xint0 */
IE= 0x82; /* 1000 0010, EA=ET0=1, */
P1M0 |= 0x0F; // P1.0 ~ P1.3設(shè)為高阻輸入. 用于AD輸入
ADC_CONTR= 0x80; // A/D 轉(zhuǎn)換控制寄存器 ADC_POWER SPEED1_SPEED0 ADC_FLAG ADC_START CHS2_CHS1_CHS0
// 啟動ADC轉(zhuǎn)換, adc_p 通道
ADC_CONTR= 0x80 + adc_p; // *ADC_POWER SPEED1_SPEED0 ADC_FLAG *ADC_START CHS2_CHS1_CHS0
while (1) // 死循環(huán)
{
delay(10000); // 軟延時
led_fill_d(adc[shrow_p]); // 數(shù) 填入顯示緩沖區(qū)
P2 = P2 | 0xF0; // P2 口 高4位的4個 LED 全滅. 0=亮
P2 = P2 & (~(0x01<<(shrow_p+4))); // 該位亮. 指示當(dāng)前顯示的ADC值屬于那個通道
}
}
//==========================================
/*===================================*/
/* T0 中斷服務(wù)程序[5MS定時中斷一次] */
/*===================================*/
void T0_ISR() interrupt 1 /* T0 Interrupt 1 */
{
unsigned int t;
TL0= time_5ms_L; // 重置5MS時間常數(shù)
TH0= time_5ms_H;
// 1. 掃描輸出一位LED
shrow_1LED(led_p); // 第led_p位亮
led_p=(led_p+1)%4; // 指向下一位, 為下一次中斷顯示用
// 2. 讀ADC轉(zhuǎn)換結(jié)果
// while ((ADC_CONTR & 0x10)==0); // 等待ADC轉(zhuǎn)換結(jié)束
t = ADC_DATA; // ADC 高8位
t = (t<<2) + (ADC_LOW2 &0x3); // 10位ADC結(jié)果
adc[adc_p]=t; // 保存ADC結(jié)果
adc_p=(adc_p+1)%4; // 指向下一通道
// 2.1 啟動下一次ADC轉(zhuǎn)換, adc_p 通道
ADC_CONTR= 0x80 + adc_p; // *ADC_POWER SPEED1_SPEED0 ADC_FLAG *ADC_START CHS2_CHS1_CHS0
// 3. 按鍵識別,防抖動處理
if (led_p==0) K1_b=K1; // 采樣按鍵K1
else if (led_p==3) // 采樣按鍵K1后,過了20MS
{
if ((K1==0) && (K1_b==1)) shrow_p=(shrow_p+1)%4; // 按鍵新按下, 切換顯示通道
K1_b=K1;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -