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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

STC8H1K28單片機按鍵程序移植問題 按鍵就不能控制端口輸出高低電平

查看數: 3762 | 評論數: 18 | 收藏 2
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2022-12-6 17:35

正文摘要:

如下程序,在STC8H1K17 -TSSOP-20上運行正常,移植到STC8H1K28-LQFP-28上任何按鍵就不能控制端口輸出高低電平了。根據端口設置我也重新定義和配置了。查了規格書也沒有查出來什么問題,特此請教各位大師!望不吝賜教 ...

回復

ID:1001745 發表于 2022-12-8 10:14
yzwzfyz 發表于 2022-12-8 08:55
你不菜,只是未找到學習的方法。
學單片機,最重要的是讀通CPU手冊。
你想啊,你要做A,如果對A不了解, ...

感謝大師的鼓勵,一定會好好看規格書并學以致用!謝謝!
ID:123289 發表于 2022-12-8 08:55
你不菜,只是未找到學習的方法。
學單片機,最重要的是讀通CPU手冊。
你想啊,你要做A,如果對A不了解,如果做得精,做得好。
記住永遠的法則:要控制什么,就必須先了解什么!!!
所以,只有讀通手冊,才能精通單片機!!
當你了解了CPU之后,寫程序的目的,措施就明確了,對他人的經典的程序也就能理解了,寫程序也就不難了。
勸君,花個把月,讀通CPU。不會的可以與我討論。我就喜歡讀各式各樣的器件手冊。只要是PCB板上有的東東,手冊都找來讀。
ID:1001745 發表于 2022-12-8 08:21
Y_G_G 發表于 2022-12-7 17:10
我經常犯這種錯誤:一段代碼運行多次之后,只要結果是符合我的要求了,我就認為我這段代碼沒有問題了
但是,當 ...

是的,后來我就嘗試著在其它端口去測試看看代碼能不能正常允許然后再去找問題點,結果發現是忘記加定時函數了。謝謝解答!
ID:1001745 發表于 2022-12-8 08:20
yzwzfyz 發表于 2022-12-7 15:31
再讀一讀IO的手冊部分。對照一下,程序是如何處理IO口的。

嗯,還是怪自己學藝不精,太菜了。還沒有搞懂這其中的原理,后來我又仔細的看了一遍原先的STC8H1K17的代碼已經規格書,發現既然把定時函數忘記了。謝謝解答!
ID:401564 發表于 2022-12-7 17:10
我經常犯這種錯誤:一段代碼運行多次之后,只要結果是符合我的要求了,我就認為我這段代碼沒有問題了
但是,當我把這段代碼用到別的地方了,才發現:我之前的代碼根本是錯誤的,能正常運行可能是誤打誤撞的
你這代碼本就不多,自己用排除法就行
1:把按鍵什么的代碼都不要了,只要幾行代碼,端口初始化,再把一個端口拉高,燒錄看一下,問題就能找到了
如果端口沒有高電平,那么,不是端口配置不正確就是硬件的問題
如果端口一切正常,那就去檢查一下按鍵部分的代碼
ID:123289 發表于 2022-12-7 15:31
再讀一讀IO的手冊部分。對照一下,程序是如何處理IO口的。
ID:213173 發表于 2022-12-7 14:22
mcuhui 發表于 2022-12-7 11:04
我也發現了這個問題,把void去掉就不會有編譯警告。但是還是不能控制高低電平輸出。知道自己幾斤幾兩的水 ...

給你寫一個適合STC8系列的長短按程序示例,基本通用于STC所有1T單片機。
  1. #include "STC8H.H"
  2. #include "intrins.h"

  3. #define key_S 15                                //宏定義短按(約15ms)
  4. #define key_L key_S*67                        //宏定義長按(約1s)

  5. sbit SW=P2^0;
  6. sbit sta=P2^7;
  7. sbit ledr=P3^0;

  8. //定時器初始化程序
  9. void Timer0Init(void)                //1毫秒@11.0592MHz
  10. {
  11.         AUXR |= 0x80;                //定時器時鐘1T模式
  12.         TMOD &= 0xF0;                //設置定時器模式
  13.         TL0 = 0xCD;                //設置定時初始值
  14.         TH0 = 0xD4;                //設置定時初始值
  15.         TF0 = 0;                //清除TF0標志
  16.         TR0 = 1;                //定時器0開始計時
  17. }


  18. void keyscan()
  19. {
  20.         static unsigned int time=0;//計數變量

  21.         if(!SW)//按鍵按下
  22.         {
  23.                 time++;
  24.                 if(time>key_L)
  25.                 {
  26.                         time=key_L+1;//防止time溢出
  27.                 }
  28.                 if(time==key_L)//長按
  29.                 {
  30.                         ledr = ~ledr;//長按任務
  31.                 }
  32.         }
  33.         else                                //松手
  34.         {
  35.                 if(time>key_S && time<key_L)//短按
  36.                 {
  37.                         sta = ~sta;//短按任務
  38.                 }
  39.                 time=0;
  40.         }
  41. }

  42. void main()//主函數
  43. {
  44. //所有端口初始化為準雙向口
  45.         P0M0 = 0x00;
  46.         P0M1 = 0x00;
  47.         P1M0 = 0x00;
  48.         P1M1 = 0x00;
  49.         P2M0 = 0x00;
  50.         P2M1 = 0x00;
  51.         P3M0 = 0x00;
  52.         P3M1 = 0x00;
  53.         P4M0 = 0x00;
  54.         P4M1 = 0x00;
  55.         P5M0 = 0x00;
  56.         P5M1 = 0x00;
  57.         P6M0 = 0x00;
  58.         P6M1 = 0x00;
  59.         P7M0 = 0x00;
  60.         P7M1 = 0x00;
  61.         sta = 1;
  62.         ledr=0;
  63.         Timer0Init();//初始化定時器
  64.         while(1)
  65.         {
  66.                 if(TF0)//查詢定時器中斷請求位
  67.                 {
  68.                         TF0=0;//清0
  69.                         keyscan();                //按鍵掃描函數
  70.                 }
  71.         }
  72. }
復制代碼
ID:1001745 發表于 2022-12-7 11:04
wulin 發表于 2022-12-7 10:54
沙發已經指出錯誤,而且這個錯誤會導致按鍵程序不能正常運行。去掉void關鍵詞試試。
while(1)
{

我也發現了這個問題,把void去掉就不會有編譯警告。但是還是不能控制高低電平輸出。知道自己幾斤幾兩的水平,但是沒辦法就這點能力,大師見笑啦
ID:213173 發表于 2022-12-7 10:54
mcuhui 發表于 2022-12-7 09:08
還請大師賜教,就是菜鳥一個不懂啊。看著HEX文件是有生成的。所以不知道為何會有這個警告,也不知這個警 ...

沙發已經指出錯誤,而且這個錯誤會導致按鍵程序不能正常運行。去掉void關鍵詞試試。
while(1)
{
         key_pos();
}
樓主這段原代碼寫的實在有點......
ID:1001745 發表于 2022-12-7 09:08
188610329 發表于 2022-12-7 08:59
你理解一下這個警告的意思,想一想,出了這個警告之后,編譯通過沒通過,有區別么?

還請大師賜教,就是菜鳥一個不懂啊。看著HEX文件是有生成的。所以不知道為何會有這個警告,也不知這個警告該如何解決?
ID:1001745 發表于 2022-12-7 09:04
張天師 發表于 2022-12-7 08:52
P2M0 = 0xb8;     //修改P27;P20端口為推挽輸出
把SW--P2.0改為弱上拉準雙向口!!!

大師,改過試過呢,P2M0 = 0xb8;這就是P2.0口配置為雙向IO口
ID:624769 發表于 2022-12-7 08:59
mcuhui 發表于 2022-12-7 08:08
這是編譯的結果

你理解一下這個警告的意思,想一想,出了這個警告之后,編譯通過沒通過,有區別么?
ID:814525 發表于 2022-12-7 08:52
P2M0 = 0xb8;     //修改P27;P20端口為推挽輸出
把SW--P2.0改為弱上拉準雙向口!!!
ID:308903 發表于 2022-12-7 08:21
我懷疑沒配置好, 你貼出電路圖,比較相對應的IO管腳上,功能是否一樣? 畢竟一個20PIN ,一個28PIN
ID:1001745 發表于 2022-12-7 08:03
coody_sz 發表于 2022-12-6 21:58
while(1)
{
         void key_pos();

只是有警告但是還是能通過的。
ID:1034262 發表于 2022-12-6 21:58
while(1)
{
         void key_pos();
}

這樣寫編譯能通過嗎?

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一区三区 | 国产精品久久久久久久久久了 | 久久国产精品精品国产色婷婷 | 亚洲人人 | 国产一区二区三区在线视频 | 亚洲综合色网站 | 拍戏被cao翻了h承欢 | 日韩福利 | 欧美xxxx色视频在线观看免费 | 欧美一级片久久 | 欧美日韩亚洲国产 | 午夜欧美一区二区三区在线播放 | 精品欧美乱码久久久久久 | 免费精品 | 国产精品免费播放 | 国产精品免费看 | 99re6在线视频精品免费 | 中文字幕一区在线 | 成人精品在线视频 | 国产黄色一级电影 | 日韩午夜一区二区三区 | 日韩av一区二区在线观看 | 成人av播放| 神马久久香蕉 | 亚洲视频一区在线观看 | 欧美激情精品久久久久久 | 插插插干干干 | 狠狠操在线 | 亚洲综合二区 | 国产91色在线 | 亚洲 | 香蕉av免费 | 亚洲精品99 | 中文字幕国产精品 | 欧美一级免费黄色片 | 国产一区二区免费 | 6996成人影院网在线播放 | 久久久久久成人 | 中文字幕在线电影观看 | 午夜影院黄 | 久久伊人亚洲 | 国产精品一区三区 |