久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7358|回復: 0
打印 上一主題 下一主題
收起左側

第12章 常用單片機接口程序 靜態(tài)動態(tài)顯示 獨立按鍵 矩陣按鍵

[復制鏈接]
跳轉到指定樓層
樓主
ID:111078 發(fā)表于 2016-3-28 21:07 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
第12章 常用單片機接口程序
1 靜 態(tài) 顯 示
2 動 態(tài) 顯 示
3 獨立按鍵
4 矩陣按鍵
數碼管是常用的輸出顯示器件,按鍵是常用的信號輸入器件。




常見數碼管引腳排列如圖所示


靜態(tài)顯示電路如下圖:



編寫字型碼關鍵步驟如下:
① 數碼管要顯示某個數字或字符,首先根據單只數碼管引腳圖,確定需要點亮數 碼管的哪幾段,從而確定數碼管8個引腳電平的高低。


例12.1 74HC595移位顯示程序,上電后數碼管固定顯示123456。
#include "STC15W4K.H"
//
注意宏定義后面沒分號
#include "intrins.h"
//
程序中_nop_()函數需用
sbit
Dat=P3^2;
//
定義串行數據輸入端
sbit
Clk=P3^3;
//
定義時鐘端
sbit
CNT=P3^4;
//
定義控制端
unsigned char DispBuf[6];
unsigned char code DispTab[]={0x03,0x9f,0x25,0x0d,0x19,0x41,0x1f,0x01,0x09,
0x11,0xc1,0x63,0x85,0x61,0x71}; // 定義定形碼表
void SendData(unsigned char SDat) // 74HC595傳送一個字節(jié)的數據
{ // 固定代碼,直接復制使用
}
void Disp() // 顯示位數在6位內不用修改
{
unsigned char c=0,i=0;
CNT=0; // 為產生脈沖上升沿作準備
for(i=0;i<6;i++) // 顯示位數需用根據硬件修改
{
c=DispBuf[ i ]; // 取出待顯示字符 SendData(DispTab[c]); // 送出字形碼數據
}
CNT=1; // 產生脈沖上升沿,并行輸出數據
}

void main()

{

unsigned long i=123456; // 123456

DispBuf[0]=i%10; // 個位 DispBuf[1]=i/10%10; // 十位 DispBuf[2]=i/100%10; // 百位 DispBuf[3]=i/1000%10; // 千位 DispBuf[4]=i/10000%10; // 萬位 DispBuf[5]=i/100000%10; // 十萬位 Disp();

for(;;)

{

; // 程序停在這里

}

}

2 動態(tài)顯示

這里介紹的動態(tài)顯示電路如下圖所示,看起來有點像靜態(tài)顯示電路,但比靜態(tài) 顯示電路占用硬件要少,比單片機直接驅動數碼管占用IO口也要少。


DAT
結合電路圖,控制某一位數碼管電源通斷的位選碼就簡單多了,如下所示。

單片機內部數據位

595引腳

D7

Q0

D6

Q1

D5

Q2

D4

Q3

D3

Q4

D2

Q5

D1

Q6

D0

Q7

位碼

十萬位

1

1

0

1

1

1

1

1

0xDF

萬位

1

0

1

1

1

1

1

1

0xBF

千位

0

1

1

1

1

1

1

1

0x7F

百位

1

1

1

1

1

0

1

1

0xFB

十位

1

1

1

1

1

1

0

1

0xFD

個位

1

1

1

1

1

1

1

0

0xFE


例12.3 單片機上電后數碼管顯示123456
sbit
Dat=P4^2;
//
定義串行數據輸入端
sbit
Clk=P4^4;
//
定義時鐘端
sbit
CNT=P4^5;
//
定義控制端
unsigned char code BitTab[]={0xFE,0xFD,0xFB,0x7F,0xBF,0xDF,}; // 位選
code unsigned char DispTab[] = {0x14,0x77,0x4c,0x45,0x27,0x85,0x84,0x57,
0x04,0x05,0x06,0xa4,0x9c,0x64,0x8c,0x8e}; // 字形碼

unsigned char DispBuf[6]; // 6字節(jié)的顯示緩沖區(qū),DispBuf[0]是最低位;

void SendData(unsigned char SendDat) // 74HC595傳送一個字節(jié)的數據
{ ;// 同例12.1
}
void timer0_init() // 定時器初始化
{
// 2ms定時中斷設置
}
void main()
{
timer0_init();
DispBuf[0]=6; DispBuf[1]=5; DispBuf[2]=4;DispBuf[3]=3; DispBuf[4]=2;DispBuf[5]=1;
for(;;)
{
;
}
}

void Timer0() interrupt 1
{

unsigned char tmp; //臨時變量
static unsigned char Count=0; //顯示程序通過它得知現正顯示哪個數碼管
// ***************** 重裝定時常數 ***************************
TH0=0xf1;
TL0=0x99; // 定時時間為2ms/22.1184MHz
// ******************點亮某位數碼管************************** CNT=0; // 為產生脈沖上升沿作準備 SendData(BitTab[Count]); // 最先點亮最右邊個位
// ******************輸出待顯數據************************** tmp=DispBuf[Count]; // 根據當前的計數值取顯示緩沖待顯示值 tmp=DispTab[tmp]; // 取字形碼
SendData(tmp) ;
CNT=1; // 產生脈沖上升沿,并行輸出數據
// ******************************************** Count++;
if(Count==6) Count=0;
}

3 獨立按鍵
電路如圖所示,單片機引腳作為輸入使用,軟件首先將接有按鍵的IO口置1,當鍵
沒有被按下時,單片機引腳上為高電平,而當鍵被按下后,引腳接地,單片機引 腳上為低電平,通過編程即可獲知是否有鍵按下及按鍵的位置。

由于機械按鍵按下和松開瞬間都會產生抖動,為了不讓一次按鍵動作過程中程序產生多

次響應引起混亂,就需要軟件去抖動處理,它的思路是:在單片機獲得某按鍵IO口為低 的信息后,不是立即認定該鍵被按下,而是延時一段時間,通常選擇10mS,再次檢測IO 口,如果仍為低,則說明該鍵的確被按下,這避開了按鍵的前沿抖動,而在檢測到按鍵 釋放后(該IO口為高),再延時10mS,消除釋放時的后沿抖動,然后再對鍵值進行處

理,實際的程序中其實一般都是不需要后沿抖動處理的,在后沿抖動的過程中,程序可 能誤判為鍵按下,在鍵按下后程序會執(zhí)行前沿延時10mS,所以前沿的10mS延時也就同時 用作了后沿去抖動的10mS。主要程序代碼如下:

void main()

{
unsigned char KValue;
//
存放鍵值
port_mode();
//
所有IO口設為準雙向弱上拉方式。
for(;;)
{

KValue=Key();
//
調用鍵盤程序并獲得鍵值
if(KValue)
//
如果該值不等于0,表示有鍵按下
{

KProce(KValue);
//
根據鍵值執(zhí)行不同的功能
}
}
}
unsigned char Key() // 獲取鍵值函數
{
unsigned char KValue; // 存放鍵值
unsigned char tmp; // 臨時變量
P3|=0x3c; // 0x3c=0011 1100,將P3口接鍵盤的中間四位置1
_nop_();_nop_(); KValue=P3; KValue|=0xc3;

//

// STC指令太快,加上更可靠

0xc3=1100 0011,將未接鍵的4位置1

if(KValue==0xff) // 中間4位均為1,無鍵按下
return(0);

// 返回
delay10ms();
KValue=P3; KValue|=0xc3;

//

// 延時10ms,去鍵抖
// 與下一行一起作最終返回鍵值。
0xc3=1100 0011,將未接鍵的4位置1,最終返回鍵值。
if(KValue==0xff) // 中間4位均為1,無鍵按下
return(0); // 返回,如尚未返回,說明一定有1或更多位被按下
for(;;)
{
tmp=P3; // 等待按鍵釋放
if((tmp|0xc3)==0xff)
break;
}
return(KValue);
}

4 矩陣按鍵
電路如圖所示,只要熟悉了獨立按鍵,矩陣按鍵也同樣的簡單。



主要代碼如下:
sbit KeyOut1 = P2^7;sbit KeyOut2 = P2^6;sbit KeyOut3 = P2^5;sbit KeyOut4 = P2^4;
sbit KeyIn1 = P2^3;sbit KeyIn2 = P2^2;sbit KeyIn3 = P2^1;sbit KeyIn4 = P2^0; unsigned char
KeyScan()
{
unsigned char key=0xff; // 臨時變量
KeyOut1 = 1; KeyOut2 = 1; KeyOut3 = 1; KeyOut4 = 0; // 掃描第1列
if(KeyIn1 == 0)
{
delay10ms(); if(KeyIn1 == 0) key=0x00;
}
if(KeyIn2 == 0)
{
delay10ms(); if(KeyIn2 == 0) key=0x04;
}
if(KeyIn3 == 0)
{
delay10ms(); if(KeyIn3 == 0) key=0x08;
}
if(KeyIn4 == 0)
{
delay10ms(); if(KeyIn4 == 0) key=0x0c;
}
KeyOut1 = 1; KeyOut2 = 1; KeyOut3 = 0; KeyOut4 = 1; // 掃描第2列
if(KeyIn1 == 0)
{
delay10ms(); if(KeyIn1 == 0) key=0x01;
}
……
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂2 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一级片 | 日韩在线免费视频 | 国产伦精品一区二区三区视频金莲 | 奇米影视在线 | 日本成人二区 | 一区二区三区欧美 | 久操伊人 | 欧美日韩久久 | 韩日精品在线观看 | 九九综合| 欧美国产日韩在线观看 | 国产aa| 影音先锋欧美资源 | 久久免费观看视频 | 欧美日韩视频在线播放 | 奇米视频777 | 美女久久久久久久 | 免费观看一级特黄欧美大片 | 一级特黄网站 | 国产精品免费一区二区三区四区 | 黄色国产在线视频 | 超碰在线国产 | 涩爱av一区二区三区 | 午夜激情一区 | 伊人伊人| 一区二区三区不卡视频 | 国产精品日日摸夜夜添夜夜av | 狠狠亚洲 | 成人欧美一区二区三区在线观看 | 美女视频黄色片 | 国产在线观看一区二区 | 亚洲一区二区三区视频在线 | 午夜精品久久久久久不卡欧美一级 | 久久亚洲国产精品日日av夜夜 | 免费看91| 亚洲嫩草| 一区二区三区四区视频 | 欧美精品一区二区在线观看 | 在线播放国产一区二区三区 | 国产精品日韩欧美一区二区三区 | 免费国产一区二区视频 |