📄 lcd_ad877.c
字号:
#include <pic.h>
#include <math.h>
#include <stdlib.h>
#include <delay.h>
//#define LCD_D4 PORTD, 0 ; LCD data bits
//#define LCD_D5 PORTD, 1
//#define LCD_D6 PORTD, 2
//#define LCD_D7 PORTD, 3
//#define LCD_D4_DIR TRISD, 0 ; LCD data bits
//#define LCD_D5_DIR TRISD, 1
//#define LCD_D6_DIR TRISD, 2
//#define LCD_D7_DIR TRISD, 3
//#define LCD_E PORTA, 1 ; LCD E clock
//#define LCD_RW PORTA, 2 ; LCD read/write line
//#define LCD_RS PORTA, 3 ; LCD register select line
//#define LCD_E_DIR TRISA, 1
//#define LCD_RW_DIR TRISA, 2
//#define LCD_RS_DIR TRISA, 3
//#define LCD_INS 0
//#define LCD_DATA 1
unsigned char Temp_wr;
unsigned char Temp_rd;
unsigned int delay;
unsigned char LCDMode;
unsigned char LCDMode_R;
unsigned char AD_Model ;
unsigned char AD_Times ;
unsigned char AD_VReultB ;
unsigned char AD_CReultB ;
unsigned int AD_Vols;
unsigned int AD_Curs;
div_t FrontD ;
div_t BackD ;
unsigned char Swapval;
unsigned char WrData ;
unsigned char i,k,j;
const char table[64]={' ',' ',' ',' ','W','E','L','C',
'O','M','E','!',' ',' ',' ',' ',
'H','N',' ','E','l','e','c','t',
'-','T','e','c','.','L','t','d',
' ','V','o','l','t','s',':',' ',
' ',' ',' ',' ',' ',' ',' ','V',
' ','C','u','r','r','t',':',' ',
' ',' ',' ',' ',' ',' ',' ','A'};
void DelayMs(unsigned char cnt) // Delay Subproguam
{
#if XTAL_FREQ <= 2MHZ
do {
DelayUs(996);
} while(--cnt);
#endif
#if XTAL_FREQ > 2MHZ
unsigned char i;
do {
i = 4;
do {
DelayUs(250);
} while(--i);
} while(--cnt);
#endif
}
void LCDRead()
{
RA1 =0 ; //LCD_E =0 ;
TRISD0=1;
TRISD1=1;
TRISD2=1;
TRISD3=1;
if (LCDMode_R==0)
RA3 =0 ; //LCD_RS=0;
else if (LCDMode_R==1)
RA3 =1 ; //LCD_RS=1;
RA2 =1 ; //LCD_RW =1 ;
#asm
NOP
NOP
#endasm
RA1 =1 ; //LCD_E =1 ;
#asm
NOP
NOP
NOP
NOP
#endasm
if (RD3==1)
Temp_rd = Temp_rd | 0x80 ;
else
Temp_rd = Temp_rd & 0x7F ;
if (RD2=1)
Temp_rd = Temp_rd | 0x40 ;
else
Temp_rd = Temp_rd & 0xBF ;
if (RD1==1)
Temp_rd = Temp_rd | 0x20 ;
else
Temp_rd = Temp_rd & 0xDF ;
if (RD0=1)
Temp_rd = Temp_rd | 0x10 ;
else
Temp_rd = Temp_rd & 0xEF ;
RA1 =0 ; //LCD_E =0 ;
#asm
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
#endasm
RA1 =1 ; //LCD_E =1 ;
#asm
NOP
NOP
#endasm
if (RD3==1)
Temp_rd = Temp_rd | 0x08 ;
else
Temp_rd = Temp_rd & 0xF7 ;
if (RD2=1)
Temp_rd = Temp_rd | 0x04 ;
else
Temp_rd = Temp_rd & 0xFB ;
if (RD1==1)
Temp_rd = Temp_rd | 0x02 ;
else
Temp_rd = Temp_rd & 0xFD ;
if (RD0=1)
Temp_rd = Temp_rd | 0x01 ;
else
Temp_rd = Temp_rd & 0xFE ;
RA1 =0 ; //LCD_E =0 ;
#asm
NOP
NOP
NOP
NOP
#endasm
}
void LCDBUSY()
{
while(1)
{
LCDMode_R = 0 ;
LCDRead();
if ((Temp_rd & 0x80)==0)
{
DelayMs(1);
break;
}
}
}
void LCDWriteNibble()
{
RA1 =0 ; //LCD_E =0 ;
if (LCDMode==0)
RA3 =0 ; //LCD_RS=0;
else if (LCDMode==1)
RA3 =1 ; //LCD_RS=1;
RA2 =0 ; //LCD_RW =0 ;
TRISD0=0;
TRISD1=0;
TRISD2=0;
TRISD3=0;
#asm
NOP
NOP
#endasm
RA1 =1 ; //LCD_E =1 ;
if ((Temp_wr & 0x80)==0x80)
RD3=1 ;
else
RD3=0 ;
if ((Temp_wr & 0x40)==0x40)
RD2=1 ;
else
RD2=0 ;
if ((Temp_wr & 0x20)==0x20)
RD1=1 ;
else
RD1=0 ;
if ((Temp_wr & 0x10)==0x10)
RD0=1 ;
else
RD0=0 ;
#asm
NOP
NOP
#endasm
RA1 =0 ; //LCD_E =0 ;
}
void LCDWrite()
{
LCDBUSY();
//DelayMs(6);
LCDWriteNibble();
#asm
banksel Temp_wr
swapf _Temp_wr , f
#endasm
LCDWriteNibble();
#asm
swapf _Temp_wr , f
#endasm
}
void DWrite()
{
LCDBUSY();
//DelayMs(6);
LCDMode =1 ;
LCDWrite();
}
void IWrite()
{
LCDBUSY();
//DelayMs(6);
LCDMode =0 ;
LCDWrite();
}
void LCDLine1() // B'100000000' Set DDRAM addresss 00H (the 1 line begin )
{
Temp_wr= 0X80;
IWrite();
}
void LCDLine_2() // B'110000000' Set DDRAM addresss 40H (the 2 line begin )
{
Temp_wr=0xC0;
IWrite();
}
void LCDInit()
{
/*LCD_E_DIR=0 ;
LCD_RW_DIR=0 ;
LCD_RS_DIR=0 ;*/
TRISA1 =0;
TRISA2 =0;
TRISA3 =0;
ADCON1=0x0E ; // B'00001110'
//delay15ms() ; // Delay 15ms @ 4M
DelayMs(15);
Temp_wr=0x30 ; // B'00110000'
LCDMode =0 ;
LCDWriteNibble();
//delay5ms() ; // Delay 5ms @ 4M
DelayMs(6);
Temp_wr=0x30 ; // B'00110000'
LCDMode =0 ;
LCDWriteNibble();
//delay100us() ; // Delay 100u @ 4M
DelayUs(100);
Temp_wr=0x30 ; // B'00110000'
LCDMode =0 ;
LCDWriteNibble();
//delay100us() ; // Delay 100u @ 4M
DelayUs(100);
Temp_wr=0x20 ; // B'00100000' Set LCD 4 Data bit
LCDMode =0 ;
LCDWriteNibble();
//LCDBUSY(); //????????????????????????????
Temp_wr=0x28 ; // B'00101000' Set LCD 5*7
IWrite();
Temp_wr=0x0D ; // B'00001101' Display = ON
IWrite();
Temp_wr=0x01 ; // B'00000001' Clear LCD
IWrite();
Temp_wr=0x06 ; // B'00000110'
IWrite();
Temp_wr=0x80 ; // B'100000000' Set DDRAM addresss 00H
IWrite();
//Temp_wr=0x02 ; // B'00000010'
//IWrite();
}
void StringL1_Display()
{
LCDLine1() ;
for(k=i;k<(16+i);k++)
{
Temp_wr = table[k];
DWrite();
}
}
void StringL2_Display()
{
LCDLine_2() ;
for(k=i;k<(16+i);k++)
{
Temp_wr = table[k];
DWrite();
}
}
void LCD_CLear()
{
Temp_wr=0x01 ; // B'00000001' Clear LCD
IWrite();
}
//--------------------------------------------------------------
unsigned char AscIITable(unsigned int num)
{
unsigned char Rultchar ;
switch(num){
case 0:
Rultchar = '0';
break ;
case 1:
Rultchar = '1';
break ;
case 2:
Rultchar = '2';
break ;
case 3:
Rultchar = '3';
break ;
case 4:
Rultchar = '4';
break ;
case 5:
Rultchar = '5';
break ;
case 6:
Rultchar = '6';
break ;
case 7:
Rultchar = '7';
break ;
case 8:
Rultchar = '8';
break ;
case 9:
Rultchar = '9';
break ;
}
return Rultchar;
}
void adinitial()
{ ADCON0=0x41 ; // Vol----A/D----Channl--0
ADCON1=0x0E ; // A/D Channl RA0 is 'A' ,Other is 'D'
AD_Model= 'v';
TRISA0=1;
}
void ad_RultDisp()
{
AD_Vols = AD_Vols * 2; // change the 2 ,is change range.
FrontD = div(AD_Vols,100);
BackD = div(FrontD.rem,10);
Temp_wr=0x8A ; // B'100001010' Set DDRAM addresss 0AH
IWrite();
/*
Temp_wr = AscIITable(FrontD.quot);
DWrite();
Temp_wr = '.';
DWrite();
Temp_wr = AscIITable(BackD.quot);
DWrite();
Temp_wr = AscIITable(BackD.rem);
DWrite();
*/
Temp_wr = FrontD.quot+0x30;
DWrite();
Temp_wr = '.';
DWrite();
Temp_wr = BackD.quot+0x30;
DWrite();
Temp_wr = BackD.rem +0x30;
DWrite();
}
void main()
{
LCDInit();
i=0;
StringL1_Display();
i=16;
StringL2_Display();
for (j=0;j<100;j++)
DelayMs(20);
adinitial();
i=32;
StringL1_Display();
i=48;
StringL2_Display();
AD_Times = 0 ;
AD_Vols = 0 ;
ADGO=1;
while(1)
{
if (ADGO==0)
{
AD_Times = AD_Times + 1 ;
AD_VReultB = ADRESH ; // AD_VReultB----存放适时的A/D采样结果。
AD_Vols = AD_Vols + AD_VReultB ;
if (AD_Times >= 16)
{
// AD_Vols = AD_Vols/AD_Times ;
AD_Vols = AD_Vols >> 4;
ad_RultDisp() ;
AD_Times = 0 ;
AD_Vols = 0 ;
}
ADGO=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -