热度 28
2012-10-5 22:01
4394 次阅读|
4 个评论
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 ={" 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_symbol0) { RS=0; RW=1; E=1; //PORTB=0xff; delay_nus(1); PORTB=0xff; DDRB=0x00; busy_symbol=PINB0x80; //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); }