电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

【博客大赛】如何用1602做的电压和电流显示?

1602字符型液晶显示器

指定行和列写字符串子程序

void LCD_disp(char x,char y,char dat)
{
char address;

if(y==1)
address=0x80+x;   //确定行地址
else
address=0xc0+x;
write_comm(address);//写入行地址
write_data(dat);           //写入显示数据
}

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

我选用的JHD162A,好像是SPLC780D液晶芯片吧?但这个不关键,主要是他的引脚排序和工作时序图,是必须要的。

JH162A的引脚排序(如下):

读模式时序(如下):

写模式时序(如下):

 对于1602,他是字符型显示,所以对于显示数据要转换成对应的ASCII码,对于显示数据可以根据使用是固定的还是需要改变的,把他定义在FLASH或RAM 里,这样可以节省RAM,有利于MCU的利用效率,当然也可以全部定义在RAM里。我使用的操作环境是IAR,在这个环境里

如:__flash char n_disp[13]={" BATT VOLTAGE"};

把固定显示内容“BATT VOLTAGE”定义在FLASH里。

对于随时改变的显示数据,必须要定义在RAM里面,而且对采集来的信号,要进行分位和ASCII转换。

如采样电压数据为X(十进制),最大为1000,实际电压显示0--25.0V,设X为512,X1=512/4=128

那么显示的十位Y为

X1/100=1           ASCII转换 Y+0X30=0X31

 那么显示的个位Z为

X1%100=28     28/10=2      ASCII转换 2+0X30=0X32

那么显示的小数位I为

28%10=8       ASCII转换 8+0X30=0X38

对应十位,个位,小数点和小数位显示分别为

0X31,0X32,0X2E,0X38

这样显示的数据位12.8

定义外部引脚

 #define LED PORTC_Bit4        
#define RS  PORTD_Bit5        
#define RW  PORTD_Bit6
#define E   PORTD_Bit7
#define ANJ PORTD_Bit4

 显示忙子程序

void LCD_check_busy()
{
i_symbol=0x01;
  while(i_symbol>0)
  {
   
     RS=0;
     RW=1;
     E=1;
     //PORTB=0xff;
    delay_nus(1);
    PORTB=0xff;
    DDRB=0x00;
   
    busy_symbol=PINB&0x80;
    //E=0;
    i_symbol=busy_symbol;
  }
}

写命令子程序

void write_comm(char dat)
{
 LCD_check_busy();
 DDRB=0xff;
 PORTB=dat;
 RS=0;
 RW=0;

 E=1;
 delay_nus(10);
 E=0;
//delay_nms(100);
}

写数据子程序

void write_data(char dat)
{
LCD_check_busy();
DDRB=0xff;
PORTB=dat;
RS=1;
RW=0;

E=1;
delay_nus(10);
E=0;
//delay_nms(100);
}

指定行和列写字符串子程序

void LCD_disp(char x,char y,char dat)
{
char address;

if(y==1)
address=0x80+x;
else
address=0xc0+x;
write_comm(address);
//delay_nms(100);
write_data(dat);
//delay_nms(100);
}

 

博主
ydcman@aliyun.com
YDCMAN
希望ednchina越办越好!
点击跳转