// 数字电压表头程序,满程2.5V
#include <iom8V.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define SET_E PORTC|=0x04 // LCD: E = 1
#define CLR_E PORTC&=~0x04 // LCD: E = 0
#define CLR_RW PORTC&=~0x02 // LCD: R/W = 0
#define SET_RS PORTC|=0x01 // LCD: R/S = 1
#define CLR_RS PORTC&=~0x01 // LCD: R/S = 0
#define LCD_Data PORTB // 数据端口PB口
uchar Table[]="0123456789";//显示字符表
uchar Data[]={0,0,0,0}; //显示初始值
//延时函数
void DelayMs(uint i) //Ms级延时,参数i为延时时间
{uint j;
for(;i!=0;i--)
{for(j=1142;j!=0;j--) ;}
}
//LCD写数据函数
void WriteData(uchar D)
{
SET_RS;
LCD_Data=D;
CLR_RW;
CLR_E;
DelayMs(2);
SET_E;
}
//LCD写指令函数
void WriteCommand(uchar C)
{
CLR_RS;
LCD_Data=C;
CLR_RW;
CLR_E;
DelayMs(2);
SET_E;
}
//显示函数,x表示待显示字符的列,y表示行
void Display(uchar x, uchar y, uchar *p)
{uchar i,j;
for(i=x;i<x+4;i++)
{
if (y==0)
{
j=0x80+i; //当要显示第一行时地址码+0x80;
WriteCommand(j); //发送地址码
j=i-x;
WriteData(Table[p[j]]); //查表、显示字符
}
else
{
j=0xc0+i; //当要显示第二行时地址码+0xc0;
WriteCommand(j); //发送地址码
j=i-x;
WriteData(Table[p[j]]); //显示字符
}
}
}
//计数值处理函数,将计数值拆分为BCD码,用于查表显示
void Process(uint i,uchar *p)
{p[0]=i/1000;
i=i%1000;
p[1]=i/100;
i=i%100;
p[2]=i/10;
i=i%10;
p[3]=i;
}
//ADC转换函数
uint ADC_Convert(void)
{uint temp1,temp2;
temp1=ADCL;
temp2=ADCH;
temp2=(temp2<<8)+temp1;
return temp2;
}
//初始化函数
void Init(void)
{
DDRB=0xff; //设置B口为推挽1输出;
PORTB=0xff;
DDRC=0x07; //设置PC0-2为推挽1输出,PC3-7为无上拉电阻输入
PORTC=0x07;
ADMUX=0xc3; //使用内部2.56V电压源,选择通道ADC3
ADCSRA=0xe6; //125K转换速率,自由转换模式,启动AD转换器
LCD_Data=0;
WriteCommand(0x38);
//DelayMs(5);
WriteCommand(0x38); //显示模式设置
WriteCommand(0x08); //关闭显示
WriteCommand(0x01); //显示清屏
WriteCommand(0x06); // 显示光标移动设置
WriteCommand(0x0c); // 显示开及光标设置
}
//主函数
void main(void)
{uint i;
DelayMs(500);
Init(); //初始化I/O口
DelayMs(500); //延时待系统稳定;
while(1)
{
i=ADC_Convert(); //ADC转换
i=i*5/2; //数据处理
Process(i,Data); //将计数值转换为BCD码
Display(0,0,Data); //显示数据
}
}
评论0