完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#include #define uchar unsigned char #define uint unsigned int /////////////delayms function/////// void delay(unsigned int i) { while(i--) { unsigned int j; for(j=1;j<=1230;j++); } } //////////// void write_com(int com) {PORTB&=~BIT(0);delay(5); PORTC=com;delay(5); PORTB|=BIT(1);delay(5); PORTB&=~BIT(1);delay(5);} void write_data(int date) {PORTB|=BIT(0);delay(5); PORTC=date;delay(5); PORTB|=BIT(1);delay(5); PORTB&=~BIT(1);delay(5);} void main(void) {DDRB=0xff; DDRC=0xff; write_com(0x38); //设置显示模式为16*2; write_com(0x0c); //设置光标显示情况;00001100 write_com(0x06); //设置光标移动情况; write_com(0x01); //清除之前的数据; //write_com(0x86); //数据指针清0,指向第一位; write_com(0x80+0x40+3); //光标设置位置 write_data(0x33); write_data(0x36); write_data(0x32); } 问题在于只能从lcd屏幕的第一行第一个位置开始显示,无论怎样调整光标初始显示 |
|
相关推荐
2 个讨论
|
|
给你个参考程序,我刚刚在用的 /*定义LCD控制字*****************************************************/ //清屏及光标归位 #define LCD_CLEAR 0x01 // 清屏 #define LCD_HOMING 0x02 // 光标返回左上角 /************显示开关及光标设置指令 0000 1DCB D:1/0 开/关显示 C:1/0 显示/不显示光标 B:1/0 闪烁/不闪烁光标 *******************************/ #define lcd1602_dbport PORTA //lcd1602数据端口 void set_lcd1602_rs(uint rs); //(PA0)lcd1602数据/命令选择 1/0 void set_lcd1602_rw(uint rw); //(PA1)lcd1602读/写选择的端 1/0 void set_lcd1602_en(uint en); //(PA2)lcd1602使能端1/0 关/开 void lcd1602_nop(void); //LCD1602延时函数 uchar lcd1602_check_busy(void); //LCD1602忙检测函数 void lcd1602_write(uchar style, uchar dat); //向LCD1602写入操作 /*************************************************** 函数功能:LCD1602数据命令选择函数 入口参数:rs 1/0数据命令选择 出口参数:无 ***************************************************/ void set_lcd1602_rs(uint rs) { if (rs==0)PORTB&=~BIT(PB0); else PORTB|=BIT(PB0); } /*************************************************** 函数功能:LCD1602读写选择函数 入口参数:rs 1/0 读写命令选择 出口参数:无 ***************************************************/ void set_lcd1602_rw(uint rw) { if (rw==0)PORTB&=~BIT(PB1); else PORTB|=BIT(PB1); } /*************************************************** 函数功能:LCD1602数据命令选择函数 入口参数:rs 1/0数据命令选择 出口参数:无 ***************************************************/ void set_lcd1602_en(uint en) { if (en==0)PORTB&=~BIT(PB2); else PORTB|=BIT(PB2); } /*************************************************** 函数功能:LCD1602延时函数 入口参数:无 出口参数:无 ***************************************************/ void lcd1602_nop(void) { uchar i=5; while(i--); } /*************************************************** 函数功能:LCD1602忙检测函数,每次在写指令/数据和读数据之前都需要忙检测 入口参数:无 出口参数:lcd1602_dbport操作状态 ***************************************************/ uchar lcd1602_check_busy(void) { DDRA=0X00; set_lcd1602_rs(0); set_lcd1602_rw(1); lcd1602_nop(); set_lcd1602_en(1); lcd1602_nop(); // delay_ms(1); //proteus的LCD1602忙检测有BUG,直接采用延时 while((PINA&0x80)==0x80); //忙检测 set_lcd1602_en(0); DDRA=0XFF; return PINA; //返回操作状态 } /******************************************************************* 函数功能:向LCD1602写入操作函数 入口参数:bit:选择命令/数据0/1,dat:要写入的数 出口参数:无 ********************************************************************/ void lcd1602_write(uchar style, uchar dat) { set_lcd1602_en(0); //关闭使能 set_lcd1602_rs(style); //0命令,1数据 set_lcd1602_rw(0); //写 lcd1602_nop(); // lcd1602_nop(); lcd1602_dbport=dat; lcd1602_nop(); set_lcd1602_en(1); //开启使能 lcd1602_nop(); set_lcd1602_en(0); lcd1602_nop(); lcd1602_check_busy();//忙检测 } /******************************************************************* 函数功能:LCD1602初始化函数(详细参考) 入口参数:无 出口参数:无 ********************************************************************/ void lcd1602_init(void) { DDRB|=BIT(PB0)|BIT(PB1)|BIT(PB2); DDRA=0XFF; lcd1602_write(0,0x38); //8位数据端口,2行显示,5*7点阵 lcd1602_write(0,0x38); //需要连续写2次,LCD寄存器。。。 lcd1602_write(0,0x0c); //光标设置 lcd1602_write(0,0x06); //地址指针设置 lcd1602_write(0,LCD_CLEAR); //显示清屏 lcd1602_write(0,0x80); //数据指针设置 } /********************************************************************* -函数功能:lcd显示字符串函数 -入口参数:row:行,column:列,*str:字符串 -出口参数:无 *********************************************************************/ void lcd1602_print(uchar row,uchar column,uchar *str) { if(row==0) lcd1602_write(0,0x80|column); if(row==1) lcd1602_write(0,0xc0|column); while(*str!=' |