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);
}
chen_zs2012_704941858 2013-4-21 13:08
用户395944 2013-1-15 19:27
用户1646592 2012-10-16 09:37
用户377235 2012-10-16 08:27