文档库 最新最全的文档下载
当前位置:文档库 › TLC1549基于mega16的AD转换、12864显示

TLC1549基于mega16的AD转换、12864显示

/************************************
iccavr程序,12864显示TLC1549结合mega16单片机应用。
************************************/

#include
#include
#define uchar unsigned char
#define uint unsigned int

#define cs_h PORTD|=BIT(0)
#define cs_l PORTD&=~BIT(0)
#define cs_o DDRD|=BIT(0)
#define cs_i DDRD&=~BIT(0)

#define clk_h PORTD|=BIT(1)
#define clk_l PORTD&=~BIT(1)
#define clk_o DDRD|=BIT(1)
#define clk_i DDRD&=~BIT(1)

#define LCDRS_H PORTA|=BIT(4)
#define LCDRS_L PORTA&=~BIT(4)
#define LCDRS_O DDRA|=BIT(4)
#define LCDRS_I DDRA&=~BIT(4)

#define LCDRW_H PORTA|=BIT(5)
#define LCDRW_L PORTA&=~BIT(5)
#define LCDRW_O DDRA|=BIT(5)
#define LCDRW_I DDRA&=~BIT(5)

#define LCDEN_H PORTA|=BIT(6)
#define LCDEN_L PORTA&=~BIT(6)
#define LCDEN_O DDRA|=BIT(6)
#define LCDEN_I D DRA&=~BIT(6)

#define LCDPSB_H PORTA|=BIT(3)
#define LCDPSB_L PORTA&=~BIT(3)
#define LCDPSB_O DDRA|=BIT(3)
#define LCDPSB_I DDRA&=~BIT(3)

#define LCD_DataIn DDRB=0X00
#define LCD_DataOut DDRB=0XFF
#define data PIND&BIT(3)

void SET_DT(uchar dt){LCD_DataOut;PORTB=dt;}
uchar GET_DT(void){LCD_DataIn;return PINB;}

void delay_us(unsigned int delay_counter)//延时1us
{
do
{
delay_counter--;
}
while(delay_counter>1);
}

void delay_ms(unsigned int delay_counter)//延时1ms
{
while(delay_counter!=0)
{
delay_us(1000);
delay_counter--;
}
}

uint addata(void) //1549数据采集
{
uchar i;
uint adtemp;
cs_h; //禁止I/O CLOCK
cs_l; //开启控制电路,使能DATA OUT和I/O CLOCK
adtemp=0; //清转换变量
for(i=0;i<10;i++) //采集10次 ,即10bit
{
clk_l;
adtemp*=2; //(adtemp=adtemp<<1)
if(data) adtemp++;
clk_h;
}
cs_h;
return adtemp;
}

uint conv( uint i)
{

uint volt;
volt=(5000*(long)i)/1024;
return (volt);
}

void write_com(uchar dt) //LCD写命令
{
uchar temp=0;
LCDRS_L;
LCDRW_H;
do
{
LCDEN_H;
delay_ms(1);
temp=GET_DT();
LCDEN_L;
}
while(temp&0x80);
LCDRW_L;
SET_DT(dt);
LCDEN_H;
delay_ms(1);
LCDEN_L;
}
void write_data(uchar dt) //LCD写数据
{
uchar temp=0;
LCDRS_L;
LCDRW_H;
do
{
LCDEN_H;
delay_ms(1);
temp=GET_DT();
LCDEN_L;
}
while(temp&0x80);
LCDRS_H;
LCDRW_L;
SET_DT(dt);
LCDEN_H;
delay_ms(1);
LCDEN_L;
}

void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if(X==0)
{X=0x80;} //第一行坐标为80-87
else if(X==1)
{X=0x90;} //第二行坐标为90-97
else if(X==2)
{X=0x88;} //第三行坐标为88-8f
else if(X==3)
{X=0x98;} //第四行坐标为98-9f
pos=X+Y;
write_com(pos); //把坐标指令写入液晶
}

void string(uchar *str) //LCD写字符串子函数
{
uchar i = 0;
while(str[i] != '\0')
{
write_data(str[i

++]);
}
}

void imit(void) //LCD初始化子函数
{
LCDRS_O;
LCDRW_O;
LCDEN_O;
LCDPSB_O;

LCD_DataOut;
LCDPSB_H;
write_com(0x30);
delay_ms(1);
write_com(0x02);
delay_ms(1);
write_com(0x0c);
delay_ms(1);
write_com(0x06);
delay_ms(1);
write_com(0x06);
delay_ms(1);
}
void main(void)
{
uint i,MV;
int t_0,t_1,t_2,t_3;
DDRD=0x03; //初始化
imit();
write_com(0x01);
while(1)
{
i=addata();
MV=conv(i);
t_0=MV%10;
t_1=(MV/10)%10;
t_2=(MV/100)%10;
t_3=(MV/1000);

lcd_pos(0,2);
string("AD转换");
delay_ms(2);
lcd_pos(1,0);
string("电压");
delay_ms(2);
write_com(0x92);
write_data(0x30+t_3);
delay_ms(2);

write_com(0x93);
write_data(0x30+t_2);
delay_ms(2);

write_com(0x94);
write_data(0x30+t_1);
delay_ms(2);

write_com(0x95);
write_data(0x30+t_0);
delay_ms(2);
lcd_pos(1,6);
string("mv");
}

}
/****************************************************************
功能:12864显示AD1549的输出数据值。
备注:显示电压值有0.1V的误差。
****************************************************************/

相关文档