完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 快还我小羊排ID 于 2016-10-6 12:49 编辑 本人非电专业,但是对单片机和编程有着无比浓厚的兴趣。3周前入手鹰哥51开发板,课余时间疯狂看视频写程序,国庆期间开始学习液晶,用了一天的时间在1602上实现了进度条的显示,效果不错,特开首贴记录之。 一、背景说明: 看了三周鹰哥的视频,配合图书馆借的书,感觉鹰哥讲的确实不错,最让我惊讶的是在QQ上直接向鹰哥本人提问的时候也是秒回,太赞了! 国庆的时候学了1602,鹰哥没有讲如何如在1602上显示任意字符,我以为1602没有这个功能,于是接着学了12864,发现12864有CGRAM字型产生器,我就在想,1602应该也有这个东西吧,于是找了数据手册来看,握草还真有,上网查了查教程,程序居然还挺简单,仅仅一个指令而已,于是在纸上设计了“气压显示”几个简单汉子的字符编码,显示效果还行。然后我就想,既然任意字符可以显示,那么可不可以设计一个进度条呢。。。 因为本人学的消防专业,消防员的空气呼吸器气瓶压力最大值为30MPa,当瓶内压力低于5MPa时,呼吸器上的哨子会发出机械鸣笛报警,本程序以此为背景,设计一个进度条,用1602液晶实现空气呼吸器的余气的显示和报警。 二、模块功能: 在1602第一排显示(气压显示:XXMPa XX%),第二排显示气压值余量的进度条。用旋转编码器调节剩余气量,当剩余气量低于5MPa时,蜂鸣器报警,同时1602液晶第二排显示Danger以进行提示。 三、亮点:在1602液晶上显示进度条,小白可以参考借鉴(好吧其实我也是小白( ̄ー ̄*|||) 四、配图:见图一 五、功能的实现: 1602字库中没有可以显示进度条的字符,新手可以试着用一排特殊符号来显示,@#¥随便啦,符号的数量根据数值的大小进行增减,就像这样的: @@@@@@@@@@ 表示100% @@@ 表示30% 但是美观度会大打折扣。因此,我尝试了向1602八个用户自定义字库里写入了4个符号,通过这四种符号的相互配合,可以实现一段比较好看的进度条的显示。 这四种符号如图二所示,每个符号的右侧有8个字节的编码。最左侧的字符是进度条的开头,程序里的表格是table_tou,中间的两个符号分别表示进度条中的“满”和“空”,在程序里的表格是table_zhong_man和table_zhong_kong,最后一个字符是进度条的结尾,在程序里的表格是table_wei。 例如,进度条的范围是0%到100%时,30%则对应着1个符号一(头),3个符号二,7个符号三,1个符号四(尾)详见二楼程序中的dis_jindutiao(X)子程序。 六、问题 在编程过程中遇到了一个极大的问题,想了一晚上也没想出来。 就是,本模块主要有两大子程序,显示程序(1602左右内容的显示)和旋转编码器程序,最开始的时候我在主程序里循环调用编码器程序,返回一个0~30的X值,在定时器中操作1602进行显示,可是1602上的显示内容怎么都没动,不知道为啥。后来我换了一下程序的顺序,在主程序中显示1602,在定时器中调用旋转编码器,然后特么的就好了。。。。就好了!!!我真的不知道为什么。。。。。。。。。哎,可能是学习的时间太短,有的细节没有注意到吧,有没有哪位大神可以指点一下啊。。。。。。。。 七、程序,放在下边 刚刚在网上买了12864,准备实现一个完整的进度条,同时现在也开始学习IIC了,到时候在把程序完善一下吧。。。。。。嗯,打字好累,就这样吧,求版主支持一下咯,别秒沉啊。。。。。 #include #include #include "mokuai/xianshimokuai.h" #include "mokuai/xuanzhuanbianma.h" ***it beep=P3^4; ***it DataKey_Port_A = P2^0; ***it DataKey_Port_B = P2^1; unsigned char X,Bmmc_Count=0; bit Sd_Flag,xuanzhuan_flag; typedef unsigned char uchar; ***it Lcd_Rs = P1^2 ; ***it Lcd_Rw = P1^3 ; ***it Lcd_En = P1^4 ; ***it BUSY = P0^7; unsigned char code table[]="0123456789"; unsigned char code danger[]="Danger"; unsigned char code table_tou[]={0x1f,0x10,0x17,0x17,0x17,0x17,0x10,0xff}; unsigned char code table_zhong_man[]={0x1f,0x00,0xff,0xff,0xff,0xff,0x00,0xff}; unsigned char code table_zhong_kong[]={0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xff}; unsigned char code table_wei[]={0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x18}; unsigned char code table_qi[]={0x08,0x0f,0x10,0x0e,0x00,0x1e,0x02,0x03}; unsigned char code table_ya[]={0x0f,0x08,0x0a,0x0f,0x0a,0x0a,0x0b,0x17}; unsigned char code table_xian[]={0x1f,0x11,0x1f,0x11,0x1f,0x0a,0x1b,0x1f}; unsigned char code table_shi[]={0x0e,0x00,0x1f,0x04,0x15,0x15,0x0c,0x04}; /******************************************************* * 程序功能:延时子程序 ******************************************************/ void Delay_1MS(unsigned int i) { unsigned int j; for(;i > 0;i--) { for(j=0;j<110;j++); } } /******************************************************* * 程序功能:等待繁忙标志 ******************************************************/ void Busy_Function(void) { P0 = 0xFF; do { Lcd_Rs = 0; Lcd_Rw = 1; Lcd_En = 0; Lcd_En = 1; }while (BUSY == 1); Lcd_En = 0; } /******************************************************* * 程序功能:写数据 ******************************************************/ void Write_Dat(uchar dat) { Busy_Function(); Lcd_En = 0; P0 = dat; Lcd_Rs = 1; Lcd_Rw = 0; Lcd_En = 1; Lcd_En = 0; } /*************************************** * 写命令 ***************************************/ void Write_Com(uchar cmd) { Busy_Function(); Lcd_En = 0; P0 = cmd; Lcd_Rs = 0; Lcd_Rw = 0; Lcd_En = 1; Lcd_En = 0; } /******************************************************* * 程序功能:写字符串 ******************************************************/ void Write_String(uchar addr_start, uchar *p) { Write_Com(addr_start); while (*p != ' |