自定义单片机液晶显示图形学习(自定义单片机图形显示液晶显示)

自定义单片机液晶显示图形学习(自定义单片机图形显示液晶显示)

这篇写液晶1602显示自定义图形,显示2个简单汉字 第一行第六个显示---日第二行第七个显示---月 作为举例,方便大家在特定位置显示特定汉字或图形仿真图:这里需要用到一个取模软件:1 先选88的大小2 放大图形3.参数设置4 取特定图形 需要注意的是左边3列不要用到。
然后根据需要取模程序:程序内容比较多,详细参考源代码源代码:#include<reg52.h>#include <intrins.h> #define uchar unsigned char #define uint unsigned int #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; //短延时 sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2; //自定义字符uchar code mytab1[8] = {0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00,};//日uchar code mytab2[8] = {0x0F,0x09,0x0F,0x09,0x0F,0x09,0x0B,0x19,}; //月void delay1(int ms) //带参数ms级延时函数 { unsigned char y; while(ms--) { for(y = 0; y<250; y++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } // /检查LCD忙状态 / /lcd_busy = 1,忙,等待,lcd_busy = 0,空闲 / // bit lcd_busy() //忙检测 { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); } // /写指令到LCD / /RS=L,RW=L,E=高,D0-D7=指令码 / // void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }// /写数据到LCD / /RS=H,RW=L,E=高脉冲,D0-D7=数据 / // void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }// / 写字符串到LCD / // void write_str(uchar addr,uchar p) { uchar i=0; lcd_wcmd(addr); while(p[i]!='\0') { lcd_wdat(p[i]); i++; } } // / 设定显示位置 / // void write_position(uchar row,uchar col) { uchar place; if(row==1) //第一行{ place=0x80+col-1; //位置lcd_wcmd(place); } else { place=0xc0+col-1; lcd_wcmd(place); } } // /自定义字符写入CGRAM / // void writetab1() { unsigned char i; lcd_wcmd(0x40); //设定CGRAM地址 for (i = 0; i< 8; i++) lcd_wdat(mytab1[i]); } void writetab2() { unsigned char i; lcd_wcmd(0x48); //设定CGRAM地址 for (i = 0; i< 8; i++) lcd_wdat(mytab2[i]); } // / LCD初始化 / // void init_lcd() { delay1(15); //延时15ms lcd_wcmd(0x01); //清屏 lcd_wcmd(0x38); //162显示,57点阵,8位数据 delay1(5); //延时5ms lcd_wcmd(0x38); delay1(5); lcd_wcmd(0x38); delay1(5); lcd_wcmd(0x0c); //显示开,关光标 delay1(5); lcd_wcmd(0x06); //移动光标 delay1(5); lcd_wcmd(0x01); //清屏 delay1(5); }/0x00:第一个(0x40) 0x01:第二个(0x48) 0x02:第三个(0x50) 0x03:第四个(0x58)0x04:第五个(0x60) 0x05:第六个(0x68) 0x06:第七个(0x70) 0x07:第八个(0x78)第一行第一个位置的地址是0x80,第二行一个位置的地址是0xC0要求 第一行第六个显示日 第二行第七个显示月/void main(){ init_lcd(); while(1) { //显示日 writetab1(); //第一个自定义字符的内容 write_position(1,6); //指定显示位置 lcd_wdat(0x00); //显示内容 //显示月 writetab2(); //第2个自定义字符的内容 write_position(2,7); lcd_wdat(0x01); }}仿真结果:

联系我们

在线咨询:点击这里给我发消息