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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

新人,關于51單片機的程序有些地方不懂,請高手給指點。

[復制鏈接]
跳轉到指定樓層
樓主
ID:231688 發表于 2017-9-7 16:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
宋老師的《手把手教你學51單片機》中第7章中,有一段關于掃描確認按鍵矩陣的程序,如下:
#include<reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY_IN_1 = P2^4;
sbit KEY_IN_2 = P2^5;
sbit KEY_IN_3 = P2^6;
sbit KEY_IN_4 = P2^7;
sbit KEY_OUT_1 = P2^3;
sbit KEY_OUT_2 = P2^2;
sbit KEY_OUT_3 = P2^1;
sbit KEY_OUT_4 = P2^0;
unsigned char code LedChar[]={
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char KeySta[4][4] = {
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
void main()
{
unsigned char i, j;
unsigned char backup [4][4] = {
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};

EA = 1;
ENLED = 0;
ADDR3 = 1;
ADDR2 = 0;
ADDR1 = 0;
ADDR0 = 0;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
TR0 = 1;
P0 = LedChar[0];
while(1)
{
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
if(backup[ i][j] != KeySta[ i][j])    這一段中,KeySta[ i][j])并沒有被聲明對應哪個按鍵的輸入,那么當某個按鍵動作時,程序如何能檢測到?
{
if(backup[ i][j] == 0)
{
P0 = LedChar[i*4+j];
}
backup[ i][j] = KeySta[ i][j];
}
}
}
}
}
void InterruptTimer0() interrupt 1
{
static unsigned char keyout = 0;
unsigned char i = 0;
static unsigned char keybuf[4][4] = {
{0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF}
};

TH0 = 0xFC;
TL0 = 0x67;
keybuf[keyout][0] = (keybuf[keyout][0] <<1) | KEY_IN_1;  這一段的作用是“將一行的4個按鍵值移入緩沖區”,可我看不懂這句程序,高手能否給解答下?
keybuf[keyout][1] = (keybuf[keyout][1] <<1) | KEY_IN_2;
keybuf[keyout][2] = (keybuf[keyout][2] <<1) | KEY_IN_3;
keybuf[keyout][3] = (keybuf[keyout][3] <<1) | KEY_IN_4;

for(i=0; i<4; i++)
{
if((keybuf[keyout][ i] & 0x0F) == 0x00)
{
KeySta[keyout][ i] = 0;
}
else if((keybuf[keyout][ i] & 0x0F) == 0x0F)
{
KeySta[keyout][ i] = 1;
}
}
keyout++;
keyout = keyout & 0x03;
switch(keyout)
{
case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break;
case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;
case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;
case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break;
default: break;
}
}
        以上這段程序我根本沒吃透,暫時有兩個問題在程序里用紅字標注出來了,還望高手給指點下,謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:231633 發表于 2017-9-7 17:36 | 只看該作者
我就解釋一下這個問題把:
keybuf[keyout][0] = (keybuf[keyout][0] <<1) | KEY_IN_1;  這一段的作用是“將一行的4個按鍵值移入緩沖區”,可我看不懂這句程序,高手能否給解答下?

回答如下:
keybuf[keyout][0]  首先左移一位,那么變量的最低位就會空出來(指的是沒有實際意義),此時又進行了一個“邏輯加”操作,相當于把KEY_IN_1(也就是對應的IO口)狀態放到了變量的最低位,這樣,一個狀態就保存到了變量中了。如此看來,一個變量可以保存8個Bit,也就是8個狀態信息。


建議:
學單片機,刻苦鉆研值得鼓勵!不過我不建議在沒有實際需求的前提下搞這些,你也看到了,你現在僅僅是閱讀了,而且不懂。試想一下,當你想解決一個問題的時候,你再來看這段代碼,可能理解就不一樣了。這段代碼作用就是把幾個IO口的狀態保存到一個變量里面,便于處理。

評分

參與人數 2黑幣 +58 收起 理由
張小帥1126 + 8 很給力!
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:231688 發表于 2017-9-7 18:41 | 只看該作者
零妖 發表于 2017-9-7 17:36
我就解釋一下這個問題把:
keybuf[keyout][0] = (keybuf[keyout][0]

您好,您解答的非常好,我一下就明白了,非常感謝啊!還有就是,我看這個單片機的目的還是有的,不過我不是為了搞單片機,而是為了學PLC和數據通信。但是我這個人比較笨,那些PLC和數據通信的書又大都寫的比較晦澀,看起來比較費勁。宋老師的這本《手把手》感覺借鑒了老外的教學模式,力求淺顯化。我看這本書,一是打打相關基礎,二是開拓下思路,感覺還是有收獲的,畢竟很多東西都是相通的。怎奈他的這書在有些地方卻未講解到位,甚至根本就沒有講,所以就卡住了。不過還好有論壇,有很多像您這樣的熱心高手,那我就更應該努力學習,積極請教了。
回復

使用道具 舉報

地板
ID:231688 發表于 2017-9-7 18:47 | 只看該作者
那么我的第一個問題,就是關于 KeySta[ i][j],這個自定義變量在整個程序中根本就沒有被定義跟任何按鍵的輸入有關,那么程序如何識別它是在進行按鍵狀態的掃描呢?
回復

使用道具 舉報

5#
ID:231688 發表于 2017-9-8 00:37 | 只看該作者
不好意思,我搞明白了,在中斷程序里,KeySta[keyout][ i] = 0;或KeySta[keyout][ i] = 1;
回復

使用道具 舉報

6#
ID:111634 發表于 2017-9-9 17:14 | 只看該作者
本帖最后由 zl2168 于 2017-9-10 09:34 編輯

這樣沒有注解的書,沒有老師講解輔導,學生能理解嗎?給你介紹2本便于自學的書。張志良編著的:《80C51單片機實用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學習51單片機原理,程序(雙解c和匯編)語句條條有注解,便于閱讀理解,便于自學。《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,可演示,可觀測,電路與程序真實可靠可信可行,程序語句條條有注解
新華書店翻閱,看看是否合意,還可與其他書比較一下,有比較才能有鑒別!絕不忽悠你!
回復

使用道具 舉報

7#
ID:231688 發表于 2017-9-11 00:25 | 只看該作者
zl2168 發表于 2017-9-9 17:14
這樣沒有注解的書,沒有老師講解輔導,學生能理解嗎?給你介紹2本便于自學的書。張志良編著的:《80C51單片 ...

十分感謝啊,我一定去看看您給推薦的書。不過啊,這里也是有些冤枉宋老師了,他的書里的程序還是有注解的,只是有些地方沒有點到,我發的程序是在網上復制的,內容一樣的,但是缺少了注解。可能宋老師覺得天下不會有太笨的學生吧,但恰恰我就是了。進步還是有的,但也確實在某些方面感到吃力,感覺功夫還是沒下夠。
我現在感覺《手把手教你學51單片機》這本書的優點:借鑒了歐美的教學模式,一切以便于理解吸收為前提,而不是像國內很多書,生怕你沒把他當教授,寫的書晦澀難懂!缺點:在一些比較難的點上反而講解的不夠或者根本就沒有講解,導致我經常性卡殼。以上共大家借鑒,感覺也確實應該參考下其他書籍,互補一下比較好。
回復

使用道具 舉報

8#
ID:232442 發表于 2017-9-11 17:25 | 只看該作者
een  學習了
回復

使用道具 舉報

9#
ID:232442 發表于 2017-9-11 17:26 | 只看該作者
在中斷程序
KeySta[keyout][ i] = 0;
KeySta[keyout][ i] = 1;
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠亚洲| 国产精品久久久久久一级毛片 | 日韩免费成人av | 91欧美精品成人综合在线观看 | 亚洲第一天堂无码专区 | 久久精品一区 | 草草视频在线播放 | 成人免费激情视频 | 国产91久久久久蜜臀青青天草二 | 日韩在线视频一区二区三区 | 精品久久久网站 | 一本在线 | 国产日韩亚洲欧美 | 免费观看一级毛片 | 成人免费视频久久 | 午夜影院在线观看版 | 午夜视频网 | 91精品国产一区二区三区动漫 | 一区二区三区av | 国产婷婷色综合av蜜臀av | 精品国产一区二区三区日日嗨 | 国产区视频在线观看 | 欧美中文一区 | 国产乱码精品一区二区三区忘忧草 | 丁香久久 | caoporn视频| 精品视频一区二区 | 99久久日韩精品免费热麻豆美女 | 五月天国产视频 | 盗摄精品av一区二区三区 | 国产精品免费一区二区 | 亚洲成人中文字幕 | 中文亚洲字幕 | 欧美一区二区黄 | 欧美成人综合 | 视频一区二区三区四区五区 | 亚洲精品一区中文字幕乱码 | 日韩视频一区二区 | 日韩和的一区二区 | 亚洲视频免费在线播放 | 国产精品一区在线 |