四 調(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ī)源程序如下:
- //*****************************************************************************************
- //文件名稱: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, "班級(jí):物聯(lián)網(wǎng)1601");
- write_lcd(38,0, "學(xué)號(hào):15********");
- write_lcd(56,0, "實(shí)訓(xùn)內(nèi)容:");
- write_lcd(74,0, "按鍵控制多種花樣霓虹燈設(shè)計(jì)");
- 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í)函數(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)晶振較高時(shí)加延時(shí)
- 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)晶振較高時(shí)加延時(shí)
- WRIT=1;
- CE=1;
- }
- //*****************************************************************************************
- //功能:LM4229初始化函數(shù)
- //*****************************************************************************************
- void lcd_init(void)
- {
- // FS1 = 0; //fs1管腳高電平時(shí)表示字體為8*6;低電平時(shí)為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)閉文本顯示,開圖形顯示
- }
- //*****************************************************************************************
- //功能:指定位置、長(zhǎng)度清屏
- //*****************************************************************************************
- 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)閉自動(dòng)寫
- }
- //*****************************************************************************************
- //功能:指定位置向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ù)自動(dòng)寫
- write_data(ASC_MSK[(c1-0x20)*16+k]); //例如:0的ASCII碼為0x30,在ASC_MSK中的位置為0x10*16 ---16字節(jié)字碼依次寫入LCD
- write_com(0xb2); //自動(dòng)復(fù)位
- place=place+30;
- }
- if(y>28) //y>28時(shí)候需要換行
- {
- x=x+16;
- y=0;
- }
- else //否則,不換行,繼續(xù)寫下一個(gè)字符
- {
- 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ù)自動(dòng)寫
- write_data(GB_16[j].Msk[k*2]);
- write_data(GB_16[j].Msk[k*2+1]); //16*16,每行2字節(jié)
- write_com(0xb2); //自動(dòng)復(fù)位
- place=place+30; //下一行
- }
- }
- else //沒找到對(duì)應(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); //自動(dòng)復(fù)位
- place=place+30; //下一行
- }
- }
- if(y>27) //換行
- {
- x+=16;y=0;
- }
- else //不用換行,則下一個(gè)字
- {
- y+=2;
- }
- i+=2;
- }
- }
- while(i<length);
- }
- //--------------------------------------------
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (48.28 KB, 下載次數(shù): 49)
下載附件
2018-5-15 00:53 上傳
所有資料51hei提供下載:
項(xiàng)目一 按鍵控制多種花樣霓虹燈設(shè)計(jì).zip
(506.29 KB, 下載次數(shù): 120)
2018-5-14 16:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5