📄 dong0.c
字号:
#include<pic.h> //包含单片机内部资源预定义
//__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
const char dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83};
//定义常数0-9的数据表格
unsigned int ADResult[2],Result;
unsigned char dis_index, dis_buf[5];//缓冲数列
unsigned char channel,qian,bai,shi,ge,yw,temp,adys,ad_cnt,ad_time,disp_time;
static bit adflag,adflag1,bUpdateDisplay ;
#define PORTBIT(adr,bit) ((unsigned)(&adr)*8+(bit))
static bit PORTB_2@PORTBIT(PORTB,2);
// void ADReadFunc(uchar channel);
void DELAY(); //delay函数申明
void init(); //I/O口初始化函数申明
void display(void); //显示函数申明
union ADData { unsigned int ADTemp; unsigned char ADBuffer[2]; }ADunion;
unsigned int itime=0,flag=2; /*定时器1中断计数*/
//----------------------------------------------
//延时程序
void delay_us(unsigned int time)
{
do{
time--;
}while (time > 1);
}
void delay_ms(unsigned int time)
{
while(time != 0)
{
delay_us(1000);
time--;
}
}
//------------------------------------------------
//读AD值
void ADReadFunc(unsigned char channel)
{
ADCON0=(channel<<3)|0x41; //fosc/8
delay_us(2);
ADGO=1;
while(ADGO);
ADunion.ADBuffer[0]=ADRESL;
ADunion.ADBuffer[1]=ADRESH;
ADResult[channel]=ADunion.ADTemp=ADRESH*256+ADRESL;
ADResult[channel]=ADResult[channel]+ADunion.ADTemp;
if(++ad_cnt==5) {ad_cnt=0; ADResult[channel]=ADResult[channel]/5;} //求5次结果的平均值
}
//-----------------------------------------------
void init_timer1()
{
TMR1IF=0;
TMR1H=0xFC; //
TMR1L=0x17; // //定时器赋初值(1ms/一周期1us)
T1CON=0x00; //开启定时器1,定时模式1分频
TMR1IE=1; //开启定时器1中断
PEIE=1;
TMR1ON=1;
GIE=1;
}
//-----------------------------------------------
//中断函数 //修改为1MS
void interrupt timer1(void)
{
TMR1ON=0;
TMR1IF = 0; //清除TMR1 中断标志
if(++ad_time==2) {adflag=1;ad_time=0;} //2ms
if(++disp_time==3) {bUpdateDisplay=1;disp_time=0;} //3ms
TMR1H=0xFC;
TMR1L=0x17;
TMR1ON=1;
}
void display(void)
{
if(++dis_index==5) dis_index=0;
PORTB=0xFF; //关显示
PORTD = dis_buf[dis_index];
switch(dis_index)
{
case 0:
PORTB=0xFE;
break;
case 1:
PORTB=0xFD;
break;
case 2:
PORTB=0xFB;
break;
case 3:
PORTB=0xF7;
break;
case 4:
if(++itime<=200) {temp=ADResult[0];dis_buf[3]=dis_code[10];}
else
{
if(++itime<=400) {temp=ADResult[1];dis_buf[3]=dis_code[11];}
else itime=0;
}
bai=temp/0x64; //求显示的百位
shi=(temp%0x64)/0xa; //求显示的十位
ge=(temp%0x64)%0xa; //求显示的个位
dis_buf[0] = dis_code[ge]; // 个位
dis_buf[1] = dis_code[shi]; //十位
dis_buf[2] = dis_code[bai]; // 百位
dis_buf[3] = dis_code[11];
dis_buf[4] = 0xff;
}
}
//-----------------------------------------------
//初始化函数
void init()
{
PORTA=0XFF;
PORTB=0XFF;
PORTD=0XFF; //熄灭所有显示
TRISA=0X03; //设置RA0-4为输入,其他为输出
TRISB=0XF0;
TRISD=0X00; //设置D口全为输出
ADCON1=0X89; //转换结果右移,及ADRESH寄存器的高6位为"0"
ADResult[0]=0;
ADResult[1]=0;
}
//------------------------------------------------
//主程序开始
void main()
{
init_timer1();
init();
dis_index = 0;
yw=0;
adys=0;
while(1) //死循环
{
if(adflag)
{
adflag=0;
ADReadFunc(0); //ra0 ad转换 每隔2ms转换
ADReadFunc(1); //ra1 ad转换
}
if(bUpdateDisplay) //3ms
{
bUpdateDisplay=0;
display();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -