本帖最后由 082576 于 2018-3-12 17:21 编辑
#include <reg52.h>
#include "intrins.h"
//#define 12000000L
//#define BAUD 9600
#define uchar unsigned char
#define uint unsigned int
sfr ADC_CONTR=0xBC; //ADC控制寄存器
sfr ADC_RES=0xBD; //ADC高8位结果存储
sfr ADC_RESL=0xBE; //ADC低2位
sfr P1ASF=0x9D; //P1口功能控制寄存器P1ASF
#define ADC_POWER 0x80 //ADC电源控制位,0:关闭,1:打开
#define ADC_FLAG 0x10 //ADC结束标志位
#define ADC_START 0x08 //ADC启动控制位
#define ADC_SPEEDLL 0x00 //ADC转换速度
#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H
#define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置
#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
#define FUN_MODE 0x30 //工作模式:8位基本指令集
#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白
#define DISPLAY_OFF 0x08 //显示关
#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1
#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH
#define SET_DD_AC 0x80
#define LCD_DATA P0
sbit gain=P2^0; /
sbit SW=P2^1; /
sbit rs = P2^7;
sbit rw = P2^6;
sbit LCD_EN = P2^5;
sbit PSB = P2^4;
/***************汉字地址表***************************
uchar code addr_tab[]={ //便于根据汉字坐标求出地址
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,};//第四行汉字位置*/
void InitADC(); //ADC初始化
uint GetADCResult(uchar ch);
void delay(uint ms);
void write_12864com(uchar com); //12864写指令
void write_12864dat(uchar dat); //12864写数据
void delay_ms(uint z);
/***************12864写指令*************/
void write_12864com(uchar com)
{
rs = 0;
rw = 0;
LCD_EN = 0;
P0 = com;
delay_ms(5);
LCD_EN = 1;
delay_ms(5);
LCD_EN = 0;
}
/***************12864写数据*************/
void write_12864dat(uchar dat)
{
rs = 1;
rw = 0;
LCD_EN=0;
P0 = dat;
delay_ms(5);
LCD_EN = 1;
delay_ms(5);
LCD_EN = 0;
}
void display()
{
uchar code table1[]="欢迎使用";
uchar code table2[]="当前阻";
}
/***************初始化LCD*************/
void Lcd_Init()
{
PSB=1;
write_12864com(0x30);//选择基本指令集
write_12864com(0x0e);
write_12864com(0x01);
write_12864com(0x80);
}
/****************ADC取值*********************/
uint GetADCResult(uchar ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //Must wait before inquiry
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); //Wait complete flag
ADC_CONTR &= ADC_FLAG; //Close ADC
return (ADC_RES*4 + ADC_RESL); //Return ADC result
}
/****************初始化ADC特殊功能寄存器*********************/
void InitADC( )
{
P1ASF = P1 | 0x3f; //Set P1.0 - P1.5 as analog input port
ADC_RES = 0; //Clear previous result
ADC_RESL = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;
delay(20); //ADC power-on delay and Start A/D conversion
}
void delay_ms(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
Lcd_Init();
while(1)
{
//hanzi_Disp(0,0,"显示");
}
}
|