一个简单的基于LM4229显示屏的按键控制多种花样霓虹灯实训设计,包括一些简单的Proteus图及Keil的代码
按键控制多种花样霓虹灯设计
实操成绩__________报告成绩__________
一 控制要求 使用按键控制多种花样霓虹灯,电路板上有8个至左而右排列整齐的发光二极管,需要根据一个按键的输入来实现以下4种显示状态的切换: 1)全亮 2)全部闪烁 3)至左而右流水灯循环(第1、3、5、7奇数个发光二极管亮灭) 4)至右而左流水灯循环(第8、6、4、2偶数个发光二极管亮灭)
二 电路原理图
三 源程序:(详见51hei附件)
四 调试 1) 遇到的问题及解决方法 1. 问题:按键有效按一次的时间太短 解决方法:在按键的判断后加delay函数 2. 问题:按钮按完之后没有马上进入main函数再次判断 解决方法:在循环中加入if条件语句判断按钮是否按下 3. 问题:LM4299LCD的字显示过后会有残余的影像 解决方法:加入清屏函数在条件的最后进行清屏
2) 调试结果 实现了项目要求中的全部控制要求。 还实现了下述附加功能: 1.加入了LM4299LCD屏来显示名字和实训内容这些信息 2.在LM4299中显示按钮及LED灯的状态
五 收获 更加熟悉Keil及proteus的联调操作,再查找LM4299LCD屏的资料时看到了之前在模板中没有的清屏函数,更加完善LM4299的模板。更加了解了delay函数的应用及如何改善在循环函数中按钮按下的判断。
单片机源程序如下:
- //*****************************************************************************************
- //文件名称:main.c
- //*****************************************************************************************
- #include <main.h>
- //*****************************************************************************************
- //*****************************************************************************************
- //功能:主函数
- //*****************************************************************************************
- sbit S1=P2^0;
- unsigned char a=0;
- void main(void)
- {
- lcd_init(); //LM4229液晶屏初始化
- clr_lcd(0,0,240*128/64); //清屏
- while(1)
- {
- write_lcd(2,0, "姓名:陈**");
- write_lcd(20,0, "班级:物联网1601");
- write_lcd(38,0, "学号:15********");
- write_lcd(56,0, "实训内容:");
- write_lcd(74,0, "按键控制多种花样霓虹灯设计");
- write_lcd(92,0, "按钮及LED灯状态:");
- /*if(a==4) write_lcd(110,0, "按4下:至右而左流水灯循环");*/
- if(S1==0) {
- delay(1000);
- if(S1==0) {a++;delay(20000);}
- }
- switch(a){
- case 0:P1=0xff;write_lcd(110,0, "初始状态");break;
- case 1:P1=0x00;write_lcd(110,0, "按1下:全亮");break;
- case 2:case1();write_lcd(110,0, "按2下:全部闪烁");break;
- case 3:case3();write_lcd(110,0, "按3下:至左而右流水灯循环");break;
- case 4:case2();write_lcd(110,0, "按4下:至右而左流水灯循环");break;
- default:a=0;P1=0xff;clear_lcd();break;
- }
- }
- }
复制代码LM4229.c
- //*****************************************************************************************
- //文件名称:LM4229.c
- //*****************************************************************************************
- #include <LM4229.h>
- //*****************************************************************************************
- //*****************************************************************************************
- //功能:延时函数
- //*****************************************************************************************
- void delay_lcd(uchar t)
- {
- for(;t!=0; t--);
- }
- //*****************************************************************************************
- //功能:写数据函数
- //*****************************************************************************************
- void write_data(uchar dat)
- {
- CD=0; //数据
- CE=0; //LCD使能
- WRIT=0; //写
- DATA_PORT=dat; //把数据送到P口
- delay_lcd(1); //当晶振较高时加延时
- WRIT=1; //关写
- CE=1; //关使能
- }
- //*****************************************************************************************
- //功能:写命令函数
- //*****************************************************************************************
- void write_com(uchar com)
- {
- CD=1; //命令
- CE=0;
- WRIT=0;
- DATA_PORT=com;
- delay_lcd(1); //当晶振较高时加延时
- WRIT=1;
- CE=1;
- }
- //*****************************************************************************************
- //功能:LM4229初始化函数
- //*****************************************************************************************
- void lcd_init(void)
- {
- // FS1 = 0; //fs1管脚高电平时表示字体为8*6;低电平时为8*8
- // MD2 = 0;
- // HALT = 0;
- write_data(0);
- write_data(0); //图形首地址
- write_com(0x42); //图形首地址设置
- write_data(30);
- write_data(0);
- write_com(0x43); //图形区域设置
- write_com(0x80); //设置为OR模式
- write_com(0x9a); //关闭文本显示,开图形显示
- }
- //*****************************************************************************************
- //功能:指定位置、长度清屏
- //*****************************************************************************************
- void clr_lcd(uchar x,uchar y,uint length)
- {
- uint i,place;
-
- place=x*30+y;
- write_data(place&0xff);
- write_data(place/256);
- write_com(0x24); //设置
- for(i=0;i<length;i++)
- write_data(0xff); //写入空格,清屏
- write_com(0xb2); //关闭自动写
- }
- //*****************************************************************************************
- //功能:指定位置向LCD写入指定字符
- //*****************************************************************************************
- void write_lcd(uchar x,uchar y,char *cha)
- {
- uint place,i=0;
- uchar length,c1,c2,j,k;
-
- for(length=0;cha[length]!=0;length++);
- do
- {
- c1=cha[i]; //取字符串的ASCII码
- c2=cha[i+1];
- place=x*30+y;
- if(c1<=128) //小于128为字符,大于128为汉字
- {
- for(k=0;k<16;++k) //字符设置为16*8
- {
- write_data(place&0xff); //写入地址高位
- write_data(place/256); //写入地址低位
- write_com(0x24); //地址设置
- write_com(0xb0); //设置数据自动写
- write_data(ASC_MSK[(c1-0x20)*16+k]); //例如:0的ASCII码为0x30,在ASC_MSK中的位置为0x10*16 ---16字节字码依次写入LCD
- write_com(0xb2); //自动复位
- place=place+30;
- }
- if(y>28) //y>28时候需要换行
- {
- x=x+16;
- y=0;
- }
- else //否则,不换行,继续写下一个字符
- {
- y++;
- }
- i++;
- }
- else //c1大于128为汉字
- {
- for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++) //找到汉字
- {
- if(c1==GB_16[j].Index[0]&&c2==GB_16[j].Index[1])
- {
- break; //汉字找到则跳出
- }
- }
- if(j<sizeof(GB_16)/sizeof(GB_16[0])) //如果汉字在子码表内
- {
- for(k=0;k<16;k++) //字符设置为16*8
- {
- write_data(place&0xff); //写入地址高位
- write_data(place/256); //写入地址低位
- write_com(0x24); //地址设置
- write_com(0xb0); //设置数据自动写
- write_data(GB_16[j].Msk[k*2]);
- write_data(GB_16[j].Msk[k*2+1]); //16*16,每行2字节
- write_com(0xb2); //自动复位
- place=place+30; //下一行
- }
- }
- else //没找到对应汉字则涂黑
- {
- for(k=0;k<16;k++) //字符设置为16*8
- {
- write_data(place&0xff); //写入地址高位
- write_data(place/256); //写入地址低位
- write_com(0x24); //地址设置
- write_com(0xb0); //地址设置
- write_data(0xff);
- write_data(0xff);
- write_com(0xb2); //自动复位
- place=place+30; //下一行
- }
- }
- if(y>27) //换行
- {
- x+=16;y=0;
- }
- else //不用换行,则下一个字
- {
- y+=2;
- }
- i+=2;
- }
- }
- while(i<length);
- }
- //--------------------------------------------
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
项目一 按键控制多种花样霓虹灯设计.zip
(506.29 KB, 下载次数: 120)
|