📄 capacitor.c
字号:
//ICC-AVR application builder : 2006-8-9 10:11:51
// Target : M32
// Crystal: 16.000Mhz
//#include <avr_macros.h>
#include <ioavr.h>
#include <inavr.h>
#include <ina90.h>
//#include <iom32.h>
#include "def.h"
void btnpressed(void);
void calhigh(void);
void callow(void);
void calcomp(long int i);
void canoffset(void);
void calerr(void);
void dly(int i);
void measure(void);
void adjustzero(void);
void adjustgain(void);
void dispval(long int i);
void putformd(void);
void clrdisp (void);
void loadeep(void);
void saveeep(void);
void writeeep(int adress,int data);
int readeep(int adress);
void scankey(void);
void mn(void);
int AD_Receive( void );
long int a=0;
long int b=0;
int temp=0;
int keydown=0;
int form4[4]={14,5,15,15};
int form3[4]={14,4,15,15};
int form2[16]={10,1,0,13,
10,0,0,13,
14,3,15,15,
14,3,15,15};
int form1[48]={15,1,0,13,
0,1,0,13,
0,0,0,13,
1,0,0,12,
0,1,0,12,
0,0,0,12,
1,0,0,11,
0,1,0,11,
0,0,0,11,
14,2,15,15,
14,2,15,15,
14,2,15,15};
int seg7[16]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
// 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7
0xfe,0xf6,0x02,0x4e,0xc4,0xce,0x9e,0x00};
// 8 , 9 , - ,u , n , p , E ,
int dispptr=0; //存储在第几个数码管上显示
int code=0;
long int mm1=0;
int pdispbuf[4]; //存储在这四个数码管上将要显示数值的显示代码在seg7里面的偏移
int dispbuf[5]; //存储在这四个数码管上将要显示数值的显示代码
int keyscan[2][2]; //存储有关于按键是否按下的数值
unsigned long int comp1=0; //存储低量程校准的增益
unsigned long int comp2=0; //存储高量程校准的增益
int comp3=0; //存储0偏值
int strbuf[10]; //存储测量数值转化成10进制后的每一位,从低位到高位存储
int stm1=0; //系统定时器1
int stm2=0; //系统定时器2
int flags=0; //标志,第0位是负数标志位,第一位是捕捉完成标志位
//第二位和第三位是测量时间超时标志位,第七位是按键按下标志位
//第六位和第五位表明已经高量程和低量程校准
int jianche; //本变量仅仅在进行校准的时候区分高量程校准(1)和低量程校准(0)
float result=0.0;
unsigned long resulta=0; //0.17Vcc时的result
unsigned long resultb=0; //0.5Vcc时的result
long int nbit=0; //result的位数
long int count1=0; //充电时间间隔的T/C1的溢出次数
long int count2=0; //充电时间间隔的TCNT1H:TCNT1L
long int maxtc1ovf=0; //T/C1溢出次数的上限,高于他就测试失败
long int ntc1ovf=0; //T/C1的溢出次数
long int count1a=0; //记录充电开始时的tc1计数值
long int count2a=0; //记录充电开始时的tc1溢出次数
long int count1b=0; //记录充电结束时的tc1计数值
long int count2b=0; //记录充电结束时的tc1溢出次数
unsigned long int comp1l=0; //comp1存储到EEPROM时分的高位和低位
unsigned long int comp1h=0;
unsigned long int comp2l=0;
unsigned long int comp2h=0;
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
// ADMUX = 0x61; //select adc input 0
ADMUX = 0xE1; //select adc input 0
ADCSRA = 0x87;
}
//写lcd的cs1命令寄存器函数
void lcd_wr1_ins (unsigned char lcd_wr_buffer)
{
unsigned char lcd_wr_temp;
e_off; //读lcd状态
rw_on;
di_off;
cs1_on;
DDRA&=0x07;
PORTA&=0x07;
DDRD&=0xe3;
PORTD&=0xe3;
e_on;
asm("nop");
asm("nop");
asm("nop");
lcd_wr_temp=(PINA&0xf8);
lcd_wr_temp|=((PIND&0x1c)>>2);
e_off;
cs1_off;
while(lcd_wr_temp&0x90)
{
e_off; //读lcd状态
rw_on;
di_off;
cs1_on;
DDRA&=0x07;
PORTA&=0x07;
DDRD&=0xe3;
PORTD&=0xe3;
e_on;
asm("nop");
asm("nop");
asm("nop");
lcd_wr_temp=(PINA&0xf8);
lcd_wr_temp|=((PIND&0x1c)>>2);
e_off;
cs1_off;
}
e_off; //写lcd命令
rw_off;
di_off;
cs1_on;
PORTA&=0x07;
PORTA|=(lcd_wr_buffer&0xf8);
PORTD&=0xe3;
PORTD|=((lcd_wr_buffer<<2)&0x1c);
DDRA|=0xf8;
DDRD|=0x1c;
e_on;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
e_off;
cs1_off;
asm("nop");
asm("nop");
DDRA&=0x07;
DDRD&=0xe3;
}
//向lcd_cs1写数据函数
void lcd_wr1_data (unsigned char lcd_wr_buffer)
{
unsigned char lcd_wr_temp;
e_off; //读lcd状态
rw_on;
di_off;
cs1_on;
DDRA&=0x07;
PORTA&=0x07;
DDRD&=0xe3;
PORTD&=0xe3;
e_on;
asm("nop");
asm("nop");
asm("nop");
lcd_wr_temp=(PINA&0xf8);
lcd_wr_temp|=((PIND&0x1c)>>2);
e_off;
cs1_off;
while(lcd_wr_temp&0x90)
{
e_off; //读lcd状态
rw_on;
di_off;
cs1_on;
DDRA&=0x07;
PORTA&=0x07;
DDRD&=0xe3;
PORTD&=0xe3;
e_on;
asm("nop");
asm("nop");
asm("nop");
lcd_wr_temp=(PINA&0xf8);
lcd_wr_temp|=((PIND&0x1c)>>2);
e_off;
cs1_off;
}
e_off; //写lcd数据
rw_off;
di_on;
cs1_on;
PORTA&=0x07;
PORTA|=(lcd_wr_buffer&0xf8);
PORTD&=0xe3;
PORTD|=((lcd_wr_buffer<<2)&0x1c);
DDRA|=0xf8;
DDRD|=0x1c;
e_on;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
e_off;
cs1_off;
asm("nop");
asm("nop");
DDRA&=0x07;
DDRD&=0xe3;
}
//写lcd的cs2命令寄存器函数
void lcd_wr2_ins (unsigned char lcd_wr_buffer)
{
unsigned char lcd_wr_temp;
e_off; //读lcd状态
rw_on;
di_off;
cs2_on;
DDRA&=0x07;
PORTA&=0x07;
DDRD&=0xe3;
PORTD&=0xe3;
e_on;
asm("nop");
asm("nop");
asm("nop");
lcd_wr_temp=(PINA&0xf8);
lcd_wr_temp|=((PIND&0x1c)>>2);
e_off;
cs2_off;
while(lcd_wr_temp&0x90)
{
e_off; //读lcd状态
rw_on;
di_off;
cs2_on;
DDRA&=0x07;
PORTA&=0x07;
DDRD&=0xe3;
PORTD&=0xe3;
e_on;
asm("nop");
asm("nop");
asm("nop");
lcd_wr_temp=(PINA&0xf8);
lcd_wr_temp|=((PIND&0x1c)>>2);
e_off;
cs2_off;
}
e_off; //写lcd命令
rw_off;
di_off;
cs2_on;
PORTA&=0x07;
PORTA|=(lcd_wr_buffer&0xf8);
PORTD&=0xe3;
PORTD|=((lcd_wr_buffer<<2)&0x1c);
DDRA|=0xf8;
DDRD|=0x1c;
e_on;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
e_off;
cs2_off;
asm("nop");
asm("nop");
DDRA&=0x07;
DDRD&=0xe3;
}
//向lcd_cs2写数据函数
void lcd_wr2_data (unsigned char lcd_wr_buffer)
{
unsigned char lcd_wr_temp;
e_off; //读lcd状态
rw_on;
di_off;
cs2_on;
DDRA&=0x07;
PORTA&=0x07;
DDRD&=0xe3;
PORTD&=0xe3;
e_on;
asm("nop");
asm("nop");
asm("nop");
lcd_wr_temp=(PINA&0xf8);
lcd_wr_temp|=((PIND&0x1c)>>2);
e_off;
cs2_off;
while(lcd_wr_temp&0x90)
{
e_off; //读lcd状态
rw_on;
di_off;
cs2_on;
DDRA&=0x07;
PORTA&=0x07;
DDRD&=0xe3;
PORTD&=0xe3;
e_on;
asm("nop");
asm("nop");
asm("nop");
lcd_wr_temp=(PINA&0xf8);
lcd_wr_temp|=((PIND&0x1c)>>2);
e_off;
cs2_off;
}
e_off; //写lcd数据
rw_off;
di_on;
cs2_on;
PORTA&=0x07;
PORTA|=(lcd_wr_buffer&0xf8);
PORTD&=0xe3;
PORTD|=((lcd_wr_buffer<<2)&0x1c);
DDRA|=0xf8;
DDRD|=0x1c;
e_on;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
e_off;
cs2_off;
asm("nop");
asm("nop");
DDRA&=0x07;
DDRD&=0xe3;
}
//LCD显示刷屏函数,起始地址放在lcd_display2_buffer[0][0]中
//使用的全局变量:*lcd_display_rdp;
void lcd_display2(void)
{
const unsigned char *asc_rdp;
unsigned char lcd_row_counter;
unsigned char lcd_column_counter;
unsigned char lcd_asc;
unsigned char lcd_asc_column;
unsigned char lcd_buffer1;
unsigned char lcd_invter;
lcd_wr1_ins(0xc0); //显示起始行为0
lcd_wr2_ins(0xc0); //显示起始行为0
*lcd_display_rdp=lcd_display2_buffer[0][0];
for (lcd_row_counter=0;lcd_row_counter<=7;lcd_row_counter++) //显示的0~7行循环计数
{
lcd_wr1_ins(lcd_row_counter+0xb8); //设置x页地址
lcd_wr2_ins(lcd_row_counter+0xb8); //设置x页地址
lcd_wr1_ins(0x40); //y地址清零
lcd_wr2_ins(0x40); //y地址清零
for (lcd_column_counter=0;lcd_column_counter<=9;lcd_column_counter++) //显示的0~20列循环计数(cs1为0~9列)
{
lcd_asc=*lcd_display_rdp; //要显示的字符ASC码放在lcd_asc中
lcd_display_rdp++;
if (lcd_asc&BIT(7))
{
lcd_invter|=BIT(0);
lcd_asc&=(~BIT(7));
}
else
{
lcd_invter&=(~BIT(0));
}
if ((lcd_asc<0x20)||(lcd_asc>=0x80))
{
lcd_asc=0x20;
}
lcd_asc=lcd_asc-0x20;
for (lcd_asc_column=0;lcd_asc_column<=0x04;lcd_asc_column++) //显示的5列的循环
{
asc_rdp=&asc[lcd_asc][lcd_asc_column]; //取出当前字符的每列内容
lcd_buffer1=*asc_rdp; //要写入lcd的数据放入lcd_buffer1中
if(lcd_invter&BIT(0))
{
lcd_buffer1=~lcd_buffer1;
}
lcd_wr1_data(lcd_buffer1);
}
if(lcd_invter&BIT(0))
{
lcd_wr1_data(0xff);
}
else
{
lcd_wr1_data(0x00);
}
}
lcd_asc=*lcd_display_rdp; //要显示的字符ASC码放在lcd_asc中
lcd_display_rdp++;
if (lcd_asc&BIT(7))
{
lcd_invter|=BIT(0);
lcd_asc&=(~BIT(7));
}
else
{
lcd_invter&=(~BIT(0));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -