《單片機控制技術》課件-任務4_第1頁
《單片機控制技術》課件-任務4_第2頁
《單片機控制技術》課件-任務4_第3頁
《單片機控制技術》課件-任務4_第4頁
《單片機控制技術》課件-任務4_第5頁
已閱讀5頁,還剩136頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

主講教師任務4-18路搶答器設計單片機控制技術(C語言版)任務導入01數碼管02程序設計03舉一反三04一、任務導入PARTONE01任務要求用8個獨立式按鍵作為搶答輸入按鍵,序號分別為0~7,當某一參賽者首先按下搶答按鈕時,在數碼管上顯示搶答成功的參賽者的序號,此時搶答器不再接受其他輸入信號,直到按下系統復位按鈕,系統再次接受下一輪的搶答輸入。51單片機一個數碼管應用靜態顯示方式,連接到單片機的P1口。8個按鍵采用獨立式按鍵接法,連接到單片機的P0口,每個按鍵都單獨占用一根I/O端口線。硬件電路二、數碼管PARTTWO02顯示字符共陽極數碼管共陰極數碼管dpgfedcba字型碼dpgfedcba字型碼0110000000xC0001111110x3F1111110010xF9000001100x062101001000xA4010110110x5B3101100000xB0010011110x4F4100110010x99011001100x665100100100x92011011010x6D6100000100x82011111010x7D7111110000xF8000001110x078100000000x80011111110x7F9100100000x90011011110x6F三、程序設計PARTTHREE03數組定義和使用switch語句使用數組存儲顯示數據

unsignedcharcodedisp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xbf};//定義數組led,依次存儲包括0~7和“”的共陽極數碼管顯示碼表P1=disp[8];//從數組中取出數碼管的顯示字符“”數組定義語句中,關鍵字“code”是為了把disp[]數組存儲在片內程序存儲器ROM中。軟件設計思路系統上電時,數碼管顯示“”,表示開始搶答,當記錄到最先按下的按鍵序號后,數碼管將顯示該參賽者的序號,同時無法再接受其它按鍵的輸入;當系統按下復位按鈕S時,系統顯示“”,表示可以接受新一輪的搶答。程序設計voidmain()//主函數{unsignedcharbutton;//保存按鍵信息

unsignedcharcodedisp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xbf};//定義數組led,依次存儲包括0~7和“”的共陽極數碼管顯示碼表

P0=0xff;//讀引腳狀態,需先置1P1=disp[8];//顯示“”

while(1){ button=P0;//第一次讀按鍵狀態

delay(1200); //延時消抖

button=P0;//第二次讀按鍵狀態

switch(button)//根據按鍵的值進行多分支跳轉

{ case0xfe:P1=disp[0];delay(10000);while(1);break;//0按下,顯示0,待機

case0xfd:P1=disp[1];delay(10000);while(1);break;//1按下,顯示1,待機

case0xfb:P1=disp[2];delay(10000);while(1);break;//2按下,顯示2,待機

case0xf7:P1=disp[3];delay(10000);while(1);break;//3按下,顯示3,待機

case0xef:P1=disp[4];delay(10000);while(1);break;//4按下,顯示4,待機

case0xdf:P1=disp[5];delay(10000);while(1);break;//5按下,顯示5,待機

case0xbf:P1=disp[6];delay(10000);while(1);break;//6按下,顯示6,待機

case0x7f:P1=disp[7];delay(10000);while(1);break;//7按下,顯示7,待機

default:break; } }}四、舉一反三PARTFOUR04(1)4個按鍵,分別代表數字0、1、2、3;

(2)密碼事先設定為0~3之間的一位數字;(3)數碼管顯示“-”,表示等待密碼輸入;

(4)密碼正確顯示“P”約3s,并通過P3.0端口將鎖打開;否則顯示“E”約3s,繼續保持鎖定狀態。設計具有4個按鍵輸入和1個數碼管顯示的簡易密碼鎖,具體要求:51單片機4個按鍵由P0.0~P0.3控制;共陽數碼管由P1口靜態控制;由P3.0引腳控制的發光二極管的亮滅模擬開鎖電路的打開和鎖定。硬件電路密碼設定為“2”switch語句if……elseif……else程序設計思路

#include<reg51.h>//包含頭文件reg51.h,定義了51單片機的專用寄存器sbitP3_0=P3^0; //控制開鎖,用發光二極管代替程序預處理unsignedcharbutton; //保存按鍵信息unsignedcharcodetab[7]={0xc0,0xf9,0xa4,0xb,0xbf,0x86,0x8c}; //定義顯示段碼表,分別對應顯示字符:0、1、2、3,、E、P定義主程序中的按鍵信息變量以及數碼管顯示碼表數組P1=tab[4];//密碼鎖的初始顯示狀態“”P3_0=1;//設置密碼鎖初始狀態為“鎖定”,發光二極管熄滅密碼鎖開機初態設置讀取P0口即按鍵信息P0=0xff;//讀P0口引腳狀態,需先置全1button=P0;//讀取P0口上的按鍵狀態并賦值到變量buttondelay(1200);//延時去抖button=P0;//再次讀入按鍵狀態button&=0x0f;//采用與操作保留低4位的按鍵狀態,其他位清零判斷按鍵信息、控制開鎖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”}主講教師任務4-2小型LED數碼管字符顯示屏控制單片機控制技術(C語言版)任務導入01動態顯示方式02程序設計03舉一反三04一、任務導入PARTONE01任務要求采用動態顯示技術控制6個共陽極數碼管穩定顯示多個字符信息。將6個共陽極數碼管相應的段選控制端并聯在一起,僅用單片機的一個并行I/O口控制;將各位數碼管的公共端,也稱作“位選端”由單片機的另一個并行I/O口控制;采用動態顯示方式穩定顯示小王的生日1990年12月25日,顯示效果為:901225。74LS245和74LS04用來增強單片機的端口驅動能力硬件電路二、動態顯示方式PARTTWO021.首先,位選口選中第一個數碼管,段選口送這個數碼管想要顯示的字型碼,然后延時一段時間;2.其次,位選口選中第二個數碼管,段選口送出相應的字型碼,延時,……3.依次類推,直到位選口選中最后一個數碼管,段選口送出最后一個數碼管的字型碼,延時……這樣,一次循環結束,每個數碼管都“輪流”被點亮一次。核心思想:逐位掃描顯示由于人的眼睛存在“視覺駐留效應”,如果保證每位數碼管顯示間斷的時間間隔小于眼睛的駐留時間,就可以給人一種穩定顯示的視覺效果。三、程序設計PARTTHREE03顯示字符901225P2位選碼11111110B11111101B11111011B11110111B11101111B11011111BP1段選碼0x900xc00xf90xa40xa40x926個顯示字符在P2、P1口依次要輸出的數據while(1){

P1=0xff;//消隱:關顯示,共陽極數碼管0xff熄滅P2=0xfe;//送位碼,選中P2.0連接的數碼管P1=0x90;//送9的字型碼delay(200);//延時…

P1=0xff;//消隱,關顯示P2=0xdf;//送位碼,選中P2.5連接的數碼管P1=0x92;//送5的字型碼delay(200);//延時}順序程序設計方法for語句for(i=0;i<6;i++){

循環語句;}voidmain() {unsignedcharled[]={0x90,0xc0,0xf9,0xa4,0xa4,0x92}; //設置數字901225字型碼

unsignedchari,w;while(1){w=0xfe; //位選碼初值為0xfefor(i=0;i<6;i++){P1=0xff;//消隱,關顯示,共陽極數碼管0xff熄滅P2=w; //位選碼送位選端P2口

w=_crol_(w,1); //位選碼左移一位,選中下一位LEDP1=led[i];//顯示字型碼并送P1口

delay(100); //延時

}}}循環移位位選碼程序設計方法四、舉一反三PARTFOUR04

用動態顯示方式顯示第一屏學號:125315延時一段時間穩定地顯示學號用動態顯示方式顯示第二屏生日:901225延時一段時間穩定地顯示生日

重復動態顯示學號、延時、生日是……用6個數碼管以多屏方式交替顯示小王的學號“125315”和生日“901225”。具體要求:舉一反三1for語句多重for循環for語句循環的嵌套軟件設計思路voiddisp3(){

unsignedcharlednum[2][6]={{0x90,0xc0,0xf9,0xa4,0xa4,0x92},{0xf9,0xa4,0x92,0xb0,0xf9,0x92}};//二維數組存儲910812、102315的字型碼

unsignedcharcom[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//一維數組存儲位選碼unsignedchari,j,num;for(num=0;num<2;num++)//顯示兩屏字符for(j=0;j<100;j++)//循環顯示一屏字符100次,達到延時穩定顯示作用for(i=0;i<6;i++)

//動態顯示6個字符{P1=0xff;//消隱,關顯示P2=com[i];//位選碼送位控制口P2口

P1=lednum[num][i];//顯示字型碼送P1口

delay(100); //延時

}}實用移動顯示廣告屏設計。要求:單片機控制6個數碼管由右往左以移動顯示方式顯示“HELLO”字樣。舉一反三2for語句多重for循環實質是依次顯示6屏移位后的顯示內容,就可以達到移動顯示的效果。HEHLEHLLEHOLLEH第1屏第2屏第3屏第4屏第5屏OLLEHH第6屏第1屏軟件設計思路每屏顯示數據之間對應一定的排列順序,下面將6屏將要出現的顯示字符按順序排列如下:×××××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++)//循環顯示一屏字符100次,達到穩定顯示作用for(i=0;i<6;i++){P1=0xff;//消隱,關顯示P2=com[i];//位選碼送位控制口P2口

P1=ledmove[num+i];//顯示字型碼送P1口

delay(100);//延時

}}判斷按鍵并累加次數根據次數進行跳轉判斷按鍵是否彈起程序設計思路

if(K==0) //第一次判斷有鍵按下{delay(1200);//延時消除抖動if(K==0)//再次判斷有鍵按下{if(++i==5)i=1;//i增1,且增加到5后,再重新賦值1}}判斷按鍵并累加次數根據次數進行跳轉switch(i)//根據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);//延時消除抖動主講教師任務4-3LED點陣式電子廣告牌控制單片機控制技術(C語言版)任務導入018x8LED點陣顯示模塊02程序設計03舉一反三04一、任務導入PARTONE01用單片機控制一塊8×8LED點陣式電子廣告牌,將一些特定的文字或圖形以特定的方式顯示出來。要求:在8×8LED點陣廣告牌上穩定顯示“0”。任務要求單片機通過74LS245與LED連接,提高端口輸出的電流,既可保證了LED的亮度,還可保護單片機端口引腳。硬件電路二、8x8LED點陣顯示模塊PARTTWO02三、程序設計PARTTHREE03動態掃描編程軟件設計思路00000001B,即0x0100000010B,即0x0200000100B,即0x0400001000B,即0x0800010000B,即0x1000100000B,即0x2001000000B,即0x4010000000B,即0x8011100111B,即0xE711011011B,即0xDB11011011B,即0xDB11011011B,即0xDB11011011B,即0xDB11011011B,即0xDB11011011B,即0xDB11100111B,即0xE7while(1){P1=0x01;//掃描顯示第1行

P0=0xE7;//送第一行列數據幀

delay(100);P1=0x02;//掃描顯示第2行

P0=0xDB;//送第二行列數據幀

delay(100);P1=0x04;//掃描顯示第3行

P0=0xDB;//送第三行列數據幀

delay(100);P1=0x08;//掃描顯示第4行

P0=0xDB;//送第四行列數據幀

delay(100);P1=0x10;//掃描顯示第5行

P0=0xDB;//送第五行列數據幀

delay(100);P1=0x20;//掃描顯示第6行

P0=0xDB;//送第六行列數據幀

delay(100);P1=0x40;//掃描顯示第7行

P0=0xDB;//送第七行列數據幀

delay(100);P1=0x80;//掃描顯示第8行

P0=0xE7;//送第八行列數據幀

delay(100);}

逐行掃描法的順序程序設計unsignedcharcodeled[]={0xE7,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xE7};//“0”的字型顯示碼unsignedcharw,i;while(1){w=0x01;//行初值為0x01for(i=0;i<8;i++){P1=w;//行數據送P1口

P0=led[i];//列數據幀送P0口

delay(100);w<<=1;//行變量左移指向下一行

}}逐行掃描法的循環程序設計四、舉一反三PARTFOUR04在8×8點陣LED上循環顯示數字0~9,具體要求:舉一反三1要顯示的數字0~9分成10屏輪流顯示在8×8點陣LED上。第一屏行掃描顯示0,延時穩定顯示;然后第二屏行掃描顯示1,延時穩定顯示;……最后行掃描顯示9,延時穩定顯示。循環以上過程。

動態掃描編程循環嵌套多個字符的顯示程序可以在一個字符顯示程序的基礎上再外嵌套一個循環。用二維數組存儲顯示數字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

軟件設計思路unsignedcharw;unsignedintj,k,m;while(1){for(k=0;k<10;k++) //第一維下標取值范圍為0~9{for(m=0;m<200;m++)//每個字符掃描顯示200次,控制每個字符顯示時間{

w=0x01;for(j=0;j<8;j++) //第二維下標取值范圍為0~7{P1=w; //行控制

P0=led[k][j]; //將指定數組元素賦值給P0口,顯示碼

delay(100);w<<=1;}}}}使用4個8×8點陣LED顯示屏擴展設計一個16×16的LED點陣式電子廣告牌,循環顯示“單片機”字樣。舉一反三2若干個8×8LED點陣顯示模塊進行簡單地拼裝,可以構成各種尺寸的大屏幕顯示屏,如16×16、32×32、64×16、128×32等點陣尺寸。4/16線譯碼器74LS154:擴充行選端口移位寄存器74HC595:擴充列線端口硬件設計引腳編號引腳名引腳定義功能1、2、3、4、5、6、7、15QA~QH并行三態輸出管腳8GND電源地9SQH串行數據輸出管腳10SCLR移位寄存器清零端11SCK數據輸入時鐘線12RCK輸出存儲器鎖存時鐘線13OE輸出使能14SI串行數據輸入端15VCC電源端74HC595串入并出移位寄存器輸入引腳輸出引腳SISCKSCLRRCKOEXXXXHQA—QH輸出高阻XXXXLQA—QH輸出有效值XXLXX移位寄存器清零L上升沿HXX移位寄存器存儲LH上升沿HXX移位寄存器存儲HX下降沿HXX移位寄存器狀態保持XXX上升沿X輸出存儲器鎖存移位寄存器中的狀態值XXX下降沿X輸出存儲器狀態保持真值表工作時序

for(i=0;i<8;i++)//8位控制

{SCK=0;//給串行移位時鐘送低電平

if((data1&0x80)==0x80)//數據data的最高位為1,則向SDATA_595發送1 SI=1;//發出數據的最高位else//數據data的最高位為0,則向SDATA_595發送0 SI=0;data1<<=1;//下一位串行數據移位到最高位

SCK=1;//給串行移位時鐘送高電平,產生上升沿

}8位數據逐位移入74HC595595串入并出過程①將數據逐位移入74HC595,即數據串入;②并行輸出數據,即數據并出。軟件設計思路#include<reg51.h>//包含頭文件reg51.h,定義51單片機的專用寄存器#include<intrins.h>#defineNUM3//換屏數#defineROW_SELP1//行選譯碼器輸入端口連接P1的低4位sbitSI=P2^1;//列驅動移位寄存器串行輸入數據端口連接P2.1sbitSCK=P2^0;//列驅動移位寄存器串行輸入數據時鐘端口連接P2.0sbitRCK=P1^6;//列驅動輸出鎖存器時鐘信號端口連接P1.6sbitSCLR=P1^5;//列驅動移位寄存器清0端口連接P1.5sbitG=P1^7;//行選譯碼器控制端口連接P1.7unsignedcharcodescreen[3][32]={//字模表,文字點陣:寬×高=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}//機}; //用二維數組存儲每屏要顯示的點陣圖案程序預處理字模提取voidmain()//主函數{unsignedinti,j,k;unsignedcharr_sel;//定義行選碼變量while(1){for(i=0;i<NUM;i++)//循環換屏{for(j=0;j<10000;j++)//每屏顯示刷新10000次,控制每屏顯示時間

{for(k=0;k<16;k++)//循環掃描16行

{col_data(i,k);//串入第i屏的第k行的列數據G=1;//關閉行選譯碼器out_data();//第k行16位列數據送輸出鎖存器r_sel=ROW_SEL&0xF0+k;//掃描選擇第k行;G=0;//啟動行選

}}}}}//函數:串入16位的列線數據voidcol_data(unsignedints,unsignedintr){unsignedchari,data1;data1=screen[s][2*r];//取第1個列數據

for(i=0;i<8;i++)//串入第一個字節

{SCK=0;//給串行移位時鐘送低電平

if((data1&0x80)==0x80)//最高位為1,則向SDATA_595發送1 SI=1;//發出數據的最高位else SI=0;data1<<=1;//下一位串行數據移位到最高位

SCK=1;//給串行移位時鐘送高電平,產生上升沿

}data1=screen[s][2*r+1];//取第2個列數據

for(i=0;i<8;i++)//串入第二個字節

{SCK=0;//給串行移位時鐘送低電平

if((data1&0x80)==0x80)//最高位為1,則向SDATA_595發送1 SI=1;//發出數據的最高位

else SI=0;data1<<=1;//下一位串行數據移位到最高位

SCK=1;//給串行移位時鐘送高電平,產生上升沿

}}//函數:16位的列線數據并行輸出到輸出鎖存器voidout_data(){RCK=0;//輸出鎖存器時鐘置低電平_nop_();_nop_();RCK=1;//輸出鎖存器時鐘置高電平,產生上升沿鎖存數據}主講教師任務4-4字符型LCD液晶顯示廣告牌控制單片機控制技術(C語言版)任務導入011602LCD字符顯示模塊02程序設計03舉一反三04一、任務導入PARTONE01用單片機控制LCD1602液晶模塊,在第1行正中間顯示“SHENZHEN”字符串。任務要求硬件電路二、1602LCD字符顯示模塊PARTTWO02

12345678910111213141516LCD模塊VSSVDDVODB0DB1DB3DB2DB5DB4DB7DB6AKRSR/WE數據線電源接線背光控制線讀寫控制線RSR/W操作00寫命令操作(初始化、光標定位等)01讀狀態操作(讀忙標志)10寫數據操作(要顯示的內容)11讀數據操作(可以把顯示存儲區中的數據反讀出來)字符型LCD1602的基本操作編號指令名稱控制信號命令字D7D6D5D4D3D2D1D01清屏00000000012歸位home000000001×3輸入方式設置00000001I/DS4顯示狀態設置0000001DCB5光標畫面滾動000001S/CR/L××6工作方式設置00001DLNF××7CGRAM地址設置0001A5A4A3A2A1A08DDRAM地址設置001A6A5A4A3A2A1A09讀BF和AC01BFAC6AC5AC4AC3AC2AC1AC01602LCD的命令字LCD初始化//lcd初始化

void

lcd_init(){

lcd_w_cmd(0x3c);//設置工作方式

lcd_w_cmd(0x0e);//設置光標

lcd_w_cmd(0x01);//清屏

lcd_w_cmd(0x06);//設置輸入方式}RS=0;R/W=1;E:正脈沖//讀狀態函數unsignedcharlcd_r_start()//8位數據線連接方式{unsignedchars;RW=1; //RW=1,RS=0,讀LCD狀態

delayus();RS=0;

delayus();E=1; //E端時序

delayus();

s=LCD_DB; //從LCD的數據口讀狀態

delayus();E=0;

delayus();RW=0;

delayus();

return(s); //返回讀取的LCD狀態字}D7D6D5D4D3D2D1D0BFBF=1:表示LCD正在忙

BF=0:表示LCD不忙i=lcd_r_start();//調用讀狀態函數,讀取LCD狀態字//寫命令操作函數voidlcd_w_cmd(unsignedcharcom)//8位數據線連接方式{unsignedchari;

do{//查LCD忙操作

i=lcd_r_start();//調用讀狀態字函數

i=i&0x80;//與操作屏蔽掉低7位

delayms(1);}while(i!=0);//LCD忙,繼續查詢,否則退出循環

RW=0;delayus();RS=0;

//RW=0,RS=0,寫LCD命令字

delayus();E=1;

//E端時序

delayus();LCD_DB=com; //將com中的命令字寫入LCD數據口

delayus();E=0;delayus();RW=1;delayms(50);}RS=0;R/W=0;E:正脈沖RS=1;R/W=0;E:正脈沖//寫數據函數voidlcd_w_dat(unsignedchardat)//8位數據線連接方式{unsignedchari;

do{//查LCD忙操作

i=lcd_r_start(); //調用讀狀態字函數

i=i&0x80;//與操作屏蔽掉低7位

delayms(1);}while(i!=0); CD忙,繼續查詢,否則退出循環

RW=0;delayus();RS=1; //RW=0,RS=1,寫LCD數據

delayus();E=1; //E端時序

delayus();LCD_DB=dat; //將com中的命令字寫入LCD數據口

delayus();E=0;delayus();RW=1;delayms(50);}

列行123456789101112131415161808182838485868788898A8B8C8D8E8F2C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF光標位置與相應命令字(1)表中命令字以十六進制形式給出,該命令字就是與LCD顯示位置相對應的DDRAM地址。(2)第一行和第二行的命令字是不連續的。lcd_w_cmd(0x84);//光標定位在第1行第5列三、程序設計PARTTHREE03#include<reg51.h>//包含頭文件reg51.h,定義了51單片機的專用寄存器#include<intrins.h>//包含頭文件intrins.h,代碼中引用了_nop_()函數//定義控制信號端口sbitRS=0xb0; //P3.0sbitRW=0xb1; //P3.1sbitE=0xb2; //P3.2程序預處理//主函數voidmain() {unsignedcharlcd[]="SHENZHEN";unsignedchari;P1=0xff; //送全1到P0口

lcd_int(); //初始化LCDdelay(255);lcd_w_cmd(0x83); //設置顯示位置

delay(255);for(i=0;lcd[i]!='\0';i++) //顯示字符串,字符串結束符為’\0’

{lcd_w_dat(lcd[i]);delay(200);}while(1); //原地踏步,待機命令}四、舉一反三PARTFOUR04在1602LCD的第1行第2列顯示“工人”

LCD標準字庫1602LCD模塊的標準字庫表中沒有中文字符!利用1602LCD模塊字符發生存儲器CGRAM可以自編8個5×8字符。自編字符的命令字:A7A6A5A4A3A2A1A001AC5AC4AC3AC2AC1AC0(1)A7A6=01:CGRAM地址設置的命令字。(2)A5A4A3:與自編字符的DDRAM數據相對應的字符代碼。若A5A4A3=“000”,則該字符寫入DDRAM的代碼為00,若A5A4A3=“001”,則該字符寫入DDRAM的代碼為01,依次類推。(3)A2A1A0:與CGRAM字模的8行相對應。當A2A1A0=“000”時,寫入第1行的字模碼,當A2A1A0=“001”時,寫入第2行的字模碼,依次類推。按照CGRAM地址和數據自編5x7字模自編字庫lcd_w_cmd(0x40);//寫入第1行CGRAM地址lcd_w_dat(0x1f);//寫入第1行CGRAM數據自編5x7的字“工”字模和“人”字模軟件設計思路//在CGRAM中建立“工”字字模voidGONG_ZI(){

lcd_w_cmd(0x40); //寫入第1行CGRAM地址

lcd_w_dat(0x1f); //寫入第1行CGRAM數據

lcd_w_cmd(0x41); //寫入第2行CGRAM地址

lcd_w_dat(0x1f); //寫入第2行CGRAM數據

lcd_w_cmd(0x42); //寫入第3行CGRAM地址

lcd_w_dat(0x04); //寫入第3行CGRAM數據

lcd_w_cmd(0x43); //寫入第4行CGRAM地址

lcd_w_dat(0x04); //寫入第4行CGRAM數據

lcd_w_cmd(0x44); //寫入第5行CGRAM地址

lcd_w_dat(0x04); //寫入第5行CGRAM數據

lcd_w_cmd(0x45); //寫入第6行CGRAM地址

lcd_w_dat(0x1f); //寫入第6行CGRAM數據

lcd_w_cmd(0x46);//寫入第7行CGRAM地址

lcd_w_dat(0x1f); //寫入第7行CGRAM數據

lcd_w_cmd(0x47); //寫入第8行CGRAM地址

lcd_w_dat(0x00); //寫入第8行CGRAM數據}//在CGRAM中建立“人”字字模voidREN_ZI(){

lcd_w_cmd(0x48);//寫入第1行CGRAM地址

lcd_w_dat(0x00); //寫入第1行CGRAM數據

lcd_w_cmd(0x49);//寫入第2行CGRAM地址

lcd_w_dat(0x04); //寫入第2行CGRAM數據

lcd_w_cmd(0x4A);//寫入第3行CGRAM地址

lcd_w_dat(0x04); //寫入第3行CGRAM數據

lcd_w_cmd(0x4B);//寫入第4行CGRAM地址

lcd_w_dat(0x0A); //寫入第4行CGRAM數據

lcd_w_cmd(0x4C);//寫入第5行CGRAM地址

lcd_w_dat(0x0A); //寫入第5行CGRAM數據

lcd_w_cmd(0x4D);//寫入第6行CGRAM地址

lcd_w_dat(0x11); //寫入第6行CGRAM數據

lcd_w_cmd(0x4E);//寫入第7行CGRAM地址

lcd_w_dat(0x11); //寫入第7行CGRAM數據

lcd_w_cmd(0x4F); //寫入第8行CGRAM地址

lcd_w_dat(0x00); //寫入第8行CGRAM數據}判斷按鍵并累加次數根據次數進行跳轉判斷按鍵是否彈起voidmain() //主函數{P1=0xff;//送全1到P0口

lcd_int(); //初始化LCDdelay(255);GONG_ZI();//調用“工”字建模函數

REN_ZI();//調用“人”字建模函數

lcd_w_cmd(0x81); //設置顯示位置

lcd_w_dat(0x00); //顯示“工”lcd_w_dat(0x01);//顯示“人”

while(1); //待機}主講教師任務4-5密碼鎖設計單片機控制技術(C語言版)任務導入01矩陣鍵盤02程序設計03舉一反三04一、任務導入PARTONE01設計具有16個按鍵和1個數碼管顯示的密碼鎖,具體要求:輸入一位密碼(為0~9,A~F之間的數字),密碼輸入正確顯示“P”并將鎖打開;否則顯示“E”,繼續保持鎖定狀態。任務要求共陽數碼管顯示搶答器的狀態信息;16個按鍵連接成4×4矩陣鍵盤方式;連接P3.0的發光二極管的亮滅表示開鎖或關鎖狀態。硬件電路二、矩陣鍵盤PARTTWO024×4矩陣鍵盤四行四列01230123行線列線4×4矩陣鍵盤01230123行線列線單片機+VCC4x4矩陣鍵盤將16根獨立連接的控制線減少到只需要8根控制線,即4根行線、4根列線如何識別矩陣式鍵盤中的按鍵?識別按鍵一般應包括以下內容:(1)判別有無鍵按下。(2)鍵盤掃描取得閉合鍵的行、列號。(3)用計算法或查表法得到鍵值。(4)判斷閉合鍵是否釋放,如沒釋放則繼續等待。(5)將閉合鍵的鍵值保存,同時轉去執行該閉合鍵的功能。逐列掃描法行列反轉法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當所有的按鍵都沒有被按下時,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#列線導通,讀入的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”。讀入行電平,判斷第一列四個按鍵的狀態。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”,其他三列為高電平,進行第一列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”,

其他三列為高電平,進行第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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論