找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8480|回复: 1
打印 上一主题 下一主题
收起左侧

LM4229显示屏的单片机按键控制多种花样霓虹灯设计报告与源码

[复制链接]
跳转到指定楼层
楼主
一个简单的基于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函数的应用及如何改善在循环函数中按钮按下的判断。

单片机源程序如下:
  1. //*****************************************************************************************                                                                                                                                                  
  2. //文件名称:main.c
  3. //*****************************************************************************************
  4. #include <main.h>
  5. //*****************************************************************************************

  6. //*****************************************************************************************                                                                                                                                                  
  7. //功能:主函数
  8. //*****************************************************************************************
  9. sbit S1=P2^0;
  10. unsigned char a=0;
  11. void main(void)
  12. {   
  13.         lcd_init();                                                                                                                                                                                //LM4229液晶屏初始化
  14.   clr_lcd(0,0,240*128/64);                                                                                                                        //清屏
  15.         while(1)
  16.         {
  17.                 write_lcd(2,0,   "姓名:陈**");
  18.                 write_lcd(20,0,  "班级:物联网1601");
  19.                 write_lcd(38,0,  "学号:15********");
  20.                 write_lcd(56,0,  "实训内容:");
  21.                 write_lcd(74,0,  "按键控制多种花样霓虹灯设计");
  22.                 write_lcd(92,0,  "按钮及LED灯状态:");
  23.                 /*if(a==4) write_lcd(110,0, "按4下:至右而左流水灯循环");*/
  24.                 if(S1==0) {
  25.         delay(1000);
  26.                 if(S1==0) {a++;delay(20000);}
  27.         }
  28.                                 switch(a){
  29.                 case 0:P1=0xff;write_lcd(110,0, "初始状态");break;
  30.                 case 1:P1=0x00;write_lcd(110,0, "按1下:全亮");break;
  31.                 case 2:case1();write_lcd(110,0, "按2下:全部闪烁");break;
  32.                 case 3:case3();write_lcd(110,0, "按3下:至左而右流水灯循环");break;
  33.                 case 4:case2();write_lcd(110,0, "按4下:至右而左流水灯循环");break;
  34.                 default:a=0;P1=0xff;clear_lcd();break;
  35.         }
  36.         }
  37. }
复制代码
LM4229.c
  1. //*****************************************************************************************                                                                                                                                                  
  2. //文件名称:LM4229.c
  3. //*****************************************************************************************
  4. #include <LM4229.h>
  5. //*****************************************************************************************

  6. //*****************************************************************************************                                                                                                                                                  
  7. //功能:延时函数
  8. //*****************************************************************************************
  9. void delay_lcd(uchar t)
  10. {
  11.         for(;t!=0; t--);
  12. }
  13. //*****************************************************************************************                                                                                                                                                  
  14. //功能:写数据函数
  15. //*****************************************************************************************
  16. void write_data(uchar dat)
  17. {
  18.         CD=0;                                                                                                                                                                                  //数据
  19.         CE=0;                                                                                                                                                                                  //LCD使能
  20.         WRIT=0;                                                                                                                                                                                //写
  21.         DATA_PORT=dat;                                                                                                                                                                         //把数据送到P口
  22.         delay_lcd(1);                                                                                                                                                              //当晶振较高时加延时
  23.         WRIT=1;                                                                                                                                                                                //关写
  24.         CE=1;                                                                                                                                                                                  //关使能
  25. }
  26. //*****************************************************************************************                                                                                                                                                  
  27. //功能:写命令函数
  28. //*****************************************************************************************
  29. void write_com(uchar com)
  30. {
  31.         CD=1;                                                                                                                                                                                                    //命令
  32.         CE=0;
  33.         WRIT=0;
  34.         DATA_PORT=com;
  35.         delay_lcd(1);                                                                                                                                                                   //当晶振较高时加延时
  36.         WRIT=1;
  37.         CE=1;
  38. }
  39. //*****************************************************************************************                                                                                                                                                  
  40. //功能:LM4229初始化函数
  41. //*****************************************************************************************
  42. void lcd_init(void)
  43. {
  44. //         FS1 = 0;                                                                                                                                                                                        //fs1管脚高电平时表示字体为8*6;低电平时为8*8
  45. //        MD2 = 0;
  46. //        HALT = 0;
  47.         write_data(0);
  48.         write_data(0);                                                                                                                                                //图形首地址
  49.         write_com(0x42);                                                                                                                                                     //图形首地址设置
  50.         write_data(30);
  51.         write_data(0);
  52.         write_com(0x43);                                                                                                                                                     //图形区域设置
  53.         write_com(0x80);                                                                                                                                                     //设置为OR模式
  54.         write_com(0x9a);                                                                                                                                                                //关闭文本显示,开图形显示
  55. }
  56. //*****************************************************************************************                                                                                                                                                  
  57. //功能:指定位置、长度清屏
  58. //*****************************************************************************************
  59. void clr_lcd(uchar x,uchar y,uint length)
  60. {
  61.         uint i,place;
  62.         
  63.         place=x*30+y;
  64.         write_data(place&0xff);
  65.         write_data(place/256);
  66.         write_com(0x24);                                                                                                                                        //设置
  67.         for(i=0;i<length;i++)
  68.         write_data(0xff);                                                                                                                                  //写入空格,清屏
  69.         write_com(0xb2);                                                                                                                                               //关闭自动写
  70. }
  71. //*****************************************************************************************                                                                                                                                                  
  72. //功能:指定位置向LCD写入指定字符
  73. //*****************************************************************************************
  74. void write_lcd(uchar x,uchar y,char *cha)
  75. {
  76.   uint place,i=0;
  77.   uchar length,c1,c2,j,k;
  78.   
  79.         for(length=0;cha[length]!=0;length++);
  80.   do
  81.   {
  82.     c1=cha[i];                                                                                                                                                              //取字符串的ASCII码
  83.     c2=cha[i+1];
  84.     place=x*30+y;
  85.     if(c1<=128)                                                                                                                                                        //小于128为字符,大于128为汉字
  86.     {
  87.                         for(k=0;k<16;++k)                                                                                                                             //字符设置为16*8
  88.       {
  89.         write_data(place&0xff);                                                                                                   //写入地址高位
  90.         write_data(place/256);                                                                                                    //写入地址低位
  91.         write_com(0x24);                                                                                                          //地址设置
  92.         write_com(0xb0);                                                                                                          //设置数据自动写
  93.         write_data(ASC_MSK[(c1-0x20)*16+k]);                                                         //例如:0的ASCII码为0x30,在ASC_MSK中的位置为0x10*16 ---16字节字码依次写入LCD
  94.         write_com(0xb2);                                                                                                                  //自动复位
  95.         place=place+30;
  96.       }
  97.       if(y>28)                                                                                                                                            //y>28时候需要换行
  98.       {
  99.                                 x=x+16;
  100.                                 y=0;
  101.                         }
  102.       else                                                                                                                                                //否则,不换行,继续写下一个字符
  103.       {
  104.                                 y++;
  105.                         }
  106.       i++;
  107.     }
  108.     else                                                                                                                                                   //c1大于128为汉字
  109.     {
  110.       for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)                          //找到汉字
  111.       {
  112.         if(c1==GB_16[j].Index[0]&&c2==GB_16[j].Index[1])
  113.                                 {
  114.                                         break;                                                                                                                                    //汉字找到则跳出
  115.                                 }
  116.       }
  117.       if(j<sizeof(GB_16)/sizeof(GB_16[0]))                                                           //如果汉字在子码表内
  118.       {
  119.         for(k=0;k<16;k++)                                                                                                                     //字符设置为16*8
  120.         {
  121.           write_data(place&0xff);                                                                                           //写入地址高位
  122.           write_data(place/256);                                                                                            //写入地址低位
  123.           write_com(0x24);                                                                                                  //地址设置
  124.           write_com(0xb0);                                                                                                  //设置数据自动写
  125.           write_data(GB_16[j].Msk[k*2]);
  126.                                         write_data(GB_16[j].Msk[k*2+1]);                                                                 //16*16,每行2字节
  127.           write_com(0xb2);                                                                                             //自动复位
  128.           place=place+30;                                                                                              //下一行
  129.         }
  130.       }
  131.       else                                                                                                                                                             //没找到对应汉字则涂黑
  132.       {
  133.         for(k=0;k<16;k++)                                                                                                                     //字符设置为16*8
  134.         {
  135.                                         write_data(place&0xff);                                                                                           //写入地址高位
  136.           write_data(place/256);                                                                                            //写入地址低位
  137.           write_com(0x24);                                                                                                  //地址设置
  138.           write_com(0xb0);                                                                                                  //地址设置
  139.           write_data(0xff);
  140.                                         write_data(0xff);
  141.           write_com(0xb2);                                                                                             //自动复位
  142.           place=place+30;                                                                                              //下一行
  143.         }
  144.       }
  145.       if(y>27)                                                                                                                                                              //换行
  146.       {
  147.                                 x+=16;y=0;
  148.                         }
  149.       else                                                                                                                                                                  //不用换行,则下一个字
  150.       {
  151.                                 y+=2;
  152.                         }
  153.       i+=2;
  154.     }
  155.   }
  156.   while(i<length);
  157. }
  158. //--------------------------------------------
  159. ……………………

  160. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



所有资料51hei提供下载:
项目一 按键控制多种花样霓虹灯设计.zip (506.29 KB, 下载次数: 120)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:453974 发表于 2019-9-29 16:33 | 只看该作者
仿真打不开啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表