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

標(biāo)題: STC8H1K28單片機(jī)按鍵程序移植問題 按鍵就不能控制端口輸出高低電平 [打印本頁]

作者: mcuhui    時(shí)間: 2022-12-6 17:35
標(biāo)題: STC8H1K28單片機(jī)按鍵程序移植問題 按鍵就不能控制端口輸出高低電平
如下程序,在STC8H1K17 -TSSOP-20上運(yùn)行正常,移植到STC8H1K28-LQFP-28上任何按鍵就不能控制端口輸出高低電平了。根據(jù)端口設(shè)置我也重新定義和配置了。查了規(guī)格書也沒有查出來什么問題,特此請教各位大師!望不吝賜教。

單片機(jī)源程序如下:
#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標(biāo)志位
u16 press_delay = 0;        //按下計(jì)數(shù)器標(biāo)志位
u16 release_delay = 0;      //放開計(jì)數(shù)器標(biāo)志位
u8 key_val = 0;                                 //增加按鍵標(biāo)志位
u8 click_count = 0;                        //增加按鍵次數(shù)

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

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

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;      //控制端狀態(tài)取反
        
        click_count = 0;
   }
   else if(key_val==1)
   {
    sta = ~sta;     //控制端狀態(tài)取反
        
   }
   else if(key_val==2)
   {
    ledr = ~ledr;    //控制端口狀態(tài)取反
    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();
}
}



作者: coody_sz    時(shí)間: 2022-12-6 21:58
while(1)
{
         void key_pos();
}

這樣寫編譯能通過嗎?
作者: mcuhui    時(shí)間: 2022-12-7 08:03
coody_sz 發(fā)表于 2022-12-6 21:58
while(1)
{
         void key_pos();

只是有警告但是還是能通過的。
作者: mcuhui    時(shí)間: 2022-12-7 08:08
這是編譯的結(jié)果

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

by.png

作者: 1261867136qq    時(shí)間: 2022-12-7 08:21
我懷疑沒配置好, 你貼出電路圖,比較相對(duì)應(yīng)的IO管腳上,功能是否一樣? 畢竟一個(gè)20PIN ,一個(gè)28PIN
作者: 張?zhí)鞄?nbsp;   時(shí)間: 2022-12-7 08:52
P2M0 = 0xb8;     //修改P27;P20端口為推挽輸出
把SW--P2.0改為弱上拉準(zhǔn)雙向口!!!
作者: mcuhui    時(shí)間: 2022-12-7 08:53
圖片為兩個(gè)MCU的引腳配置電路圖

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

STC8H1K17.png

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

STC8H1K28.png

作者: 188610329    時(shí)間: 2022-12-7 08:59
mcuhui 發(fā)表于 2022-12-7 08:08
這是編譯的結(jié)果

你理解一下這個(gè)警告的意思,想一想,出了這個(gè)警告之后,編譯通過沒通過,有區(qū)別么?
作者: mcuhui    時(shí)間: 2022-12-7 09:04
張?zhí)鞄?發(fā)表于 2022-12-7 08:52
P2M0 = 0xb8;     //修改P27;P20端口為推挽輸出
把SW--P2.0改為弱上拉準(zhǔn)雙向口!!!

大師,改過試過呢,P2M0 = 0xb8;這就是P2.0口配置為雙向IO口
作者: mcuhui    時(shí)間: 2022-12-7 09:08
188610329 發(fā)表于 2022-12-7 08:59
你理解一下這個(gè)警告的意思,想一想,出了這個(gè)警告之后,編譯通過沒通過,有區(qū)別么?

還請大師賜教,就是菜鳥一個(gè)不懂啊。看著HEX文件是有生成的。所以不知道為何會(huì)有這個(gè)警告,也不知這個(gè)警告該如何解決?

作者: wulin    時(shí)間: 2022-12-7 10:54
mcuhui 發(fā)表于 2022-12-7 09:08
還請大師賜教,就是菜鳥一個(gè)不懂啊。看著HEX文件是有生成的。所以不知道為何會(huì)有這個(gè)警告,也不知這個(gè)警 ...

沙發(fā)已經(jīng)指出錯(cuò)誤,而且這個(gè)錯(cuò)誤會(huì)導(dǎo)致按鍵程序不能正常運(yùn)行。去掉void關(guān)鍵詞試試。
while(1)
{
         key_pos();
}
樓主這段原代碼寫的實(shí)在有點(diǎn)......
作者: mcuhui    時(shí)間: 2022-12-7 11:04
wulin 發(fā)表于 2022-12-7 10:54
沙發(fā)已經(jīng)指出錯(cuò)誤,而且這個(gè)錯(cuò)誤會(huì)導(dǎo)致按鍵程序不能正常運(yùn)行。去掉void關(guān)鍵詞試試。
while(1)
{

我也發(fā)現(xiàn)了這個(gè)問題,把void去掉就不會(huì)有編譯警告。但是還是不能控制高低電平輸出。知道自己幾斤幾兩的水平,但是沒辦法就這點(diǎn)能力,大師見笑啦
作者: wulin    時(shí)間: 2022-12-7 14:22
mcuhui 發(fā)表于 2022-12-7 11:04
我也發(fā)現(xiàn)了這個(gè)問題,把void去掉就不會(huì)有編譯警告。但是還是不能控制高低電平輸出。知道自己幾斤幾兩的水 ...

給你寫一個(gè)適合STC8系列的長短按程序示例,基本通用于STC所有1T單片機(jī)。
  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. //定時(shí)器初始化程序
  9. void Timer0Init(void)                //1毫秒@11.0592MHz
  10. {
  11.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  12.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  13.         TL0 = 0xCD;                //設(shè)置定時(shí)初始值
  14.         TH0 = 0xD4;                //設(shè)置定時(shí)初始值
  15.         TF0 = 0;                //清除TF0標(biāo)志
  16.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  17. }


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

  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;//長按任務(wù)
  31.                 }
  32.         }
  33.         else                                //松手
  34.         {
  35.                 if(time>key_S && time<key_L)//短按
  36.                 {
  37.                         sta = ~sta;//短按任務(wù)
  38.                 }
  39.                 time=0;
  40.         }
  41. }

  42. void main()//主函數(shù)
  43. {
  44. //所有端口初始化為準(zhǔn)雙向口
  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();//初始化定時(shí)器
  64.         while(1)
  65.         {
  66.                 if(TF0)//查詢定時(shí)器中斷請求位
  67.                 {
  68.                         TF0=0;//清0
  69.                         keyscan();                //按鍵掃描函數(shù)
  70.                 }
  71.         }
  72. }
復(fù)制代碼

作者: yzwzfyz    時(shí)間: 2022-12-7 15:31
再讀一讀IO的手冊部分。對(duì)照一下,程序是如何處理IO口的。
作者: Y_G_G    時(shí)間: 2022-12-7 17:10
我經(jīng)常犯這種錯(cuò)誤:一段代碼運(yùn)行多次之后,只要結(jié)果是符合我的要求了,我就認(rèn)為我這段代碼沒有問題了
但是,當(dāng)我把這段代碼用到別的地方了,才發(fā)現(xiàn):我之前的代碼根本是錯(cuò)誤的,能正常運(yùn)行可能是誤打誤撞的
你這代碼本就不多,自己用排除法就行
1:把按鍵什么的代碼都不要了,只要幾行代碼,端口初始化,再把一個(gè)端口拉高,燒錄看一下,問題就能找到了
如果端口沒有高電平,那么,不是端口配置不正確就是硬件的問題
如果端口一切正常,那就去檢查一下按鍵部分的代碼
作者: mcuhui    時(shí)間: 2022-12-8 08:20
yzwzfyz 發(fā)表于 2022-12-7 15:31
再讀一讀IO的手冊部分。對(duì)照一下,程序是如何處理IO口的。

嗯,還是怪自己學(xué)藝不精,太菜了。還沒有搞懂這其中的原理,后來我又仔細(xì)的看了一遍原先的STC8H1K17的代碼已經(jīng)規(guī)格書,發(fā)現(xiàn)既然把定時(shí)函數(shù)忘記了。謝謝解答!
作者: mcuhui    時(shí)間: 2022-12-8 08:21
Y_G_G 發(fā)表于 2022-12-7 17:10
我經(jīng)常犯這種錯(cuò)誤:一段代碼運(yùn)行多次之后,只要結(jié)果是符合我的要求了,我就認(rèn)為我這段代碼沒有問題了
但是,當(dāng) ...

是的,后來我就嘗試著在其它端口去測試看看代碼能不能正常允許然后再去找問題點(diǎn),結(jié)果發(fā)現(xiàn)是忘記加定時(shí)函數(shù)了。謝謝解答!
作者: yzwzfyz    時(shí)間: 2022-12-8 08:55
你不菜,只是未找到學(xué)習(xí)的方法。
學(xué)單片機(jī),最重要的是讀通CPU手冊。
你想啊,你要做A,如果對(duì)A不了解,如果做得精,做得好。
記住永遠(yuǎn)的法則:要控制什么,就必須先了解什么!!!
所以,只有讀通手冊,才能精通單片機(jī)!!
當(dāng)你了解了CPU之后,寫程序的目的,措施就明確了,對(duì)他人的經(jīng)典的程序也就能理解了,寫程序也就不難了。
勸君,花個(gè)把月,讀通CPU。不會(huì)的可以與我討論。我就喜歡讀各式各樣的器件手冊。只要是PCB板上有的東東,手冊都找來讀。
作者: mcuhui    時(shí)間: 2022-12-8 10:14
yzwzfyz 發(fā)表于 2022-12-8 08:55
你不菜,只是未找到學(xué)習(xí)的方法。
學(xué)單片機(jī),最重要的是讀通CPU手冊。
你想啊,你要做A,如果對(duì)A不了解, ...

感謝大師的鼓勵(lì),一定會(huì)好好看規(guī)格書并學(xué)以致用!謝謝!




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产成人综合网 | 精品免费视频 | 久久精品国产免费一区二区三区 | 亚洲一区二区在线视频 | 国产成人精品一区二 | 成年无码av片在线 | 一区二区日韩精品 | h视频在线免费 | 国产伦一区二区三区视频 | 欧美日韩不卡 | 中文字幕亚洲欧美日韩在线不卡 | 操久久| 欧美一级二级三级视频 | 精品欧美一区二区三区久久久 | 欧美一区二区在线 | 国产成人免费网站 | 国产一区二区三区在线 | 国产羞羞视频在线观看 | 午夜视频一区二区 | 人人九九精 | 毛片入口 | 精品一区二区在线观看 | 成人在线视频一区二区三区 | 视频1区| 国产日韩欧美 | 亚洲天堂中文字幕 | 亚洲一区网站 | 日韩视频免费在线 | 福利视频网址 | 岛国av免费看 | 久久国产精品视频免费看 | 久久国产一区二区 | 91色在线视频 | 欧美综合在线观看 | 精品区一区二区 | 日本免费黄色一级片 | 黄色av观看 | 国产欧美日韩 | 欧美成人h版在线观看 | 黄片毛片在线观看 | 国产yw851.c免费观看网站 |