📄 lab3.c
字号:
/****************************************************************
* Hi-Tech workshop exercise Lab3 *
*****************************************************************
* *
* Files required: *
* *
* lab3.c *
* MID_LCD.c *
* cnfig877a.h (Set the Configuration Word) *
* *
* pic.h (Hi-Tech file) *
* *
*****************************************************************
* *
* Notes: *
* *
* Device Fosc -> 16.00MHz (Clock supplied by target) *
* *
*****************************************************************/
#include <pic.h> // processor if/def file
#include "cnfig877a.h"
#include "mid_lcd.h"
//**********************************
//* Function Prototype Declaration
//**********************************
void Init_IO(void);
void Init_Adc( void );
void A2D( unsigned char );
void LCD_ItoA(unsigned int);
unsigned char Set_BCD_ASCII(unsigned char);
// ================================================================
// **** Establish PIC16F877A Configuration Word
// **** == HS Oscillator Mode
// **** == Brown-Out Detect Enabled
// **** == Watch-Dog Timer Off
// **** == Code Protect Off
// **** == Low Voltage Programming Off
// **** == ICD2 Debug Mode On
__CONFIG ( HS_OSC & BODEN_ON & WDT_OFF & CP_OFF & LVP_OFF & DEBUG_ON );
// =================================================================
const char LCD_Msg1[]=" A/D Result: ";
const char LCD_Msg2[]=" MSB: LSB: ";
unsigned int AD_Temp;
bit DS_Zero_Flag;
union {
int AD_10bit;
struct {
char AD_LSB;
char AD_MSB;
}AD_Byte;
}AD_Int;
/*****************************
INITIALIZE I/O PORT
*****************************/
void Init_IO(void)
{
ADCON1=0b00000110; // Disable A/D Function
TRISD=0x00; // Set PortD for Output
PORTD=0x80; // Initila LED display = 0x80
TRISA4=1; // Set SW2 for input
TRISE1=1; // Set SW6 for Input
}
/*****************************************
Initialize A/D & Comparator Module
******************************************/
void Init_Adc( void )
{
CMCON=0b000000111; // Analog comparator disable
ADCON1=0b00001110; // AN0 is A/D input
ADFM=1; // Right justified
ADCON0=0b10000001; // Selext CH0 , A/D on
}
/***********************************
Convert A/D Channel
************************************/
void A2D( unsigned char channel )
{
unsigned char temp; // Temp storage
temp = channel << 3; // Shift channel value three bits left
ADCON0 &= 0b11000111; // Clear channel select bits in ADCON0
ADCON0 |= temp; // Logically OR shifted channel value into place in ADCON0
ADGO = 1; // Initiate conversion on selected channel
while (ADGO) ; // Poll ADGO bit until it clears, indicating conv. done
AD_Int.AD_Byte.AD_MSB=ADRESH;
AD_Int.AD_Byte.AD_LSB=ADRESL;
}
//***************************************
//* Program Main ( ) *
//***************************************
void main(void)
{
Init_IO();
Init_Adc();
OpenLCD();
LCD_Set_Cursor(0,0);
putrsLCD(LCD_Msg1);
LCD_Set_Cursor(0,1);
putrsLCD(LCD_Msg2);
while(1)
{
A2D(0x00); // Get 10-bit A/D result from CH0
LCD_Set_Cursor(12,0);
LCD_ItoA(AD_Int.AD_10bit);
LCD_Set_Cursor(6,1);
puthexLCD(AD_Int.AD_Byte.AD_MSB);
LCD_Set_Cursor(13,1);
puthexLCD(AD_Int.AD_Byte.AD_LSB);
}
}
void LCD_ItoA(unsigned int AD_Data)
{
AD_Temp=AD_Data;
DS_Zero_Flag=1;
putcLCD(Set_BCD_ASCII(AD_Data/1000)); // 陪ボ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -