这是程序
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define delay4us() {_nop_();_nop_();_nop_();_nop_();}
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
sbit CS = P1^0;
sbit CLK = P1^1;
sbit DIO = P1^2;
uchar Display_Buffer[] = "0.00V";
uchar code Line1[] = "Current Voltage:";
void DelayMS(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
bit LCD_Busy_Check()
{
bit result;
RS = 0; //RS=0,代表指令,RS=1,代表数据
RW = 1; //RW=0,代表写,RW=1,代表读
E = 1; //E高电平读,下降沿写。
delay4us();
result = (bit)(P0&0x80);//读数据最高位,为1则忙,为0则闲
E = 0;
return result;
}
void LCD_Write_Command(uchar cmd)
{
while(LCD_Busy_Check()); //忙检测
RS = 0; //指令
RW = 0; //写命令
E = 0; //
_nop_();
_nop_();
P0 = cmd;
delay4us();
E = 1;
delay4us();
E = 0;
}
void Set_Disp_Pos(uchar pos)
{
LCD_Write_Command(pos | 0x80);
}
void LCD_Write_Data(uchar dat)
{
while(LCD_Busy_Check());
RS = 1; //数据
RW = 0; //写
E = 0; //根据时序图,这个低电平之后,可以缩少两个空指令。
P0 = dat;
delay4us();
E = 1;
delay4us();
E = 0;
}
void LCD_Ini
tialise()
{
LCD_Write_Command(0x38); DelayMS(1);//16*2,5*7,八位数据
LCD_Write_Command(0x0c); DelayMS(1); // 低三位:显示开关开,光标开关关,闪烁开关关
LCD_Write_Command(0x06); DelayMS(1); // 低两位:为1读写后AC自动增一(为0读写后AC自动减一):为1读写后画面平移,为0读写后画面不动。
LCD_Write_Command(0x01); DelayMS(1);//清屏
}
uchar Get_AD_Result()
{
uchar i,dat1=0,dat2=0;
CS = 0;
CLK = 0;DIO = 1; _nop_(); _nop_();
CLK = 1; _nop_(); _nop_();
CLK = 0;DIO = 0; _nop_(); _nop_();
CLK = 1; _nop_(); _nop_();
CLK = 0;DIO = 1; _nop_(); _nop_();
CLK = 1; _nop_(); _nop_();
CLK = 0; _nop_(); _nop_();
for(i=0;i<8;i++)
{
CLK = 1; _nop_(); _nop_();
CLK = 0; _nop_(); _nop_();
dat1 = dat1 << 1 | (uchar)(DIO);
}
for(i=0;i<8;i++)
{
dat2 = dat2 |((uchar)(DIO)<<i); //这条指令不能放到循环的下降沿后,因为这个低位就是上一个字节的最低位。
CLK = 1; _nop_(); _nop_();
CLK = 0; _nop_(); _nop_();
}
CS = 1;
return ((dat1 == dat2) ? dat1:0);
}
void main()
{
uchar i;
uint d;
LCD_Initialise();
DelayMS(10);
while(1)
{
d = Get_AD_Result()*500.0/255;
Display_Buffer[0]=d/100+'0';
Display_Buffer[2]=d/10%10+'0';
Display_Buffer[3]=d%10+'0';
Set_Disp_Pos(0x01);
i = 0;
while(Line1[i]!=' ')
{
LCD_Write_Data(Line1[i]);
i++;
DelayMS(10);
}
Set_Disp_Pos(0x46);
i = 0;
while(Display_Buffer[i]!=' ')
{
LCD_Write_Data(Display_Buffer[i]);
i++;
DelayMS(10);
}
}
}
-
一周热门 更多>