#include \"1602.h\" //自己编写的头文件
宏定义:sbit OE = P1^0; sbit EOC = P1^1; sbit START = P1^2;
sbit CLK = P1^3; //ADC0809控制端口
sbit AD_A = P1^4; sbit AD_B = P1^5; sbit AD_C = P1^6;
sbit ALE = P1^2; //ADC0809通道选择
#define Data_OUT P3 //ADC0809数据输出 全局变量:long int dat; //AD数据输出量 long int result; //AD数据转换后的量 long int a[5]; //转换量存入数组
unsigned char *b = {\"01234567\//1602显示字符
函数接口:
1.adc转换函数接口:
void adc0809() {
AD_A = 0; AD_B = 0;
AD_C = 0; //选好通道0
START = 0; OE = 0; START = 1;
START = 0; //开始数模转化
while(EOC == 0); //等待转化结束 OE = 1; //数据输出使能 dat = Data_OUT;
DelayMs(10); //延时等待输出转换结果
OE = 0;
result = dat*196; //模拟转换为数字量,每位数字
约为Vref/255 = 0.0196,此处Vref为5V }
2.1602显示函数接口: void display(int a[])
{
int i;
a[0] = result/10000;
a[1] = result%10000/1000; a[2] = result%1000/100; a[3] = result%100/10;
a[4] = result%10; //将数字量存入数组a中
LCD_Init(); //LCD1602初始化 LCD_Write_String(0,0,\"volit:\"); LCD_Write_Char(12,0,'V'); LCD_Write_Char(7,0,'.'); LCD_Write_Char(6,0,b[a[0]]); for(i=0; i<4; i++) {
LCD_Write_Char(8+i,0,b[a[i+1]]); } }
//写入要显示的数据及提示信息
3.主函数: void main()
{
SCON=0x50;
TMOD=0x01; //定时器0工作于方式一 TH0=(65536-2)/256;
TL0=(65536-2)%256;//初始化T0的计数寄存器,2uss 溢出申请中断
//定时器中断,提供AD转换的时钟源
EA=1; //打开总中断 ET0=1; //打开定时器零中断
TR0=1; //暂不启动T0
while(1) {
adc0809();
DelayMs(150); //每150ms转换更新一次
display(a); //显示转换结果 }
}
4.中断函数:(为AD提供时钟信号) void t0(void) interrupt 1
{
TH0=0xff;
TL0=(65536-2)%256; //重装定时器中断值 CLK=~CLK; //电平反向得到时钟脉冲
}
//AD时钟频率范围 100khz~1024khz
文件2:1602.h //1602头文件 void DelayUs2x(unsigned char t); //延时~ T=2*t + 5us
void DelayMs(unsigned char t); //延时tMs bit LCD_Check_Busy(void);
//判断忙
void LCD_Write_Com(unsigned char com); //写命令 void LCD_Write_Data(unsigned char Data); //写数据 void LCD_Clear(void);
//清屏
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s); //在坐标(x,y)处写字符
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data);
//从坐标(x,y)处开始写字符串
//初始化
void LCD_Init(void);
文件3:1602.c 头文件及宏定义:
#include sbit RS = P2^0; //数据(1)命令(0)选择位 sbit RW = P2^1; //读(1)写(0)选择位 sbit EN = P2^2; //使能信号(高有效) #define DATA_IN P0 //数据接口 函数接口:
1.延时函数接口(两个)
void DelayUs2x(unsigned char t) {
while(--t);
} //延时约为2*t+5us
void DelayMs(unsigned char t) {
while(t--) {
DelayUs2x(245);
DelayUs2x(245);
} }
2.1602函数接口 判断忙函数:(函数返回值为 bit )
bit LCD_Check_Busy(void)
{
DATA_IN = 0XFF; RS = 0; RW = 1;
EN = 0; //读(1)命令(0) DelayUs2x(1); //等待加载数据 EN = 1; //拉高加载数据 return (bit)(DATA_IN & 0X80); }
写命令函数:
void LCD_Write_Com(unsigned char com)
{
while(LCD_Check_Busy()); //判断忙 RS = 0;
DATA_IN = com; RW = 0;
EN = 0; //写(0)命令(0) DelayUs2x(1); //等待加载数据 EN = 1; //拉高加载数据 }
写数据函数:
void LCD_Write_Data(unsigned char Data) {
while(LCD_Check_Busy()); //判断忙 RS = 1;
DATA_IN = Data; RW = 0;
EN = 0; //写(0)数据(1) DelayUs2x(1); //等待加载数据 EN = 1; //拉高加载数据 }
清屏函数:
void LCD_Clear(void)
{
LCD_Write_Com(0x01); DelayMs(5); //等待清屏完成 }
写字符串函数:
void LCD_Write_String(unsigned y,unsigned char *s) {
if (y == 0) {
LCD_Write_Com(0x80 + x); } else {
LCD_Write_Com(0xC0 + x); } while (*s) {
LCD_Write_Data( *s); s ++; } }
char x,unsigned
char 写字符函数:
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {
if (y == 0) {
LCD_Write_Com(0x80 + x); } else {
LCD_Write_Com(0xC0 + x); }
LCD_Write_Data( Data); }
初始化函数:
void LCD_Init(void) {
LCD_Write_Com(0x38); /*显示模式设置*/ LCD_Write_Com(0x08); /*显示关闭*/ LCD_Clear(); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/ LCD_Write_Com(0x0C); /*显示开及光标设置*/
}