757| 1
|
STC12C5A60S2 (10位模式)1602显示 源程序3个文件 |
[/free][paragraph]
STC12C5A60S2(ADC查询法 10位模式)+1602显示 源程序:一共3个文件: LCD1602display.h #ifndef _LCD1602DISPLAY_H_ #define _LCD1602DISPLAY_H_ #define uchar unsigned char #define uint unsigned int //************************LCD引脚定义 sbit LCM_RS=P3^5; sbit LCM_RW=P3^6; sbit LCM_E=P3^7; //**************************延时 void delay(); //**************************初始化 void InitLCM(); //****************************读状态 uchar ReadStatusLCM(); //******************************读数据 uchar ResdDataLCM(); //***************************写指令 void WriteCommandLCM(uchar WCLCM, Busy); //***************************写数据 void WriteDataLCM(uchar WDLCM); //******************************显示1个字符 void DisplayOneChar(uchar X,uchar Y,uchar DData); //******************************显示字符串 void DisplayListChar(uchar X,uchar Y,uchar code *DData); #endif STC12(ADC flag).h #ifndef _STC12_ADC_FLAG_H_ #define _STC12_ADC_FLAG_H_ #define uchar unsigned char #define uint unsigned int #define FOSC 11059200L #define BAUD 9600 /******************************************************************** 初始化设置 *********************************************************************/ sfr ADC_CONTR = 0xBC; //ADC 控制寄存器 sfr ADC_RES = 0xBD; //ADC 转换结果寄存器 sfr ADC_RESL = 0xBE; //ADC 低2位结果寄存器 sfr P1ASF = 0x9D; //P1口模拟功能控制寄存器 /******************************************************************** ADC 数据转换函数 *********************************************************************/ #define ADC_POWER 0x80 //ADC 电源控制位 #define ADC_FLAG 0x10 //ADC 转换结束标志位 #define ADC_START 0x08 //ADC 开始转换控制位 #define ADC_SPEEDLL 0x00 //540 个时钟周期转换一次 #define ADC_SPEEDL 0x20 //360 个时钟周期转换一次 #define ADC_SPEEDH 0x40 //180 个时钟周期转换一次 #define ADC_SPEEDHH 0x60 //90 个时钟周期转换一次 //**********************************延时函数 void Delay1(uint n); //******************************ADC初始化函数 void Init_ADC(); //***********************************ADC数据转换函数 uint Get_ADC_Result(uchar ch); //************************************ADC数据计算函数 float Count(uchar ch); #endif LCD1602display.c #include #include #include "LCD1602display.h" //********************延时 void delay(uchar z) { uchar i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } //**********************LCM初始化 void InitLCM() { WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 delay(1); WriteCommandLCM(0x38,0); delay(1); WriteCommandLCM(0x38,0); delay(1); WriteCommandLCM(0x38,1); //显示模式设置:16×2显示,5×7点阵,8位数据接口 WriteCommandLCM(0x0c,1); //显示模式设置:显示开,无光标 WriteCommandLCM(0x06,1); //显示模式设置:光标右移,字符不移 WriteCommandLCM(0x01,1); //清屏幕指令,将以前的显示内容清除 } //*********************读状态 uchar ReadStatusLCM() { P0 = 0x80; LCM_RS = 0; LCM_RW = 1; LCM_E = 1; while (P0 & 0x80); //检测忙信号 return(0); } //***********************读数据 /*uchar ResdDataLCM() { LCM_RS=1; LCM_RW=1; LCM_E=1; } */ //**********************写指令 void WriteCommandLCM(uchar WCLCM, Busy) { if(Busy) ReadStatusLCM(); P0=WCLCM; LCM_RS=0; LCM_RW=0; LCM_E=0; LCM_E=1; } //***********************写数据 void WriteDataLCM(uchar WDLCM) { ReadStatusLCM(); P0=WDLCM; LCM_RS=1; LCM_RW=0; LCM_E=0; LCM_E=1; } //*************************显示字符 void DisplayOneChar(uchar X,uchar Y,uchar DData) { if(Y) X|=0X40; //Y=1显示第二行,Y=0显示第一行 X|=0X80; WriteCommandLCM(X,1); //X用来选择哪一位,1是用来忙检测 WriteDataLCM(DData); //DData用来写数据 } //**************************显示字符串 void DisplayListChar(uchar X,uchar Y,uchar code *DData) { uchar ListLength; ListLength=0; while(DData[ListLength]!='\0') { if(X<=15) { DisplayOneChar( X,Y,DData[ListLength]); ListLength++; X++; } } } STC12(ADC flag).c #include #include "intrins.h" #include "STC12(ADC flag).h" float temp; //**********************************延时函数(n=1: 1T 8.65ms,12T 59.9ms) void Delay1(uint n) { uint x; while (n--) { x = 5000; while (x--); } } //******************************ADC初始化函数 void Init_ADC() { P1ASF = 0xff; //设置P1口为开漏模式,使用AD功能 ADC_RES = 0; //AD数据寄存器高8位清空 ADC_RESL= 0; //AD数据寄存器低2位清空 ADC_CONTR = ADC_POWER | ADC_SPEEDLL; //打开AD电源,转换周期540 Delay1(2); //延时 } //***********************************ADC数据转换函数 uint Get_ADC_Result(uchar ch) { ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch ;//开始转换 _nop_(); //延时一个机器周期 _nop_(); //延时一个机器周期 _nop_(); //延时一个机器周期 _nop_(); //延时一个机器周期 while (!(ADC_CONTR & ADC_FLAG)); //等待转换结束(ADC_FLAG=0时一直等待,直到变为1跳出) ADC_CONTR &= ~ADC_FLAG; //关闭AD转换 return (ADC_RES*4+ADC_RESL); //返回数据(10位AD值,ADC_RES高8位+ADC_RESL低2位) } //************************************ADC数据计算函数 float Count(uchar ch) { temp=(float)Get_ADC_Result(ch)*4.60/1024; //4.85为参考电压,1024个“门”,10位AD return temp; } main.c //***********************(ma)STC12C5A60S2(ADC查询法 10位模式)+1602显示************************************************************* //马熔 //2012-12-17 //*************************************************************************************************** #include #include "intrins.h" #include "STC12(ADC flag).h" #include "LCD1602display.h" #define uchar unsigned char #define uint unsigned int extern float temp; uchar code string1[]={"The voltage is :"}; uchar ge,shifen; //*****************************显示函数 void show() { DisplayListChar(0,0,string1); DisplayOneChar(1,1,(int)Count(0)+0x30); //个位 DisplayOneChar(2,1,'.'); DisplayOneChar(3,1,(int)(Count(0)*100)0/10+0x30); //十分位 DisplayOneChar(4,1,(int)(Count(0)*100)0+0x30); //百分位 DisplayOneChar(5,1,'V'); DisplayOneChar(8,1,(int)Count(1)+0x30); //个位 DisplayOneChar(9,1,'.'); DisplayOneChar(10,1,(int)(Count(1)*100)0/10+0x30); //十分位 DisplayOneChar(11,1,(int)(Count(1)*100)0+0x30); //百分位 DisplayOneChar(12,1,'V'); } //*******************************主函数 void main() { InitLCM(); //液晶初始化 Init_ADC(); //AD转换初始化 while (1) { show(); } } 来源网络仅供个人学习 [free]
购买主题
本主题需向作者支付 9 枚金币 才能浏览
《《《 点击这里展开全文 》》》 | |
| |