1602液晶
**************************************/
sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;
/**************************************
短延時
**************************************/
void delay5ms()
{
uchar i,v,k;
for(i=1;i>0;i--)
for(v=168;v>0;v--)
for(k=22;k>0;k--);
}
/**************************************
寫指令
**************************************/
void lcd_Write_com(uchar com)
{
RS=0; //定義指令寄存器
RW=0; //寫允許
P0=com; //寫指令
delay5ms(); E=1; //片選端上拉
delay5ms(); E=0; //下降沿鎖存
}
/**************************************
寫數(shù)據(jù)
**************************************/
void lcd_write_date(uchar date)
{
RS=1; //定義數(shù)據(jù)寄存器
RW=0; //寫允許
P0=date; //寫數(shù)據(jù)
delay5ms(); E=1; //片選端上拉
delay5ms(); E=0; //下降沿鎖存
}
/**************************************
顯示程序
**************************************/
void dis_lcd1602(uchar x,uchar y,uchar dat)
{
uchar add;
if(y==1) add=(0x80+x);
if(y==2) add=(0xc0+x);
lcd_Write_com(add); //寫指令
lcd_write_date(dat); //寫數(shù)據(jù)
}
/**************************************
液晶初始化
**************************************/
void lcd1602_init()
{
lcd_Write_com(0x38); //設置8位格式,2行,5*7
lcd_Write_com(0x01); //清屏
lcd_Write_com(0x0c); //整體顯示,關光標,不閃爍
lcd_Write_com(0x06); //設定輸入方式,增量不移位
lcd_Write_com(0x80); //初始坐標
}
/**************************************
液晶顯示漢字程序
**************************************/
void hz_lcdDis(uchar x,uchar y,uchar *p) //漢字顯示
{
uchar i=0,temp;
if(x)temp = 0x40; else temp = 0;
for(i=y;*p!='\0';i++,p++)
{
lcd_Write_com(i|0x80+temp);
lcd_write_date(*p);
delay5ms();
}
}
/**************************************
液晶顯示數(shù)字程序
**************************************/
void num_lcdDis(uchar X,uchar Y,uint num,uchar n)
{
uint i=0,temp,hang;
n +=1;
if(X)hang = 0x40;else hang = 0;
for(i=(n-1);i>0;i--)
{
lcd_Write_com((i+Y-1)|0x80+hang); //從個位開始顯示
temp = num%10+0x30;
lcd_write_date(temp);
delay5ms();
num/=10;
}
}
函數(shù)說明: 主函數(shù)
**********************************************************/
void main(void)
{
uint U1,U2,I1,S;
SD_1=0;
lcd1602_init();
hz_lcdDis(0,4,"Welcome!");
init_pwm();
InitADC();
delay(250);
// delay(250);
EA=1;//開總中斷
lcd_Write_com(0x01); //清屏
// SD_1=1;
hz_lcdDis(0,0,"IN= . V S= . A");
hz_lcdDis(1,0,"OU= . V I= . A");
while(1)//主循環(huán)
{
U1=Filter(Boost_voltage)/92; //輸入電壓 1:10采樣電阻 93,
U2=Filter(Battery_voltage)/92; //輸出電壓 1:10采樣電阻 93
I1=Filter(O_current)/150; //輸出電流
// if(I1>1) I1=I1-1;//輸出電流顯示校準
if(U2>242)
{SD_1=0; lock=1; CCAP1L =CCAP1H =128; hz_lcdDis(0,8,"P"); }
num_lcdDis(0,3,U1/10,2);
num_lcdDis(0,6,U1%10,1);
num_lcdDis(1,3,U2/10,2);
num_lcdDis(1,6,U2%10,1);
S=OUT_Current/3;
num_lcdDis(0,11,S/100,1);
num_lcdDis(0,13,S%100,2);
num_lcdDis(1,11,I1/100,1);
num_lcdDis(1,13,I1%100,2);
// if((u2-u1)<40) hz_lcdDis(0,10,"Error!");
// else hz_lcdDis(0,10,"OK ");
key_scan();
}
}
|