?? 數顯.c
字號:
#include "reg51.h"
#include "math.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define led_sec P1
#define dac_adr 0x7fff //初始DAC0832的地址
sbit inc_key = P3^0; //"+" 鍵
sbit dec_key = P3^1; //"-" 鍵
sbit step_key = P3^2; //調整鍵
sbit ten = P3^3; //數碼管的十位
sbit one = P3^4; //數碼管的個位
sbit point = P3^5; //數碼管的小數位
char xdata dacreg _at_ dac_adr; //定義DAC0832的地址
bit flag0 = 0;
uchar arry10[10] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar arry1[10] = { 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uchar arry0[10] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//顯示部分
uchar * ptr10 = arry10;
uchar * ptr1 = arry1;
uchar * ptr0 = arry0;
void ini_int(void) //中斷初始化
{
inc_key = 1;
dec_key = 1;
EA = 1;
EX0 = 1;
IT0 = 1; //邊沿觸發方式
}
//**************************delayfunction************************************
//延時動態掃描
void delay( uint count) //延遲周期是 20us
{ uint i,j;
for (i=0;i<count;i++);
for (j=0;j<240;j++);
}
//**************************buffer**************************************
//根據地址查表得出要顯示的電壓值
void buffer(uchar led10,uchar led1,uchar led0) //緩沖區
{
ten = 0;
led_sec = *(led10 + ptr10);
delay(500); // 延遲 10ms
ten = 1;
one = 0;
led_sec = *(led1 + ptr1);
delay(500); // 延遲 10ms
one = 1;
point = 0;
led_sec = *(led0 + ptr0);
delay(500); // 延遲 10ms
point = 1;
}
//BCD碼到十進制的轉換
void disp_out(unsigned char dat)
{
uchar dig_10,dig_1,dig_0,temp,temp1;
temp = dat;
dig_10 = temp/100;
temp1 = temp%100;
dig_1 = temp1/10;
dig_0 = temp%10;
buffer(dig_10,dig_1,dig_0);
}
//**********************主程序***********************************
void main()
{
unsigned char dac_dat,dac_temp;
uchar inc_key_temp = 1;
uchar dec_key_temp = 1;
dac_dat = 0xd;
flag0 = 0; // 初始化標志位
dac_temp = dac_dat;
dacreg = dac_temp; //把輸出電位至到 1.3V
ini_int(); //外部中斷
disp_out(dac_temp);
while (1) //*~dec_key | ~inc_key*/
{
if ( inc_key == 0 ) //判斷有沒有加鍵按下
{
delay(600);
inc_key_temp = (inc_key == 0) ? 0 : 1;
//按鍵釋放前一直掃描顯示,如果按鍵釋放則跳出并 "+" 1
do
{
disp_out(dac_temp);
}
while (inc_key == 0);
}
else if( dec_key == 0 ) //判斷有沒有減鍵按下
{
delay(600);
dec_key_temp = (dec_key == 0) ? 0 : 1; //按鍵釋放前一直掃描顯示,如果按鍵釋放則跳出并 "-" 1
do
{
disp_out(dac_temp);
}
while (dec_key == 0);
}
else
{
;
}
if ( ~flag0 & ~dec_key_temp & (dac_temp>13)) //步進減 0.1V
{
dec_key_temp = 1;
dac_dat = dac_dat - 1;
dac_temp = dac_dat;
dacreg = dac_temp;
disp_out(dac_temp);
}
else if ( ~flag0 & ~inc_key_temp & (dac_dat<161)) // 步進加 0.1V
{
inc_key_temp = 1;
dac_dat = dac_dat + 1;
dac_temp = dac_dat;
dacreg = dac_temp;
disp_out(dac_temp);
}
else if ( flag0 & ~dec_key_temp & (dac_dat>23)) //步進減 1V
{
dec_key_temp = 1;
dac_dat = dac_dat - 10;
dac_temp = dac_dat;
dacreg = dac_temp;
disp_out(dac_temp);
}
else if (flag0 & ~inc_key_temp & (dac_dat<151)) // 步進加 1V
{
inc_key_temp = 1;
dac_dat = dac_dat + 10;
dac_temp = dac_dat;
dacreg = dac_temp;
disp_out(dac_temp);
}
else
{
disp_out(dac_temp);
}
}
}
//*************************中斷**************************
void int0(void) interrupt 0 using 1
{
flag0 = ~flag0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -