




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
主講教師任務(wù)4-18路搶答器設(shè)計單片機(jī)控制技術(shù)(C語言版)任務(wù)導(dǎo)入01數(shù)碼管02程序設(shè)計03舉一反三04一、任務(wù)導(dǎo)入PARTONE01任務(wù)要求用8個獨(dú)立式按鍵作為搶答輸入按鍵,序號分別為0~7,當(dāng)某一參賽者首先按下?lián)尨鸢粹o時,在數(shù)碼管上顯示搶答成功的參賽者的序號,此時搶答器不再接受其他輸入信號,直到按下系統(tǒng)復(fù)位按鈕,系統(tǒng)再次接受下一輪的搶答輸入。51單片機(jī)一個數(shù)碼管應(yīng)用靜態(tài)顯示方式,連接到單片機(jī)的P1口。8個按鍵采用獨(dú)立式按鍵接法,連接到單片機(jī)的P0口,每個按鍵都單獨(dú)占用一根I/O端口線。硬件電路二、數(shù)碼管PARTTWO02顯示字符共陽極數(shù)碼管共陰極數(shù)碼管dpgfedcba字型碼dpgfedcba字型碼0110000000xC0001111110x3F1111110010xF9000001100x062101001000xA4010110110x5B3101100000xB0010011110x4F4100110010x99011001100x665100100100x92011011010x6D6100000100x82011111010x7D7111110000xF8000001110x078100000000x80011111110x7F9100100000x90011011110x6F三、程序設(shè)計PARTTHREE03數(shù)組定義和使用switch語句使用數(shù)組存儲顯示數(shù)據(jù)
unsignedcharcodedisp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xbf};//定義數(shù)組led,依次存儲包括0~7和“”的共陽極數(shù)碼管顯示碼表P1=disp[8];//從數(shù)組中取出數(shù)碼管的顯示字符“”數(shù)組定義語句中,關(guān)鍵字“code”是為了把disp[]數(shù)組存儲在片內(nèi)程序存儲器ROM中。軟件設(shè)計思路系統(tǒng)上電時,數(shù)碼管顯示“”,表示開始搶答,當(dāng)記錄到最先按下的按鍵序號后,數(shù)碼管將顯示該參賽者的序號,同時無法再接受其它按鍵的輸入;當(dāng)系統(tǒng)按下復(fù)位按鈕S時,系統(tǒng)顯示“”,表示可以接受新一輪的搶答。程序設(shè)計voidmain()//主函數(shù){unsignedcharbutton;//保存按鍵信息
unsignedcharcodedisp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xbf};//定義數(shù)組led,依次存儲包括0~7和“”的共陽極數(shù)碼管顯示碼表
P0=0xff;//讀引腳狀態(tài),需先置1P1=disp[8];//顯示“”
while(1){ button=P0;//第一次讀按鍵狀態(tài)
delay(1200); //延時消抖
button=P0;//第二次讀按鍵狀態(tài)
switch(button)//根據(jù)按鍵的值進(jìn)行多分支跳轉(zhuǎn)
{ case0xfe:P1=disp[0];delay(10000);while(1);break;//0按下,顯示0,待機(jī)
case0xfd:P1=disp[1];delay(10000);while(1);break;//1按下,顯示1,待機(jī)
case0xfb:P1=disp[2];delay(10000);while(1);break;//2按下,顯示2,待機(jī)
case0xf7:P1=disp[3];delay(10000);while(1);break;//3按下,顯示3,待機(jī)
case0xef:P1=disp[4];delay(10000);while(1);break;//4按下,顯示4,待機(jī)
case0xdf:P1=disp[5];delay(10000);while(1);break;//5按下,顯示5,待機(jī)
case0xbf:P1=disp[6];delay(10000);while(1);break;//6按下,顯示6,待機(jī)
case0x7f:P1=disp[7];delay(10000);while(1);break;//7按下,顯示7,待機(jī)
default:break; } }}四、舉一反三PARTFOUR04(1)4個按鍵,分別代表數(shù)字0、1、2、3;
(2)密碼事先設(shè)定為0~3之間的一位數(shù)字;(3)數(shù)碼管顯示“-”,表示等待密碼輸入;
(4)密碼正確顯示“P”約3s,并通過P3.0端口將鎖打開;否則顯示“E”約3s,繼續(xù)保持鎖定狀態(tài)。設(shè)計具有4個按鍵輸入和1個數(shù)碼管顯示的簡易密碼鎖,具體要求:51單片機(jī)4個按鍵由P0.0~P0.3控制;共陽數(shù)碼管由P1口靜態(tài)控制;由P3.0引腳控制的發(fā)光二極管的亮滅模擬開鎖電路的打開和鎖定。硬件電路密碼設(shè)定為“2”switch語句if……elseif……else程序設(shè)計思路
#include<reg51.h>//包含頭文件reg51.h,定義了51單片機(jī)的專用寄存器sbitP3_0=P3^0; //控制開鎖,用發(fā)光二極管代替程序預(yù)處理unsignedcharbutton; //保存按鍵信息unsignedcharcodetab[7]={0xc0,0xf9,0xa4,0xb,0xbf,0x86,0x8c}; //定義顯示段碼表,分別對應(yīng)顯示字符:0、1、2、3,、E、P定義主程序中的按鍵信息變量以及數(shù)碼管顯示碼表數(shù)組P1=tab[4];//密碼鎖的初始顯示狀態(tài)“”P3_0=1;//設(shè)置密碼鎖初始狀態(tài)為“鎖定”,發(fā)光二極管熄滅密碼鎖開機(jī)初態(tài)設(shè)置讀取P0口即按鍵信息P0=0xff;//讀P0口引腳狀態(tài),需先置全1button=P0;//讀取P0口上的按鍵狀態(tài)并賦值到變量buttondelay(1200);//延時去抖button=P0;//再次讀入按鍵狀態(tài)button&=0x0f;//采用與操作保留低4位的按鍵狀態(tài),其他位清零判斷按鍵信息、控制開鎖switch(button) //判斷按鍵的鍵值{case0x0e:P1=tab[0];delay(10000);P1=tab[5];delay(50000);break; //0#鍵按下,密碼輸入錯誤,顯示“E”case0x0d:P1=tab[1];delay(10000);P1=tab[5];delay(50000);break; //1#鍵按下,密碼輸入錯誤,顯示“E”case0x0b:P1=tab[2];delay(10000);P1=tab[6];P3_0=0;delay(50000);break; //2#鍵按下,密碼正確,開鎖并顯示“P”case0x07:P1=tab[3];delay(10000);P1=tab[5];delay(50000);break; //3#鍵按下,密碼輸入錯誤,顯示“E”}主講教師任務(wù)4-2小型LED數(shù)碼管字符顯示屏控制單片機(jī)控制技術(shù)(C語言版)任務(wù)導(dǎo)入01動態(tài)顯示方式02程序設(shè)計03舉一反三04一、任務(wù)導(dǎo)入PARTONE01任務(wù)要求采用動態(tài)顯示技術(shù)控制6個共陽極數(shù)碼管穩(wěn)定顯示多個字符信息。將6個共陽極數(shù)碼管相應(yīng)的段選控制端并聯(lián)在一起,僅用單片機(jī)的一個并行I/O口控制;將各位數(shù)碼管的公共端,也稱作“位選端”由單片機(jī)的另一個并行I/O口控制;采用動態(tài)顯示方式穩(wěn)定顯示小王的生日1990年12月25日,顯示效果為:901225。74LS245和74LS04用來增強(qiáng)單片機(jī)的端口驅(qū)動能力硬件電路二、動態(tài)顯示方式PARTTWO021.首先,位選口選中第一個數(shù)碼管,段選口送這個數(shù)碼管想要顯示的字型碼,然后延時一段時間;2.其次,位選口選中第二個數(shù)碼管,段選口送出相應(yīng)的字型碼,延時,……3.依次類推,直到位選口選中最后一個數(shù)碼管,段選口送出最后一個數(shù)碼管的字型碼,延時……這樣,一次循環(huán)結(jié)束,每個數(shù)碼管都“輪流”被點(diǎn)亮一次。核心思想:逐位掃描顯示由于人的眼睛存在“視覺駐留效應(yīng)”,如果保證每位數(shù)碼管顯示間斷的時間間隔小于眼睛的駐留時間,就可以給人一種穩(wěn)定顯示的視覺效果。三、程序設(shè)計PARTTHREE03顯示字符901225P2位選碼11111110B11111101B11111011B11110111B11101111B11011111BP1段選碼0x900xc00xf90xa40xa40x926個顯示字符在P2、P1口依次要輸出的數(shù)據(jù)while(1){
P1=0xff;//消隱:關(guān)顯示,共陽極數(shù)碼管0xff熄滅P2=0xfe;//送位碼,選中P2.0連接的數(shù)碼管P1=0x90;//送9的字型碼delay(200);//延時…
P1=0xff;//消隱,關(guān)顯示P2=0xdf;//送位碼,選中P2.5連接的數(shù)碼管P1=0x92;//送5的字型碼delay(200);//延時}順序程序設(shè)計方法for語句for(i=0;i<6;i++){
循環(huán)語句;}voidmain() {unsignedcharled[]={0x90,0xc0,0xf9,0xa4,0xa4,0x92}; //設(shè)置數(shù)字901225字型碼
unsignedchari,w;while(1){w=0xfe; //位選碼初值為0xfefor(i=0;i<6;i++){P1=0xff;//消隱,關(guān)顯示,共陽極數(shù)碼管0xff熄滅P2=w; //位選碼送位選端P2口
w=_crol_(w,1); //位選碼左移一位,選中下一位LEDP1=led[i];//顯示字型碼并送P1口
delay(100); //延時
}}}循環(huán)移位位選碼程序設(shè)計方法四、舉一反三PARTFOUR04
用動態(tài)顯示方式顯示第一屏學(xué)號:125315延時一段時間穩(wěn)定地顯示學(xué)號用動態(tài)顯示方式顯示第二屏生日:901225延時一段時間穩(wěn)定地顯示生日
重復(fù)動態(tài)顯示學(xué)號、延時、生日是……用6個數(shù)碼管以多屏方式交替顯示小王的學(xué)號“125315”和生日“901225”。具體要求:舉一反三1for語句多重for循環(huán)for語句循環(huán)的嵌套軟件設(shè)計思路voiddisp3(){
unsignedcharlednum[2][6]={{0x90,0xc0,0xf9,0xa4,0xa4,0x92},{0xf9,0xa4,0x92,0xb0,0xf9,0x92}};//二維數(shù)組存儲910812、102315的字型碼
unsignedcharcom[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//一維數(shù)組存儲位選碼unsignedchari,j,num;for(num=0;num<2;num++)//顯示兩屏字符for(j=0;j<100;j++)//循環(huán)顯示一屏字符100次,達(dá)到延時穩(wěn)定顯示作用for(i=0;i<6;i++)
//動態(tài)顯示6個字符{P1=0xff;//消隱,關(guān)顯示P2=com[i];//位選碼送位控制口P2口
P1=lednum[num][i];//顯示字型碼送P1口
delay(100); //延時
}}實用移動顯示廣告屏設(shè)計。要求:單片機(jī)控制6個數(shù)碼管由右往左以移動顯示方式顯示“HELLO”字樣。舉一反三2for語句多重for循環(huán)實質(zhì)是依次顯示6屏移位后的顯示內(nèi)容,就可以達(dá)到移動顯示的效果。HEHLEHLLEHOLLEH第1屏第2屏第3屏第4屏第5屏OLLEHH第6屏第1屏軟件設(shè)計思路每屏顯示數(shù)據(jù)之間對應(yīng)一定的排列順序,下面將6屏將要出現(xiàn)的顯示字符按順序排列如下:×××××HELLO×;//×表示無顯示第1屏顯示的六位字符為“×××××H”,第2屏顯示的六位字符為“××××HE”,依次類推,第6屏顯示字符為“HELLO×”。voiddisp3(){
unsignedcharledmove[]={0xff,0xff,0xff,0xff,0xff,0x89,0x86,0xc7,0xc7,0xc0,0xff};//存儲移動字符XXXXXHELLOX的字型碼
unsignedcharcom[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//存儲位選碼unsignedchari,j,num;for(num=0;num<6;num++)//顯示6屏字符for(j=0;j<100;j++)//循環(huán)顯示一屏字符100次,達(dá)到穩(wěn)定顯示作用for(i=0;i<6;i++){P1=0xff;//消隱,關(guān)顯示P2=com[i];//位選碼送位控制口P2口
P1=ledmove[num+i];//顯示字型碼送P1口
delay(100);//延時
}}判斷按鍵并累加次數(shù)根據(jù)次數(shù)進(jìn)行跳轉(zhuǎn)判斷按鍵是否彈起程序設(shè)計思路
if(K==0) //第一次判斷有鍵按下{delay(1200);//延時消除抖動if(K==0)//再次判斷有鍵按下{if(++i==5)i=1;//i增1,且增加到5后,再重新賦值1}}判斷按鍵并累加次數(shù)根據(jù)次數(shù)進(jìn)行跳轉(zhuǎn)switch(i)//根據(jù)i的值顯示不同模式{case1:P1=0x00;break;//i=1顯示第1種模式
case2:P1=0x55;break;//i=2顯示第2種模式case3:P1=0x0f;break;//i=3顯示第3種模式case4:P1=0xf0;break;//i=4顯示第4種模式
default:break;}判斷按鍵是否彈起while(!K);//等待K鍵釋放,!為邏輯非操作delay(1200);//延時消除抖動主講教師任務(wù)4-3LED點(diǎn)陣式電子廣告牌控制單片機(jī)控制技術(shù)(C語言版)任務(wù)導(dǎo)入018x8LED點(diǎn)陣顯示模塊02程序設(shè)計03舉一反三04一、任務(wù)導(dǎo)入PARTONE01用單片機(jī)控制一塊8×8LED點(diǎn)陣式電子廣告牌,將一些特定的文字或圖形以特定的方式顯示出來。要求:在8×8LED點(diǎn)陣廣告牌上穩(wěn)定顯示“0”。任務(wù)要求單片機(jī)通過74LS245與LED連接,提高端口輸出的電流,既可保證了LED的亮度,還可保護(hù)單片機(jī)端口引腳。硬件電路二、8x8LED點(diǎn)陣顯示模塊PARTTWO02三、程序設(shè)計PARTTHREE03動態(tài)掃描編程軟件設(shè)計思路00000001B,即0x0100000010B,即0x0200000100B,即0x0400001000B,即0x0800010000B,即0x1000100000B,即0x2001000000B,即0x4010000000B,即0x8011100111B,即0xE711011011B,即0xDB11011011B,即0xDB11011011B,即0xDB11011011B,即0xDB11011011B,即0xDB11011011B,即0xDB11100111B,即0xE7while(1){P1=0x01;//掃描顯示第1行
P0=0xE7;//送第一行列數(shù)據(jù)幀
delay(100);P1=0x02;//掃描顯示第2行
P0=0xDB;//送第二行列數(shù)據(jù)幀
delay(100);P1=0x04;//掃描顯示第3行
P0=0xDB;//送第三行列數(shù)據(jù)幀
delay(100);P1=0x08;//掃描顯示第4行
P0=0xDB;//送第四行列數(shù)據(jù)幀
delay(100);P1=0x10;//掃描顯示第5行
P0=0xDB;//送第五行列數(shù)據(jù)幀
delay(100);P1=0x20;//掃描顯示第6行
P0=0xDB;//送第六行列數(shù)據(jù)幀
delay(100);P1=0x40;//掃描顯示第7行
P0=0xDB;//送第七行列數(shù)據(jù)幀
delay(100);P1=0x80;//掃描顯示第8行
P0=0xE7;//送第八行列數(shù)據(jù)幀
delay(100);}
逐行掃描法的順序程序設(shè)計unsignedcharcodeled[]={0xE7,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xE7};//“0”的字型顯示碼unsignedcharw,i;while(1){w=0x01;//行初值為0x01for(i=0;i<8;i++){P1=w;//行數(shù)據(jù)送P1口
P0=led[i];//列數(shù)據(jù)幀送P0口
delay(100);w<<=1;//行變量左移指向下一行
}}逐行掃描法的循環(huán)程序設(shè)計四、舉一反三PARTFOUR04在8×8點(diǎn)陣LED上循環(huán)顯示數(shù)字0~9,具體要求:舉一反三1要顯示的數(shù)字0~9分成10屏輪流顯示在8×8點(diǎn)陣LED上。第一屏行掃描顯示0,延時穩(wěn)定顯示;然后第二屏行掃描顯示1,延時穩(wěn)定顯示;……最后行掃描顯示9,延時穩(wěn)定顯示。循環(huán)以上過程。
動態(tài)掃描編程循環(huán)嵌套多個字符的顯示程序可以在一個字符顯示程序的基礎(chǔ)上再外嵌套一個循環(huán)。用二維數(shù)組存儲顯示數(shù)字0~9。unsignedcharcodeled[10][8]={{0xE7,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xE7},//0{0xFF,0xE7,0xE3,0xE7,0xE7,0xE7,0xE7,0xE7}, //1
{0xFF,0xE1,0xCF,0xCF,0xE3,0xF9,0xF9,0xC1}, //2{0xFF,0xE1,0xCF,0xCF,0xE3,0xCF,0xCF,0xE1}, //3{0xFF,0xCF,0xC7,0xCB,0xCD,0xC1,0xCF,0xCF}, //4{0xFF,0xE1,0xFD,0xE1,0xCF,0xCF,0xCF,0xE1}, //5{0xFF,0xE3,0xF9,0xE1,0xC9,0xC9,0xC9,0xE3}, //6
{0xFF,0xC0,0xCF,0xE7,0xE7,0xF3,0xF3,0xF3}, //7{0xFF,0xE3,0xC9,0xC9,0xE3,0xC9,0xC9,0xE3}, //8{0xFF,0xEC,0xC9,0xC9,0xC9,0xC3,0xCF,0xE3}}; //9
軟件設(shè)計思路unsignedcharw;unsignedintj,k,m;while(1){for(k=0;k<10;k++) //第一維下標(biāo)取值范圍為0~9{for(m=0;m<200;m++)//每個字符掃描顯示200次,控制每個字符顯示時間{
w=0x01;for(j=0;j<8;j++) //第二維下標(biāo)取值范圍為0~7{P1=w; //行控制
P0=led[k][j]; //將指定數(shù)組元素賦值給P0口,顯示碼
delay(100);w<<=1;}}}}使用4個8×8點(diǎn)陣LED顯示屏擴(kuò)展設(shè)計一個16×16的LED點(diǎn)陣式電子廣告牌,循環(huán)顯示“單片機(jī)”字樣。舉一反三2若干個8×8LED點(diǎn)陣顯示模塊進(jìn)行簡單地拼裝,可以構(gòu)成各種尺寸的大屏幕顯示屏,如16×16、32×32、64×16、128×32等點(diǎn)陣尺寸。4/16線譯碼器74LS154:擴(kuò)充行選端口移位寄存器74HC595:擴(kuò)充列線端口硬件設(shè)計引腳編號引腳名引腳定義功能1、2、3、4、5、6、7、15QA~QH并行三態(tài)輸出管腳8GND電源地9SQH串行數(shù)據(jù)輸出管腳10SCLR移位寄存器清零端11SCK數(shù)據(jù)輸入時鐘線12RCK輸出存儲器鎖存時鐘線13OE輸出使能14SI串行數(shù)據(jù)輸入端15VCC電源端74HC595串入并出移位寄存器輸入引腳輸出引腳SISCKSCLRRCKOEXXXXHQA—QH輸出高阻XXXXLQA—QH輸出有效值XXLXX移位寄存器清零L上升沿HXX移位寄存器存儲LH上升沿HXX移位寄存器存儲HX下降沿HXX移位寄存器狀態(tài)保持XXX上升沿X輸出存儲器鎖存移位寄存器中的狀態(tài)值XXX下降沿X輸出存儲器狀態(tài)保持真值表工作時序
for(i=0;i<8;i++)//8位控制
{SCK=0;//給串行移位時鐘送低電平
if((data1&0x80)==0x80)//數(shù)據(jù)data的最高位為1,則向SDATA_595發(fā)送1 SI=1;//發(fā)出數(shù)據(jù)的最高位else//數(shù)據(jù)data的最高位為0,則向SDATA_595發(fā)送0 SI=0;data1<<=1;//下一位串行數(shù)據(jù)移位到最高位
SCK=1;//給串行移位時鐘送高電平,產(chǎn)生上升沿
}8位數(shù)據(jù)逐位移入74HC595595串入并出過程①將數(shù)據(jù)逐位移入74HC595,即數(shù)據(jù)串入;②并行輸出數(shù)據(jù),即數(shù)據(jù)并出。軟件設(shè)計思路#include<reg51.h>//包含頭文件reg51.h,定義51單片機(jī)的專用寄存器#include<intrins.h>#defineNUM3//換屏數(shù)#defineROW_SELP1//行選譯碼器輸入端口連接P1的低4位sbitSI=P2^1;//列驅(qū)動移位寄存器串行輸入數(shù)據(jù)端口連接P2.1sbitSCK=P2^0;//列驅(qū)動移位寄存器串行輸入數(shù)據(jù)時鐘端口連接P2.0sbitRCK=P1^6;//列驅(qū)動輸出鎖存器時鐘信號端口連接P1.6sbitSCLR=P1^5;//列驅(qū)動移位寄存器清0端口連接P1.5sbitG=P1^7;//行選譯碼器控制端口連接P1.7unsignedcharcodescreen[3][32]={//字模表,文字點(diǎn)陣:寬×高=16×16{0xF7,0xDF,0xF9,0xCF,0xFB,0xBF,0xC0,0x07,0xDE,0xF7,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,0xC0,0x07,0xDE,0xF7,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF},//單{0xFF,0xBF,0xEF,0xBF,0xEF,0xBF,0xEF,0xBB,0xE0,0x01,0xEF,0xFF,0xEF,0xFF,0xEF,0xFF,0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xDF,0xEF,0xDF,0xEF,0xBF,0xEF,0x7F,0xEF},//片{0xEF,0xFF,0xEF,0x07,0xEF,0x77,0x01,0x77,0xEF,0x77,0xEF,0x77,0xC7,0x77,0xCB,0x77,0xAB,0x77,0xAF,0x77,0x6E,0xF7,0xEE,0xF5,0xED,0xF5,0xED,0xF5,0xEB,0xF9,0xEF,0xFF}//機(jī)}; //用二維數(shù)組存儲每屏要顯示的點(diǎn)陣圖案程序預(yù)處理字模提取voidmain()//主函數(shù){unsignedinti,j,k;unsignedcharr_sel;//定義行選碼變量while(1){for(i=0;i<NUM;i++)//循環(huán)換屏{for(j=0;j<10000;j++)//每屏顯示刷新10000次,控制每屏顯示時間
{for(k=0;k<16;k++)//循環(huán)掃描16行
{col_data(i,k);//串入第i屏的第k行的列數(shù)據(jù)G=1;//關(guān)閉行選譯碼器out_data();//第k行16位列數(shù)據(jù)送輸出鎖存器r_sel=ROW_SEL&0xF0+k;//掃描選擇第k行;G=0;//啟動行選
}}}}}//函數(shù):串入16位的列線數(shù)據(jù)voidcol_data(unsignedints,unsignedintr){unsignedchari,data1;data1=screen[s][2*r];//取第1個列數(shù)據(jù)
for(i=0;i<8;i++)//串入第一個字節(jié)
{SCK=0;//給串行移位時鐘送低電平
if((data1&0x80)==0x80)//最高位為1,則向SDATA_595發(fā)送1 SI=1;//發(fā)出數(shù)據(jù)的最高位else SI=0;data1<<=1;//下一位串行數(shù)據(jù)移位到最高位
SCK=1;//給串行移位時鐘送高電平,產(chǎn)生上升沿
}data1=screen[s][2*r+1];//取第2個列數(shù)據(jù)
for(i=0;i<8;i++)//串入第二個字節(jié)
{SCK=0;//給串行移位時鐘送低電平
if((data1&0x80)==0x80)//最高位為1,則向SDATA_595發(fā)送1 SI=1;//發(fā)出數(shù)據(jù)的最高位
else SI=0;data1<<=1;//下一位串行數(shù)據(jù)移位到最高位
SCK=1;//給串行移位時鐘送高電平,產(chǎn)生上升沿
}}//函數(shù):16位的列線數(shù)據(jù)并行輸出到輸出鎖存器voidout_data(){RCK=0;//輸出鎖存器時鐘置低電平_nop_();_nop_();RCK=1;//輸出鎖存器時鐘置高電平,產(chǎn)生上升沿鎖存數(shù)據(jù)}主講教師任務(wù)4-4字符型LCD液晶顯示廣告牌控制單片機(jī)控制技術(shù)(C語言版)任務(wù)導(dǎo)入011602LCD字符顯示模塊02程序設(shè)計03舉一反三04一、任務(wù)導(dǎo)入PARTONE01用單片機(jī)控制LCD1602液晶模塊,在第1行正中間顯示“SHENZHEN”字符串。任務(wù)要求硬件電路二、1602LCD字符顯示模塊PARTTWO02
12345678910111213141516LCD模塊VSSVDDVODB0DB1DB3DB2DB5DB4DB7DB6AKRSR/WE數(shù)據(jù)線電源接線背光控制線讀寫控制線RSR/W操作00寫命令操作(初始化、光標(biāo)定位等)01讀狀態(tài)操作(讀忙標(biāo)志)10寫數(shù)據(jù)操作(要顯示的內(nèi)容)11讀數(shù)據(jù)操作(可以把顯示存儲區(qū)中的數(shù)據(jù)反讀出來)字符型LCD1602的基本操作編號指令名稱控制信號命令字D7D6D5D4D3D2D1D01清屏00000000012歸位home000000001×3輸入方式設(shè)置00000001I/DS4顯示狀態(tài)設(shè)置0000001DCB5光標(biāo)畫面滾動000001S/CR/L××6工作方式設(shè)置00001DLNF××7CGRAM地址設(shè)置0001A5A4A3A2A1A08DDRAM地址設(shè)置001A6A5A4A3A2A1A09讀BF和AC01BFAC6AC5AC4AC3AC2AC1AC01602LCD的命令字LCD初始化//lcd初始化
void
lcd_init(){
lcd_w_cmd(0x3c);//設(shè)置工作方式
lcd_w_cmd(0x0e);//設(shè)置光標(biāo)
lcd_w_cmd(0x01);//清屏
lcd_w_cmd(0x06);//設(shè)置輸入方式}RS=0;R/W=1;E:正脈沖//讀狀態(tài)函數(shù)unsignedcharlcd_r_start()//8位數(shù)據(jù)線連接方式{unsignedchars;RW=1; //RW=1,RS=0,讀LCD狀態(tài)
delayus();RS=0;
delayus();E=1; //E端時序
delayus();
s=LCD_DB; //從LCD的數(shù)據(jù)口讀狀態(tài)
delayus();E=0;
delayus();RW=0;
delayus();
return(s); //返回讀取的LCD狀態(tài)字}D7D6D5D4D3D2D1D0BFBF=1:表示LCD正在忙
BF=0:表示LCD不忙i=lcd_r_start();//調(diào)用讀狀態(tài)函數(shù),讀取LCD狀態(tài)字//寫命令操作函數(shù)voidlcd_w_cmd(unsignedcharcom)//8位數(shù)據(jù)線連接方式{unsignedchari;
do{//查LCD忙操作
i=lcd_r_start();//調(diào)用讀狀態(tài)字函數(shù)
i=i&0x80;//與操作屏蔽掉低7位
delayms(1);}while(i!=0);//LCD忙,繼續(xù)查詢,否則退出循環(huán)
RW=0;delayus();RS=0;
//RW=0,RS=0,寫LCD命令字
delayus();E=1;
//E端時序
delayus();LCD_DB=com; //將com中的命令字寫入LCD數(shù)據(jù)口
delayus();E=0;delayus();RW=1;delayms(50);}RS=0;R/W=0;E:正脈沖RS=1;R/W=0;E:正脈沖//寫數(shù)據(jù)函數(shù)voidlcd_w_dat(unsignedchardat)//8位數(shù)據(jù)線連接方式{unsignedchari;
do{//查LCD忙操作
i=lcd_r_start(); //調(diào)用讀狀態(tài)字函數(shù)
i=i&0x80;//與操作屏蔽掉低7位
delayms(1);}while(i!=0); CD忙,繼續(xù)查詢,否則退出循環(huán)
RW=0;delayus();RS=1; //RW=0,RS=1,寫LCD數(shù)據(jù)
delayus();E=1; //E端時序
delayus();LCD_DB=dat; //將com中的命令字寫入LCD數(shù)據(jù)口
delayus();E=0;delayus();RW=1;delayms(50);}
列行123456789101112131415161808182838485868788898A8B8C8D8E8F2C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF光標(biāo)位置與相應(yīng)命令字(1)表中命令字以十六進(jìn)制形式給出,該命令字就是與LCD顯示位置相對應(yīng)的DDRAM地址。(2)第一行和第二行的命令字是不連續(xù)的。lcd_w_cmd(0x84);//光標(biāo)定位在第1行第5列三、程序設(shè)計PARTTHREE03#include<reg51.h>//包含頭文件reg51.h,定義了51單片機(jī)的專用寄存器#include<intrins.h>//包含頭文件intrins.h,代碼中引用了_nop_()函數(shù)//定義控制信號端口sbitRS=0xb0; //P3.0sbitRW=0xb1; //P3.1sbitE=0xb2; //P3.2程序預(yù)處理//主函數(shù)voidmain() {unsignedcharlcd[]="SHENZHEN";unsignedchari;P1=0xff; //送全1到P0口
lcd_int(); //初始化LCDdelay(255);lcd_w_cmd(0x83); //設(shè)置顯示位置
delay(255);for(i=0;lcd[i]!='\0';i++) //顯示字符串,字符串結(jié)束符為’\0’
{lcd_w_dat(lcd[i]);delay(200);}while(1); //原地踏步,待機(jī)命令}四、舉一反三PARTFOUR04在1602LCD的第1行第2列顯示“工人”
LCD標(biāo)準(zhǔn)字庫1602LCD模塊的標(biāo)準(zhǔn)字庫表中沒有中文字符!利用1602LCD模塊字符發(fā)生存儲器CGRAM可以自編8個5×8字符。自編字符的命令字:A7A6A5A4A3A2A1A001AC5AC4AC3AC2AC1AC0(1)A7A6=01:CGRAM地址設(shè)置的命令字。(2)A5A4A3:與自編字符的DDRAM數(shù)據(jù)相對應(yīng)的字符代碼。若A5A4A3=“000”,則該字符寫入DDRAM的代碼為00,若A5A4A3=“001”,則該字符寫入DDRAM的代碼為01,依次類推。(3)A2A1A0:與CGRAM字模的8行相對應(yīng)。當(dāng)A2A1A0=“000”時,寫入第1行的字模碼,當(dāng)A2A1A0=“001”時,寫入第2行的字模碼,依次類推。按照CGRAM地址和數(shù)據(jù)自編5x7字模自編字庫lcd_w_cmd(0x40);//寫入第1行CGRAM地址lcd_w_dat(0x1f);//寫入第1行CGRAM數(shù)據(jù)自編5x7的字“工”字模和“人”字模軟件設(shè)計思路//在CGRAM中建立“工”字字模voidGONG_ZI(){
lcd_w_cmd(0x40); //寫入第1行CGRAM地址
lcd_w_dat(0x1f); //寫入第1行CGRAM數(shù)據(jù)
lcd_w_cmd(0x41); //寫入第2行CGRAM地址
lcd_w_dat(0x1f); //寫入第2行CGRAM數(shù)據(jù)
lcd_w_cmd(0x42); //寫入第3行CGRAM地址
lcd_w_dat(0x04); //寫入第3行CGRAM數(shù)據(jù)
lcd_w_cmd(0x43); //寫入第4行CGRAM地址
lcd_w_dat(0x04); //寫入第4行CGRAM數(shù)據(jù)
lcd_w_cmd(0x44); //寫入第5行CGRAM地址
lcd_w_dat(0x04); //寫入第5行CGRAM數(shù)據(jù)
lcd_w_cmd(0x45); //寫入第6行CGRAM地址
lcd_w_dat(0x1f); //寫入第6行CGRAM數(shù)據(jù)
lcd_w_cmd(0x46);//寫入第7行CGRAM地址
lcd_w_dat(0x1f); //寫入第7行CGRAM數(shù)據(jù)
lcd_w_cmd(0x47); //寫入第8行CGRAM地址
lcd_w_dat(0x00); //寫入第8行CGRAM數(shù)據(jù)}//在CGRAM中建立“人”字字模voidREN_ZI(){
lcd_w_cmd(0x48);//寫入第1行CGRAM地址
lcd_w_dat(0x00); //寫入第1行CGRAM數(shù)據(jù)
lcd_w_cmd(0x49);//寫入第2行CGRAM地址
lcd_w_dat(0x04); //寫入第2行CGRAM數(shù)據(jù)
lcd_w_cmd(0x4A);//寫入第3行CGRAM地址
lcd_w_dat(0x04); //寫入第3行CGRAM數(shù)據(jù)
lcd_w_cmd(0x4B);//寫入第4行CGRAM地址
lcd_w_dat(0x0A); //寫入第4行CGRAM數(shù)據(jù)
lcd_w_cmd(0x4C);//寫入第5行CGRAM地址
lcd_w_dat(0x0A); //寫入第5行CGRAM數(shù)據(jù)
lcd_w_cmd(0x4D);//寫入第6行CGRAM地址
lcd_w_dat(0x11); //寫入第6行CGRAM數(shù)據(jù)
lcd_w_cmd(0x4E);//寫入第7行CGRAM地址
lcd_w_dat(0x11); //寫入第7行CGRAM數(shù)據(jù)
lcd_w_cmd(0x4F); //寫入第8行CGRAM地址
lcd_w_dat(0x00); //寫入第8行CGRAM數(shù)據(jù)}判斷按鍵并累加次數(shù)根據(jù)次數(shù)進(jìn)行跳轉(zhuǎn)判斷按鍵是否彈起voidmain() //主函數(shù){P1=0xff;//送全1到P0口
lcd_int(); //初始化LCDdelay(255);GONG_ZI();//調(diào)用“工”字建模函數(shù)
REN_ZI();//調(diào)用“人”字建模函數(shù)
lcd_w_cmd(0x81); //設(shè)置顯示位置
lcd_w_dat(0x00); //顯示“工”lcd_w_dat(0x01);//顯示“人”
while(1); //待機(jī)}主講教師任務(wù)4-5密碼鎖設(shè)計單片機(jī)控制技術(shù)(C語言版)任務(wù)導(dǎo)入01矩陣鍵盤02程序設(shè)計03舉一反三04一、任務(wù)導(dǎo)入PARTONE01設(shè)計具有16個按鍵和1個數(shù)碼管顯示的密碼鎖,具體要求:輸入一位密碼(為0~9,A~F之間的數(shù)字),密碼輸入正確顯示“P”并將鎖打開;否則顯示“E”,繼續(xù)保持鎖定狀態(tài)。任務(wù)要求共陽數(shù)碼管顯示搶答器的狀態(tài)信息;16個按鍵連接成4×4矩陣鍵盤方式;連接P3.0的發(fā)光二極管的亮滅表示開鎖或關(guān)鎖狀態(tài)。硬件電路二、矩陣鍵盤PARTTWO024×4矩陣鍵盤四行四列01230123行線列線4×4矩陣鍵盤01230123行線列線單片機(jī)+VCC4x4矩陣鍵盤將16根獨(dú)立連接的控制線減少到只需要8根控制線,即4根行線、4根列線如何識別矩陣式鍵盤中的按鍵?識別按鍵一般應(yīng)包括以下內(nèi)容:(1)判別有無鍵按下。(2)鍵盤掃描取得閉合鍵的行、列號。(3)用計算法或查表法得到鍵值。(4)判斷閉合鍵是否釋放,如沒釋放則繼續(xù)等待。(5)將閉合鍵的鍵值保存,同時轉(zhuǎn)去執(zhí)行該閉合鍵的功能。逐列掃描法行列反轉(zhuǎn)法01230123行線列線+VCC1K×4逐列掃描法輸出-列線輸入-行線P0.0P0.1P0.2P0.3P2.0P2.1P2.2P2.3是否有鍵按下;
判斷具體按鍵;第一步,先來判斷是否有鍵按下,向P2.0到P2.3的四條列線全部輸出低電平,讀入P0.0-P0.3四條行線的信號01230123行線列線+VCC是否有鍵按下;
判斷具體按鍵;逐列掃描法:1K×4輸出輸入00000000S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S15信號讀入P2.0P2.1P2.2P2.3P0.0P0.1P0.2P0.3P0.3P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P2.1P0.2P0.0P0.3P2.3P2.1P0.2P0.0P0.3P2.0P2.3P2.1P0.2P0.0P0.3當(dāng)所有的按鍵都沒有被按下時,p0.0到P0.3讀入的行電平都為高。01230123行線列線+VCC1K×4輸出輸入0000無鍵按下1111S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S15是否有鍵按下;
判斷具體按鍵;逐列掃描法:P0.0P0.1P0.2P0.3P0.3P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P2.0P2.1P2.2P2.3P2.1P2.3P2.1P2.0P2.3P2.1有鍵按下,例如這個9#鍵按下,這個鍵所在的2#行線與1#列線導(dǎo)通,讀入的P0.2行電平為低。01230123行線列線+VCC是否有鍵按下;
判斷具體按鍵;逐列掃描法:1K×4輸出輸入000011110S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S15P2.0P2.1P2.2P2.3P2.1P2.3P2.1P2.0P2.3P2.1P0.0P0.1P0.2P0.3P0.3P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.301230123行線列線+VCC是否有鍵按下;
判斷具體按鍵;逐列掃描法:1K×4輸出輸入000011110行電平不全為高→有鍵按下S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S15P0.0P0.1P0.2P0.3P0.3P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P2.0P2.1P2.2P2.3P2.1P2.3P2.1P2.0P2.3P2.1第二步,判斷到底是哪一個鍵按下。01230123行線列線+VCC
是否有鍵按下;
判斷具體按鍵;逐列掃描法:1K×4輸出輸入00001101行電平不全為高→有鍵按下S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S15P0.0P0.1P0.2P0.3P0.3P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P2.0P2.1P2.2P2.3P2.1P2.3P2.1P2.0P2.3P2.1逐列掃描:具體方法是,先給第0列輸出低電平“0”,其他三列都為高電平“1”。讀入行電平,判斷第一列四個按鍵的狀態(tài)。01230123行線列線+VCC
是否有鍵按下;
判斷具體按鍵;逐列掃描法:1K×4輸出輸入11101101行電平不全為高→有鍵按下S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S15P0.0P0.1P0.2P0.3P0.3P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P2.0P2.1P2.2P2.3P2.1P2.3P2.1P2.0P2.3P2.1送第1列為低電平“0”,其他三列為高電平,進(jìn)行第一列4個按鍵是否按下的判斷。01230123行線列線+VCC
是否有鍵按下;
判斷具體按鍵;逐列掃描法:1K×4輸出輸入1101行電平不全為高→有鍵按下S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S15P0.0P0.1P0.2P0.3P0.3P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P0.2P0.0P0.3P2.0P2.1P2.2P2.3P2.1P2.3P2.1P2.0P2.3P2.1送第2列為低電平“0”,
其他三列為高電平,進(jìn)行第2列4個按鍵是否按下的判斷。01230123行線列線+VCC
是否有鍵按下;
判斷具體按鍵;逐列掃描法:1K×4輸出輸入1011行電平不全為高→有鍵按下S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S15P0.0P0.1P0.2P0.3P0.3P0.0P0.3P0.2P0.0P0.3P0.2P0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 葡萄酒旅游與產(chǎn)區(qū)特色考核試卷
- 外貿(mào)英文口語第8章課件
- 吉林省長春市汽車經(jīng)濟(jì)開發(fā)區(qū)2025年數(shù)學(xué)四年級第二學(xué)期期末預(yù)測試題含解析
- 天津市河西區(qū)實驗中學(xué)2024-2025學(xué)年高三第一次模擬(期末)考試化學(xué)試題試卷含解析
- 婁底幼兒師范高等??茖W(xué)?!吨型馕幕涣魇贰?023-2024學(xué)年第二學(xué)期期末試卷
- 山西運(yùn)城農(nóng)業(yè)職業(yè)技術(shù)學(xué)院《專業(yè)英語(電控)》2023-2024學(xué)年第一學(xué)期期末試卷
- 蘇州城市學(xué)院《檢測技術(shù)及控制工程》2023-2024學(xué)年第二學(xué)期期末試卷
- 烏蘭察布醫(yī)學(xué)高等專科學(xué)?!洞髮W(xué)寫作》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東省蒙陰一中2024-2025學(xué)年高三下學(xué)期適應(yīng)性考試物理試題(文理)試題含解析
- 閩南師范大學(xué)《流行合唱與指揮藝術(shù)(2)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025南寧輔警考試題庫
- 智慧樹知到《中國城市建設(shè)史(西安工業(yè)大學(xué))》2025章節(jié)測試附答案
- 遇見成長 與數(shù)同行-小學(xué)生主題班會四年級數(shù)學(xué)家長會發(fā)言
- 學(xué)校“1530”安全教育記錄表(2024年秋季全學(xué)期)
- 私立醫(yī)院重點(diǎn)??瓢l(fā)展策略
- 內(nèi)膜癌病例討論
- 第24課《蛟龍?zhí)胶!氛n件
- 新農(nóng)村太陽能路燈照明設(shè)計方案
- 計算機(jī)網(wǎng)絡(luò)安全畢業(yè)答辯
- 帶貨主播經(jīng)紀(jì)合同范本3篇
- 裝飾裝修方案
評論
0/150
提交評論