|
一個簡單的基于LM4229顯示屏的按鍵控制多種花樣霓虹燈實(shí)訓(xùn)設(shè)計,包括一些簡單的Proteus圖及Keil的代碼
2018-05-14_16-37-31.png (159.55 KB, 下載次數(shù): 59)
下載附件
2018-5-14 16:39 上傳
按鍵控制多種花樣霓虹燈設(shè)計
實(shí)操成績__________報告成績__________
一 控制要求 使用按鍵控制多種花樣霓虹燈,電路板上有8個至左而右排列整齊的發(fā)光二極管,需要根據(jù)一個按鍵的輸入來實(shí)現(xiàn)以下4種顯示狀態(tài)的切換: 1)全亮 2)全部閃爍 3)至左而右流水燈循環(huán)(第1、3、5、7奇數(shù)個發(fā)光二極管亮滅) 4)至右而左流水燈循環(huán)(第8、6、4、2偶數(shù)個發(fā)光二極管亮滅)
二 電路原理圖
  
 
三 源程序:(詳見51hei附件)
四 調(diào)試 1) 遇到的問題及解決方法 1. 問題:按鍵有效按一次的時間太短 解決方法:在按鍵的判斷后加delay函數(shù) 2. 問題:按鈕按完之后沒有馬上進(jìn)入main函數(shù)再次判斷 解決方法:在循環(huán)中加入if條件語句判斷按鈕是否按下 3. 問題:LM4299LCD的字顯示過后會有殘余的影像 解決方法:加入清屏函數(shù)在條件的最后進(jìn)行清屏
2) 調(diào)試結(jié)果 實(shí)現(xiàn)了項(xiàng)目要求中的全部控制要求。 還實(shí)現(xiàn)了下述附加功能: 1.加入了LM4299LCD屏來顯示名字和實(shí)訓(xùn)內(nèi)容這些信息 2.在LM4299中顯示按鈕及LED燈的狀態(tài)
五 收獲 更加熟悉Keil及proteus的聯(lián)調(diào)操作,再查找LM4299LCD屏的資料時看到了之前在模板中沒有的清屏函數(shù),更加完善LM4299的模板。更加了解了delay函數(shù)的應(yīng)用及如何改善在循環(huán)函數(shù)中按鈕按下的判斷。
單片機(jī)源程序如下:
- //*****************************************************************************************
- //文件名稱:main.c
- //*****************************************************************************************
- #include <main.h>
- //*****************************************************************************************
- //*****************************************************************************************
- //功能:主函數(shù)
- //*****************************************************************************************
- 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, "班級:物聯(lián)網(wǎng)1601");
- write_lcd(38,0, "學(xué)號:15********");
- write_lcd(56,0, "實(shí)訓(xùn)內(nèi)容:");
- write_lcd(74,0, "按鍵控制多種花樣霓虹燈設(shè)計");
- write_lcd(92,0, "按鈕及LED燈狀態(tài):");
- /*if(a==4) write_lcd(110,0, "按4下:至右而左流水燈循環(huán)");*/
- if(S1==0) {
- delay(1000);
- if(S1==0) {a++;delay(20000);}
- }
- switch(a){
- case 0:P1=0xff;write_lcd(110,0, "初始狀態(tài)");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下:至左而右流水燈循環(huán)");break;
- case 4:case2();write_lcd(110,0, "按4下:至右而左流水燈循環(huán)");break;
- default:a=0;P1=0xff;clear_lcd();break;
- }
- }
- }
復(fù)制代碼LM4229.c
- //*****************************************************************************************
- //文件名稱:LM4229.c
- //*****************************************************************************************
- #include <LM4229.h>
- //*****************************************************************************************
- //*****************************************************************************************
- //功能:延時函數(shù)
- //*****************************************************************************************
- void delay_lcd(uchar t)
- {
- for(;t!=0; t--);
- }
- //*****************************************************************************************
- //功能:寫數(shù)據(jù)函數(shù)
- //*****************************************************************************************
- void write_data(uchar dat)
- {
- CD=0; //數(shù)據(jù)
- CE=0; //LCD使能
- WRIT=0; //寫
- DATA_PORT=dat; //把數(shù)據(jù)送到P口
- delay_lcd(1); //當(dāng)晶振較高時加延時
- WRIT=1; //關(guān)寫
- CE=1; //關(guān)使能
- }
- //*****************************************************************************************
- //功能:寫命令函數(shù)
- //*****************************************************************************************
- void write_com(uchar com)
- {
- CD=1; //命令
- CE=0;
- WRIT=0;
- DATA_PORT=com;
- delay_lcd(1); //當(dāng)晶振較高時加延時
- WRIT=1;
- CE=1;
- }
- //*****************************************************************************************
- //功能:LM4229初始化函數(shù)
- //*****************************************************************************************
- void lcd_init(void)
- {
- // FS1 = 0; //fs1管腳高電平時表示字體為8*6;低電平時為8*8
- // MD2 = 0;
- // HALT = 0;
- write_data(0);
- write_data(0); //圖形首地址
- write_com(0x42); //圖形首地址設(shè)置
- write_data(30);
- write_data(0);
- write_com(0x43); //圖形區(qū)域設(shè)置
- write_com(0x80); //設(shè)置為OR模式
- write_com(0x9a); //關(guān)閉文本顯示,開圖形顯示
- }
- //*****************************************************************************************
- //功能:指定位置、長度清屏
- //*****************************************************************************************
- 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); //設(shè)置
- for(i=0;i<length;i++)
- write_data(0xff); //寫入空格,清屏
- write_com(0xb2); //關(guān)閉自動寫
- }
- //*****************************************************************************************
- //功能:指定位置向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) //字符設(shè)置為16*8
- {
- write_data(place&0xff); //寫入地址高位
- write_data(place/256); //寫入地址低位
- write_com(0x24); //地址設(shè)置
- write_com(0xb0); //設(shè)置數(shù)據(jù)自動寫
- write_data(ASC_MSK[(c1-0x20)*16+k]); //例如:0的ASCII碼為0x30,在ASC_MSK中的位置為0x10*16 ---16字節(jié)字碼依次寫入LCD
- write_com(0xb2); //自動復(fù)位
- place=place+30;
- }
- if(y>28) //y>28時候需要換行
- {
- x=x+16;
- y=0;
- }
- else //否則,不換行,繼續(xù)寫下一個字符
- {
- 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])) //如果漢字在子碼表內(nèi)
- {
- for(k=0;k<16;k++) //字符設(shè)置為16*8
- {
- write_data(place&0xff); //寫入地址高位
- write_data(place/256); //寫入地址低位
- write_com(0x24); //地址設(shè)置
- write_com(0xb0); //設(shè)置數(shù)據(jù)自動寫
- write_data(GB_16[j].Msk[k*2]);
- write_data(GB_16[j].Msk[k*2+1]); //16*16,每行2字節(jié)
- write_com(0xb2); //自動復(fù)位
- place=place+30; //下一行
- }
- }
- else //沒找到對應(yīng)漢字則涂黑
- {
- for(k=0;k<16;k++) //字符設(shè)置為16*8
- {
- write_data(place&0xff); //寫入地址高位
- write_data(place/256); //寫入地址低位
- write_com(0x24); //地址設(shè)置
- write_com(0xb0); //地址設(shè)置
- write_data(0xff);
- write_data(0xff);
- write_com(0xb2); //自動復(fù)位
- place=place+30; //下一行
- }
- }
- if(y>27) //換行
- {
- x+=16;y=0;
- }
- else //不用換行,則下一個字
- {
- y+=2;
- }
- i+=2;
- }
- }
- while(i<length);
- }
- //--------------------------------------------
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
0.png (48.28 KB, 下載次數(shù): 49)
下載附件
2018-5-15 00:53 上傳
所有資料51hei提供下載:
項(xiàng)目一 按鍵控制多種花樣霓虹燈設(shè)計.zip
(506.29 KB, 下載次數(shù): 120)
2018-5-14 16:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|