#include<reg51.h>
#include<stdio.h>
#include<math.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ADC0832CH0 channel;
//*********定义变量区*******************
sbit clk_adc0832=P3^6; //定义各个控制引脚
sbit cs_adc0832=P2^0;
sbit di_adc0832=P3^7;
sbit do_adc0832=P3^7;
sbit LED0_CS=P1^0;
sbit LED1_CS=P1^1;
sbit LED2_CS=P1^2;
sbit LED3_CS=P1^3;
sbit adarm=P2^2;
uchar code table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};//0,1,2,3,4,5,6,7,8,9,off //共阳极笔端码
uchar ch; //采样返回数据
//*********函数声明区********************
void tkey(void); //键盘函数
unsigned runADC0832(bit); //A/D转换
void Delayms(uint x); //延时显示函数
void Update_LED(); //LED显示函数
void LED_analyze();
//**********主函数开始**********
void main()
{
P0=0XFF;
P1=0XFF;
P2=0XFF;
P3=0XFF;
Uart_Init();
TH0=0x3C;
TL0=0xAF;
ET0=1; //开外部中断0
EA=1; //全局中断打开
TR0=1;
nCounter=0;
Change_Flag=0;
while(1)
{
void tkey(void);
runADC0832();
if(Change_Flag==1)
{ Update_LED();
if(ch>9999)
ch=0;
printf("counter refreshed %d \n",ch);
}
delay();
/********矩键查寻键值4*4程序******/按键为P1.0---P1.7
void Tkey(void)
{
uchar readkey;//rereadkey;
uchar x_temp,y_temp;
P1=0x0f;
x_temp=P1&0x0f;
if(x_temp==0x0f) goto keyout;
P1=0xf0;
y_temp=P1&0xf0;
readkey=x_temp|y_temp;
readkey=~readkey;
switch(readkey)
{
case 0x11:key=0; break;
case 0x21:key=1; break;
case 0x41:key=2; break;
case 0x81:key=3; break;
case 0x12:key=4; break;
case 0x22:key=5; break;
case 0x42:key=6; break;
case 0x82:key=7; break;
case 0x14:key=8; break;
case 0x24:key=9; break;
case 0x44:key=10;break;
case 0x84:key=11;break;
case 0x18:key=12;break;
case 0x28:key=13;break;
case 0x48:key=14;break;
case 0x88:key=15;break;
default: key=16;break;
}
keyout:_nop_();
}//**********A/D转换子程序开始***************
unsigned runADC0832(void) //读ADC0832函数
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉高CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
void control(uchar d) //数据个、十、百、千取数函数
ch=ch%10000;
AD_bcd[0] =ch/1000;
AD_bcd[1]=(ch/100)%10;
AD_bcd[2] =(ch%100)/10;
AD_bcd[3]=(ch%100)%10;
update_disbuf();
}
void update_disbuf(void) //对应显示的数据函数
{ P0=dis_code[AD_bcd[0]];
LED_0=0;
Delayms(10);
LED_0=1;
P0=dis_code[AD_bcd[1]];
LED_1=0;
Delayms(10);
LED_1=1;
P0=dis_code[AD_bcd[2]];
LED_2=0;
Delayms(10);
LED_2=1;
P0=dis_code[AD_bcd[3]];
LED_3=0;
Delayms(10);
LED_3=1;
}
|