本帖最后由 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,"顯示");
}
}
|