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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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

單片機源程序如下:
#include "STC8H.H"
#include "intrins.h"

typedef unsigned char   u8;
typedef unsigned int    u16;
bit flag_400ms=1,flag_1s=1,flag_5s=1;
bit flag_1ms = 0;                         //1ms標志位
u16 press_delay = 0;        //按下計數器標志位
u16 release_delay = 0;      //放開計數器標志位
u8 key_val = 0;                                 //增加按鍵標志位
u8 click_count = 0;                        //增加按鍵次數

sbit SW=P2^0;
sbit sta=P2^7;
sbit ledr=P3^0;

void Timer0()interrupt 1
{
TH0 = 0xfc;         //給定時器賦初始值為1ms
TL0 = 0x18;         
flag_1ms = 1;       //1ms標志位
}

void key_pos()
{
if(flag_1ms==1)
{
  flag_1ms = 0;
  if(SW==0)           //判斷模式按鍵是否按下
  {
   if(press_delay<0xffff)press_delay++;
   if(press_delay==20)                 //20ms消抖處理
   {
    click_count++;
   }
   if(press_delay==3000)
   {
    key_val = 10;
   }
   release_delay = 0;
  }
  else
  {
   if(release_delay<0xff)release_delay++;
   if(release_delay==200)
   if(press_delay<3000)
   {
    key_val = click_count;
        click_count = 0;
   }
   press_delay = 0;
  }
  if(key_val > 0)         //若有按鍵按下
  {
   if(key_val==10)         //長按1.5s
   {
    ledr = ~ledr;      //控制端狀態取反
        
        click_count = 0;
   }
   else if(key_val==1)
   {
    sta = ~sta;     //控制端狀態取反
        
   }
   else if(key_val==2)
   {
    ledr = ~ledr;    //控制端口狀態取反
    sta = ~sta;
        
   }

   key_val = 0;
  }
}
}

void main()
{

    P0M1 = 0x0d;        //修改P00端口高阻改為推挽
    P0M0 = 0x00;        //修改p00端口高阻模式改為推挽模式   
    P1M1 = 0xc0;
    P1M0 = 0x3F;
    P2M1 = 0x00;        
    P2M0 = 0xb8;                           //修改P27;P20端口為推挽輸出
    P3M1 = 0x88;
    P3M0 = 0x02;
        sta = 1;
        ledr=0;
         
while(1)
{
         void key_pos();
}
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1034262 發表于 2022-12-6 21:58 | 只看該作者
while(1)
{
         void key_pos();
}

這樣寫編譯能通過嗎?
回復

使用道具 舉報

板凳
ID:1001745 發表于 2022-12-7 08:03 | 只看該作者
coody_sz 發表于 2022-12-6 21:58
while(1)
{
         void key_pos();

只是有警告但是還是能通過的。
回復

使用道具 舉報

地板
ID:1001745 發表于 2022-12-7 08:08 | 只看該作者
這是編譯的結果

by.png (16.83 KB, 下載次數: 60)

by.png
回復

使用道具 舉報

5#
ID:308903 發表于 2022-12-7 08:21 | 只看該作者
我懷疑沒配置好, 你貼出電路圖,比較相對應的IO管腳上,功能是否一樣? 畢竟一個20PIN ,一個28PIN
回復

使用道具 舉報

6#
ID:814525 發表于 2022-12-7 08:52 | 只看該作者
P2M0 = 0xb8;     //修改P27;P20端口為推挽輸出
把SW--P2.0改為弱上拉準雙向口。。
回復

使用道具 舉報

7#
ID:1001745 發表于 2022-12-7 08:53 | 只看該作者
圖片為兩個MCU的引腳配置電路圖

STC8H1K17.png (55.78 KB, 下載次數: 56)

STC8H1K17.png

STC8H1K28.png (152.68 KB, 下載次數: 53)

STC8H1K28.png
回復

使用道具 舉報

8#
ID:624769 發表于 2022-12-7 08:59 來自手機 | 只看該作者
mcuhui 發表于 2022-12-7 08:08
這是編譯的結果

你理解一下這個警告的意思,想一想,出了這個警告之后,編譯通過沒通過,有區別么?
回復

使用道具 舉報

9#
ID:1001745 發表于 2022-12-7 09:04 | 只看該作者
張天師 發表于 2022-12-7 08:52
P2M0 = 0xb8;     //修改P27;P20端口為推挽輸出
把SW--P2.0改為弱上拉準雙向口!!!

大師,改過試過呢,P2M0 = 0xb8;這就是P2.0口配置為雙向IO口
回復

使用道具 舉報

10#
ID:1001745 發表于 2022-12-7 09:08 | 只看該作者
188610329 發表于 2022-12-7 08:59
你理解一下這個警告的意思,想一想,出了這個警告之后,編譯通過沒通過,有區別么?

還請大師賜教,就是菜鳥一個不懂啊?粗鳫EX文件是有生成的。所以不知道為何會有這個警告,也不知這個警告該如何解決?
回復

使用道具 舉報

11#
ID:213173 發表于 2022-12-7 10:54 | 只看該作者
mcuhui 發表于 2022-12-7 09:08
還請大師賜教,就是菜鳥一個不懂啊?粗鳫EX文件是有生成的。所以不知道為何會有這個警告,也不知這個警 ...

沙發已經指出錯誤,而且這個錯誤會導致按鍵程序不能正常運行。去掉void關鍵詞試試。
while(1)
{
         key_pos();
}
樓主這段原代碼寫的實在有點......
回復

使用道具 舉報

12#
ID:1001745 發表于 2022-12-7 11:04 | 只看該作者
wulin 發表于 2022-12-7 10:54
沙發已經指出錯誤,而且這個錯誤會導致按鍵程序不能正常運行。去掉void關鍵詞試試。
while(1)
{

我也發現了這個問題,把void去掉就不會有編譯警告。但是還是不能控制高低電平輸出。知道自己幾斤幾兩的水平,但是沒辦法就這點能力,大師見笑啦
回復

使用道具 舉報

13#
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. }
復制代碼
回復

使用道具 舉報

14#
ID:123289 發表于 2022-12-7 15:31 | 只看該作者
再讀一讀IO的手冊部分。對照一下,程序是如何處理IO口的。
回復

使用道具 舉報

15#
ID:401564 發表于 2022-12-7 17:10 | 只看該作者
我經常犯這種錯誤:一段代碼運行多次之后,只要結果是符合我的要求了,我就認為我這段代碼沒有問題了
但是,當我把這段代碼用到別的地方了,才發現:我之前的代碼根本是錯誤的,能正常運行可能是誤打誤撞的
你這代碼本就不多,自己用排除法就行
1:把按鍵什么的代碼都不要了,只要幾行代碼,端口初始化,再把一個端口拉高,燒錄看一下,問題就能找到了
如果端口沒有高電平,那么,不是端口配置不正確就是硬件的問題
如果端口一切正常,那就去檢查一下按鍵部分的代碼
回復

使用道具 舉報

16#
ID:1001745 發表于 2022-12-8 08:20 | 只看該作者
yzwzfyz 發表于 2022-12-7 15:31
再讀一讀IO的手冊部分。對照一下,程序是如何處理IO口的。

嗯,還是怪自己學藝不精,太菜了。還沒有搞懂這其中的原理,后來我又仔細的看了一遍原先的STC8H1K17的代碼已經規格書,發現既然把定時函數忘記了。謝謝解答!
回復

使用道具 舉報

17#
ID:1001745 發表于 2022-12-8 08:21 | 只看該作者
Y_G_G 發表于 2022-12-7 17:10
我經常犯這種錯誤:一段代碼運行多次之后,只要結果是符合我的要求了,我就認為我這段代碼沒有問題了
但是,當 ...

是的,后來我就嘗試著在其它端口去測試看看代碼能不能正常允許然后再去找問題點,結果發現是忘記加定時函數了。謝謝解答!
回復

使用道具 舉報

18#
ID:123289 發表于 2022-12-8 08:55 | 只看該作者
你不菜,只是未找到學習的方法。
學單片機,最重要的是讀通CPU手冊。
你想啊,你要做A,如果對A不了解,如果做得精,做得好。
記住永遠的法則:要控制什么,就必須先了解什么!!!
所以,只有讀通手冊,才能精通單片機!!
當你了解了CPU之后,寫程序的目的,措施就明確了,對他人的經典的程序也就能理解了,寫程序也就不難了。
勸君,花個把月,讀通CPU。不會的可以與我討論。我就喜歡讀各式各樣的器件手冊。只要是PCB板上有的東東,手冊都找來讀。
回復

使用道具 舉報

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

感謝大師的鼓勵,一定會好好看規格書并學以致用!謝謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99精品视频 | 久久久爽爽爽美女图片 | 男女羞羞视频免费看 | 亚洲国产精品自拍 | 国产精品久久久久久久岛一牛影视 | 在线不卡视频 | 国产高清视频在线观看 | 丝袜久久| 国产精品久久久久久久久久妇女 | 日韩视频免费看 | 久久免费精品 | 日韩中文久久 | 91精品国产91久久久久久密臀 | www精品 | 超碰97人人人人人蜜桃 | 国内久久 | 亚洲视频免费观看 | 久久99精品久久久久蜜桃tv | 操操操操操 | 欧美日韩一区二区在线播放 | 亚洲欧洲在线视频 | 日本免费在线看 | 在线播放一区二区三区 | 97久久精品午夜一区二区 | 国产乱精品一区二区三区 | 男人的天堂久久 | 日日夜夜精品视频 | 亚洲电影一级片 | 亚洲国产一区二区三区四区 | 日本高清中文字幕 | 久久视频精品在线 | 久久久久国产 | 在线一区视频 | 精品啪啪 | 中文字幕 国产精品 | 欧美精品一区二区三区在线播放 | 日韩在线视频一区二区三区 | 国产精品小视频在线观看 | 免费在线观看毛片 | 色必久久 | 自拍偷拍一区二区三区 |