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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4130|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

STC8H1K28單片機(jī)按鍵程序移植問(wèn)題 按鍵就不能控制端口輸出高低電平

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
如下程序,在STC8H1K17 -TSSOP-20上運(yùn)行正常,移植到STC8H1K28-LQFP-28上任何按鍵就不能控制端口輸出高低電平了。根據(jù)端口設(shè)置我也重新定義和配置了。查了規(guī)格書(shū)也沒(méi)有查出來(lái)什么問(wèn)題,特此請(qǐng)教各位大師!望不吝賜教。

單片機(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;      //放開(kāi)計(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)         //長(zhǎng)按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();
}
}


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

使用道具 舉報(bào)

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

這樣寫(xiě)編譯能通過(guò)嗎?
回復(fù)

使用道具 舉報(bào)

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

只是有警告但是還是能通過(guò)的。
回復(fù)

使用道具 舉報(bào)

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

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

by.png
回復(fù)

使用道具 舉報(bào)

5#
ID:308903 發(fā)表于 2022-12-7 08:21 | 只看該作者
我懷疑沒(méi)配置好, 你貼出電路圖,比較相對(duì)應(yīng)的IO管腳上,功能是否一樣? 畢竟一個(gè)20PIN ,一個(gè)28PIN
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

7#
ID:1001745 發(fā)表于 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
回復(fù)

使用道具 舉報(bào)

8#
ID:624769 發(fā)表于 2022-12-7 08:59 來(lái)自觸屏版 | 只看該作者
mcuhui 發(fā)表于 2022-12-7 08:08
這是編譯的結(jié)果

你理解一下這個(gè)警告的意思,想一想,出了這個(gè)警告之后,編譯通過(guò)沒(méi)通過(guò),有區(qū)別么?
回復(fù)

使用道具 舉報(bào)

9#
ID:1001745 發(fā)表于 2022-12-7 09:04 | 只看該作者
張?zhí)鞄?發(fā)表于 2022-12-7 08:52
P2M0 = 0xb8;     //修改P27;P20端口為推挽輸出
把SW--P2.0改為弱上拉準(zhǔn)雙向口。!

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

使用道具 舉報(bào)

10#
ID:1001745 發(fā)表于 2022-12-7 09:08 | 只看該作者
188610329 發(fā)表于 2022-12-7 08:59
你理解一下這個(gè)警告的意思,想一想,出了這個(gè)警告之后,編譯通過(guò)沒(méi)通過(guò),有區(qū)別么?

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

使用道具 舉報(bào)

11#
ID:213173 發(fā)表于 2022-12-7 10:54 | 只看該作者
mcuhui 發(fā)表于 2022-12-7 09:08
還請(qǐng)大師賜教,就是菜鳥(niǎo)一個(gè)不懂啊。看著HEX文件是有生成的。所以不知道為何會(huì)有這個(gè)警告,也不知這個(gè)警 ...

沙發(fā)已經(jīng)指出錯(cuò)誤,而且這個(gè)錯(cuò)誤會(huì)導(dǎo)致按鍵程序不能正常運(yùn)行。去掉void關(guān)鍵詞試試。
while(1)
{
         key_pos();
}
樓主這段原代碼寫(xiě)的實(shí)在有點(diǎn)......
回復(fù)

使用道具 舉報(bào)

12#
ID:1001745 發(fā)表于 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è)問(wèn)題,把void去掉就不會(huì)有編譯警告。但是還是不能控制高低電平輸出。知道自己幾斤幾兩的水平,但是沒(méi)辦法就這點(diǎn)能力,大師見(jiàn)笑啦
回復(fù)

使用道具 舉報(bào)

13#
ID:213173 發(fā)表于 2022-12-7 14:22 | 只看該作者
mcuhui 發(fā)表于 2022-12-7 11:04
我也發(fā)現(xiàn)了這個(gè)問(wèn)題,把void去掉就不會(huì)有編譯警告。但是還是不能控制高低電平輸出。知道自己幾斤幾兩的水 ...

給你寫(xiě)一個(gè)適合STC8系列的長(zhǎng)短按程序示例,基本通用于STC所有1T單片機(jī)。
  1. #include "STC8H.H"
  2. #include "intrins.h"

  3. #define key_S 15                                //宏定義短按(約15ms)
  4. #define key_L key_S*67                        //宏定義長(zhǎng)按(約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開(kāi)始計(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)//長(zhǎng)按
  29.                 {
  30.                         ledr = ~ledr;//長(zhǎng)按任務(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í)器中斷請(qǐng)求位
  67.                 {
  68.                         TF0=0;//清0
  69.                         keyscan();                //按鍵掃描函數(shù)
  70.                 }
  71.         }
  72. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

嗯,還是怪自己學(xué)藝不精,太菜了。還沒(méi)有搞懂這其中的原理,后來(lái)我又仔細(xì)的看了一遍原先的STC8H1K17的代碼已經(jīng)規(guī)格書(shū),發(fā)現(xiàn)既然把定時(shí)函數(shù)忘記了。謝謝解答!
回復(fù)

使用道具 舉報(bào)

17#
ID:1001745 發(fā)表于 2022-12-8 08:21 | 只看該作者
Y_G_G 發(fā)表于 2022-12-7 17:10
我經(jīng)常犯這種錯(cuò)誤:一段代碼運(yùn)行多次之后,只要結(jié)果是符合我的要求了,我就認(rèn)為我這段代碼沒(méi)有問(wèn)題了
但是,當(dāng) ...

是的,后來(lái)我就嘗試著在其它端口去測(cè)試看看代碼能不能正常允許然后再去找問(wèn)題點(diǎn),結(jié)果發(fā)現(xiàn)是忘記加定時(shí)函數(shù)了。謝謝解答!
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩三区 | 国产精品精品视频一区二区三区 | 欧美一区二区三区久久精品 | 精品欧美一区二区三区久久久 | 中文天堂在线一区 | 国产成人精品一区二区三区网站观看 | 欧美性猛交一区二区三区精品 | 久久亚洲一区二区三区四区 | 精品一区二区av | 一区欧美 | 一级片网址 | caoporon| 日本人和亚洲人zjzjhd | 国产精品区二区三区日本 | 亚洲欧美日韩精品久久亚洲区 | 亚洲精品视频导航 | 操久久| 午夜精品91 | 99免费在线 | 性高湖久久久久久久久aaaaa | 久久最新精品 | 成年人黄色免费视频 | 黑人性hd| 黑人巨大精品欧美黑白配亚洲 | 黄色电影在线免费观看 | 一区二区三区网站 | 日韩免费视频 | 国产精品久久久久aaaa | 国产精品久久国产愉拍 | 91麻豆精品国产91久久久久久 | 中文字幕av一区 | 亚洲天堂av网 | 国产精品久久久久久网站 | 夜夜骑首页 | 亚洲综合无码一区二区 | 欧美va大片 | 少妇无套高潮一二三区 | 草草草网站 | 亚洲成人网在线 | 欧美精品成人一区二区三区四区 | 国产清纯白嫩初高生在线播放视频 |