📄 adc_wdt.c
字号:
#include <pic.h>
#define portbit(address,bits) ((unsigned)(&address)*8 + (bits))
#define BUSY 0x80
#define WRITE_DATA 0xff
#define delay_data 0xff
#define COMMAND 0x00
#define LCD_CLEAR 0x01
#define portdata PORTB
volatile bit E @ portbit(PORTD,7);
volatile bit RW @ portbit(PORTD,6);
volatile bit RS @ portbit(PORTD,5);
bank2 volatile unsigned int temperature[40];
volatile unsigned int checksum;
volatile unsigned char count;
volatile double squ;
volatile bit disp_reload;
void delay(unsigned int delay_time)
{
unsigned char i;
while (delay_time--)
{
for (i = 0; i <0xff; i ++)
{
}
}
}
void wdt_init(void) {
PSA = 1;
OPTION |= 0x07;
}
void clean_wdt(void)
{
CLRWDT();
}
unsigned char lcd_busy(void)
{
unsigned char temp;
portdata = 0xff;
RS = 0;
RW = 1;
E = 1;
TRISB = 0xff;
temp = portdata;
TRISB = 0x00;
E = 0;
return (temp);
}
void lcd_command_writedata(unsigned char check,unsigned char data)
{
if (check == COMMAND)
{
RS = 0;
}
else
{
RS = 1;
}
RW = 0;
portdata = data;
E = 1;
E = 0;
while (lcd_busy() & BUSY);
}
void lcd_disp(unsigned char adr,unsigned char disp_data)
{
lcd_command_writedata(COMMAND,adr);
lcd_command_writedata(WRITE_DATA,disp_data);
}
void lcd_init(void)
{
lcd_command_writedata(COMMAND,LCD_CLEAR);
lcd_command_writedata(COMMAND,0x38);
lcd_command_writedata(COMMAND,0x0e);
lcd_command_writedata(COMMAND,0x06);
}
void system_init(void)
{
INTCON = 0x00;
OPTION = 0xff;
TRISB = 0x00;
TRISD = 0x00;
}
void adc_init(void)
{
ADCON1 = 0x8e;
ADCON0 = 0xc1;
ADIF = 0;
PEIE = 1;
ADIE = 1;
TRISA0 = 1;
count = 0;
disp_reload = 0;
}
void tempature_disp(void)
{
unsigned char i;
unsigned long temperature_temp;
unsigned char a,b,c,d;
clean_wdt();
if (disp_reload)
{
di();
for (i = 0; i < 40; i ++)
{
checksum = checksum + temperature[i];
}
squ = (double)checksum;
squ = squ / 4;
temperature_temp = (unsigned long)((100 * squ) / 1023);
a = temperature_temp / 100;
lcd_disp(0x85, a + 0x30);
d = temperature_temp % 100;
b = d / 10;
lcd_disp(0x86, b + 0x30);
lcd_disp(0x87, 0x2e);
c = temperature_temp - a * 100 - b * 10;
lcd_disp(0x88, c + 0x30);
lcd_disp(0x89, 0xdf);
lcd_disp(0x8a, 0x43);
checksum = 0;
count = 0;
disp_reload = 0;
lcd_disp(0xcf, 0xfe);
clean_wdt();
delay(300);
clean_wdt();
ei();
}
}
void main(void)
{
system_init();
adc_init();
lcd_init();
wdt_init();
clean_wdt();
ADCON0 |= 0x04;
ei();
while (1)
{
tempature_disp();
SLEEP();
}
}
void interrupt adc_interrupt(void)
{
clean_wdt();
ADIF = 0;
temperature[count] = (ADRESH << 8) + ADRESL;
count ++;
if (count == 40)
{
disp_reload = 1;
}
ADCON0 |= 0X04;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -