📄 max1972.c
字号:
//MAX197
//注意:我用的是外部电源供电,用内部电源失败。。。
//REF接的电压不是基准电压,要乘以一个参数才可以用,REFADJ要接高电平
#include <reg51.h>
#include<absacc.h>
#include <intrins.h>
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();};
#define uchar unsigned char
#define uint unsigned int
sbit ADINT=P2^3;
sbit CS=P2^4;
sbit MAX197_WR=P2^5;
sbit MAX197_RD=P3^6;
sbit HBEN=P2^7;
/*************************LCD************************/
#define LINE1 0
#define LINE2 1
#define LINE1_HEAD 0x80
#define LINE2_HEAD 0xC0
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLEARSCREEN LCD_en_command(0x01)
//common part
#define HIGH 1
#define LOW 0
#define TRUE 1
#define FALSE 0
#define ZERO 0
#define MSB 0x80
#define LSB 0x01
#define LCDIO P3
sbit LCD1602_RS=P2^0;
sbit LCD1602_RW=P2^1;
sbit LCD1602_EN=P2^2;
unsigned char code tab[]={'0','1','2','3','4','5','6','7','8','9'};
/***************************************************************/
/******************** LCD PART *************************************/
void LCD_delay(void)
{
unsigned char i;
for(i=LCD_DELAY_TIME;i>ZERO;i--)//be sure lcd reset
;
}
/********************************************************************/
void LCD_en_command(unsigned char command)
{
LCDIO=command;
LCD1602_RS=LOW;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_en_dat(unsigned char dat)
{
LCDIO=dat;
LCD1602_RS=HIGH;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == LINE1)
address = LINE1_HEAD + x;
else
address = LINE2_HEAD + x;
LCD_en_command(address);
}
/********************************************************************/
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)
{
LCD_set_xy( x, y );
LCD_en_dat(dat);
}
/********************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y ); //set address
while (*s) // write character
{
LCDIO=*s;
LCD_en_dat(*s);
s ++;
}
}
/********************************************************************/
void LCD_init(void)
{
CLEARSCREEN;//clear screen
LCD_en_command(DATA_MODE);//set 8 bit data transmission mode
LCD_en_command(OPEN_SCREEN);//open display (enable lcd display)
LCD_en_command(DISPLAY_ADDRESS);//set lcd first display address
CLEARSCREEN;//clear screen
}
/********************************************************************/
/*********************** OTHER PART *********************************/
void delay_nms(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<1140;j++);
}
/********************************************************************/
uint max197(uchar COMMAND) //使用内部基准
{
uint CH0Data;
uchar CH0DataL,CH0DataH;
MAX197_RD=1 ;
CS=0;
MAX197_WR=0;
P1=COMMAND;
_nop_();
MAX197_WR=1;
while(ADINT) ;
MAX197_RD=0;
HBEN=0;
_nop_();
CH0DataL=P1;
HBEN=1;
_nop_();
CH0DataH=P1;
MAX197_RD=1;
CS=1;
CH0Data=(uint)(CH0DataH)*256+(uint)(CH0DataL);
return(CH0Data);
}
/***************************************************************/
uchar *change(uint dd)
{
uint c;
uchar ddd[3];
c=dd/4.096*0.61 ;
ddd[0]=tab[c/100] ;
ddd[1]=tab[c%100/10];
ddd[2]=tab[c%10] ;
return(ddd) ;
}
/***************************************************************/
void main()
{ uint chan;
uchar *zhi;
LCD_init();
CLEARSCREEN;
delay_nms(2);
LCD_write_string(1,LINE1,"Work");
while(1)
{
chan=max197(0x40);
zhi=change(chan);
LCD_write_string(1,LINE1,"Working...");
LCD_write_char(0,LINE2,*zhi);
LCD_write_string(1,LINE2,".");
LCD_write_char(2,LINE2,*(zhi+1));
LCD_write_char(3,LINE2,*(zhi+2));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -