標(biāo)題: LM4229顯示屏的單片機(jī)按鍵控制多種花樣霓虹燈設(shè)計(jì)報(bào)告與源碼 [打印本頁(yè)]

作者: 2089281458    時(shí)間: 2018-5-14 16:40
標(biāo)題: LM4229顯示屏的單片機(jī)按鍵控制多種花樣霓虹燈設(shè)計(jì)報(bào)告與源碼
一個(gè)簡(jiǎn)單的基于LM4229顯示屏的按鍵控制多種花樣霓虹燈實(shí)訓(xùn)設(shè)計(jì),包括一些簡(jiǎn)單的Proteus圖及Keil的代碼


按鍵控制多種花樣霓虹燈設(shè)計(jì)

實(shí)操成績(jī)__________報(bào)告成績(jī)__________

一  控制要求
              使用按鍵控制多種花樣霓虹燈,電路板上有8個(gè)至左而右排列整齊的發(fā)光二極管,需要根據(jù)一個(gè)按鍵的輸入來(lái)實(shí)現(xiàn)以下4種顯示狀態(tài)的切換:
1)全亮
2)全部閃爍
3)至左而右流水燈循環(huán)(第1、3、5、7奇數(shù)個(gè)發(fā)光二極管亮滅)
4)至右而左流水燈循環(huán)(第8、6、4、2偶數(shù)個(gè)發(fā)光二極管亮滅)

二  電路原理圖




三  源程序:(詳見51hei附件)



四  調(diào)試
1) 遇到的問題及解決方法
1. 問題:按鍵有效按一次的時(shí)間太短
  解決方法:在按鍵的判斷后加delay函數(shù)
2. 問題:按鈕按完之后沒有馬上進(jìn)入main函數(shù)再次判斷
  解決方法:在循環(huán)中加入if條件語(yǔ)句判斷按鈕是否按下
3. 問題:LM4299LCD的字顯示過(guò)后會(huì)有殘余的影像
  解決方法:加入清屏函數(shù)在條件的最后進(jìn)行清屏


2) 調(diào)試結(jié)果
實(shí)現(xiàn)了項(xiàng)目要求中的全部控制要求。
還實(shí)現(xiàn)了下述附加功能:
              1.加入了LM4299LCD屏來(lái)顯示名字和實(shí)訓(xùn)內(nèi)容這些信息
              2.在LM4299中顯示按鈕及LED燈的狀態(tài)

五  收獲
更加熟悉Keil及proteus的聯(lián)調(diào)操作,再查找LM4299LCD屏的資料時(shí)看到了之前在模板中沒有的清屏函數(shù),更加完善LM4299的模板。更加了解了delay函數(shù)的應(yīng)用及如何改善在循環(huán)函數(shù)中按鈕按下的判斷。

單片機(jī)源程序如下:
  1. //*****************************************************************************************                                                                                                                                                  
  2. //文件名稱:main.c
  3. //*****************************************************************************************
  4. #include <main.h>
  5. //*****************************************************************************************

  6. //*****************************************************************************************                                                                                                                                                  
  7. //功能:主函數(shù)
  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,  "班級(jí):物聯(lián)網(wǎng)1601");
  19.                 write_lcd(38,0,  "學(xué)號(hào):15********");
  20.                 write_lcd(56,0,  "實(shí)訓(xùn)內(nèi)容:");
  21.                 write_lcd(74,0,  "按鍵控制多種花樣霓虹燈設(shè)計(jì)");
  22.                 write_lcd(92,0,  "按鈕及LED燈狀態(tài):");
  23.                 /*if(a==4) write_lcd(110,0, "按4下:至右而左流水燈循環(huán)");*/
  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, "初始狀態(tài)");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下:至左而右流水燈循環(huán)");break;
  33.                 case 4:case2();write_lcd(110,0, "按4下:至右而左流水燈循環(huán)");break;
  34.                 default:a=0;P1=0xff;clear_lcd();break;
  35.         }
  36.         }
  37. }
復(fù)制代碼
LM4229.c
  1. //*****************************************************************************************                                                                                                                                                  
  2. //文件名稱:LM4229.c
  3. //*****************************************************************************************
  4. #include <LM4229.h>
  5. //*****************************************************************************************

  6. //*****************************************************************************************                                                                                                                                                  
  7. //功能:延時(shí)函數(shù)
  8. //*****************************************************************************************
  9. void delay_lcd(uchar t)
  10. {
  11.         for(;t!=0; t--);
  12. }
  13. //*****************************************************************************************                                                                                                                                                  
  14. //功能:寫數(shù)據(jù)函數(shù)
  15. //*****************************************************************************************
  16. void write_data(uchar dat)
  17. {
  18.         CD=0;                                                                                                                                                                                  //數(shù)據(jù)
  19.         CE=0;                                                                                                                                                                                  //LCD使能
  20.         WRIT=0;                                                                                                                                                                                //寫
  21.         DATA_PORT=dat;                                                                                                                                                                         //把數(shù)據(jù)送到P口
  22.         delay_lcd(1);                                                                                                                                                              //當(dāng)晶振較高時(shí)加延時(shí)
  23.         WRIT=1;                                                                                                                                                                                //關(guān)寫
  24.         CE=1;                                                                                                                                                                                  //關(guān)使能
  25. }
  26. //*****************************************************************************************                                                                                                                                                  
  27. //功能:寫命令函數(shù)
  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);                                                                                                                                                                   //當(dāng)晶振較高時(shí)加延時(shí)
  36.         WRIT=1;
  37.         CE=1;
  38. }
  39. //*****************************************************************************************                                                                                                                                                  
  40. //功能:LM4229初始化函數(shù)
  41. //*****************************************************************************************
  42. void lcd_init(void)
  43. {
  44. //         FS1 = 0;                                                                                                                                                                                        //fs1管腳高電平時(shí)表示字體為8*6;低電平時(shí)為8*8
  45. //        MD2 = 0;
  46. //        HALT = 0;
  47.         write_data(0);
  48.         write_data(0);                                                                                                                                                //圖形首地址
  49.         write_com(0x42);                                                                                                                                                     //圖形首地址設(shè)置
  50.         write_data(30);
  51.         write_data(0);
  52.         write_com(0x43);                                                                                                                                                     //圖形區(qū)域設(shè)置
  53.         write_com(0x80);                                                                                                                                                     //設(shè)置為OR模式
  54.         write_com(0x9a);                                                                                                                                                                //關(guān)閉文本顯示,開圖形顯示
  55. }
  56. //*****************************************************************************************                                                                                                                                                  
  57. //功能:指定位置、長(zhǎng)度清屏
  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);                                                                                                                                        //設(shè)置
  67.         for(i=0;i<length;i++)
  68.         write_data(0xff);                                                                                                                                  //寫入空格,清屏
  69.         write_com(0xb2);                                                                                                                                               //關(guān)閉自動(dòng)寫
  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)                                                                                                                             //字符設(shè)置為16*8
  88.       {
  89.         write_data(place&0xff);                                                                                                   //寫入地址高位
  90.         write_data(place/256);                                                                                                    //寫入地址低位
  91.         write_com(0x24);                                                                                                          //地址設(shè)置
  92.         write_com(0xb0);                                                                                                          //設(shè)置數(shù)據(jù)自動(dòng)寫
  93.         write_data(ASC_MSK[(c1-0x20)*16+k]);                                                         //例如:0的ASCII碼為0x30,在ASC_MSK中的位置為0x10*16 ---16字節(jié)字碼依次寫入LCD
  94.         write_com(0xb2);                                                                                                                  //自動(dòng)復(fù)位
  95.         place=place+30;
  96.       }
  97.       if(y>28)                                                                                                                                            //y>28時(shí)候需要換行
  98.       {
  99.                                 x=x+16;
  100.                                 y=0;
  101.                         }
  102.       else                                                                                                                                                //否則,不換行,繼續(xù)寫下一個(gè)字符
  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]))                                                           //如果漢字在子碼表內(nèi)
  118.       {
  119.         for(k=0;k<16;k++)                                                                                                                     //字符設(shè)置為16*8
  120.         {
  121.           write_data(place&0xff);                                                                                           //寫入地址高位
  122.           write_data(place/256);                                                                                            //寫入地址低位
  123.           write_com(0x24);                                                                                                  //地址設(shè)置
  124.           write_com(0xb0);                                                                                                  //設(shè)置數(shù)據(jù)自動(dòng)寫
  125.           write_data(GB_16[j].Msk[k*2]);
  126.                                         write_data(GB_16[j].Msk[k*2+1]);                                                                 //16*16,每行2字節(jié)
  127.           write_com(0xb2);                                                                                             //自動(dòng)復(fù)位
  128.           place=place+30;                                                                                              //下一行
  129.         }
  130.       }
  131.       else                                                                                                                                                             //沒找到對(duì)應(yīng)漢字則涂黑
  132.       {
  133.         for(k=0;k<16;k++)                                                                                                                     //字符設(shè)置為16*8
  134.         {
  135.                                         write_data(place&0xff);                                                                                           //寫入地址高位
  136.           write_data(place/256);                                                                                            //寫入地址低位
  137.           write_com(0x24);                                                                                                  //地址設(shè)置
  138.           write_com(0xb0);                                                                                                  //地址設(shè)置
  139.           write_data(0xff);
  140.                                         write_data(0xff);
  141.           write_com(0xb2);                                                                                             //自動(dòng)復(fù)位
  142.           place=place+30;                                                                                              //下一行
  143.         }
  144.       }
  145.       if(y>27)                                                                                                                                                              //換行
  146.       {
  147.                                 x+=16;y=0;
  148.                         }
  149.       else                                                                                                                                                                  //不用換行,則下一個(gè)字
  150.       {
  151.                                 y+=2;
  152.                         }
  153.       i+=2;
  154.     }
  155.   }
  156.   while(i<length);
  157. }
  158. //--------------------------------------------
  159. ……………………

  160. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼



所有資料51hei提供下載:
項(xiàng)目一 按鍵控制多種花樣霓虹燈設(shè)計(jì).zip (506.29 KB, 下載次數(shù): 120)



作者: 累不死的狗    時(shí)間: 2019-9-29 16:33
仿真打不開啊




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1