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

QQ登錄

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

搜索

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

查看數(shù): 4032 | 評(píng)論數(shù): 18 | 收藏 2
關(guān)燈 | 提示:支持鍵盤(pán)翻頁(yè)<-左 右->
    組圖打開(kāi)中,請(qǐng)稍候......
發(fā)布時(shí)間: 2022-12-6 17:35

正文摘要:

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

回復(fù)

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é)以致用!謝謝!
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)讀。
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ù)了。謝謝解答!
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ù)忘記了。謝謝解答!
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)題
如果端口一切正常,那就去檢查一下按鍵部分的代碼
ID:123289 發(fā)表于 2022-12-7 15:31
再讀一讀IO的手冊(cè)部分。對(duì)照一下,程序是如何處理IO口的。
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ù)制代碼
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)笑啦
ID:213173 發(fā)表于 2022-12-7 10:54
mcuhui 發(fā)表于 2022-12-7 09:08
還請(qǐng)大師賜教,就是菜鳥(niǎo)一個(gè)不懂啊?粗鳫EX文件是有生成的。所以不知道為何會(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)......
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è)警告該如何解決?
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口
ID:624769 發(fā)表于 2022-12-7 08:59
mcuhui 發(fā)表于 2022-12-7 08:08
這是編譯的結(jié)果

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

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

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

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

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

快速回復(fù) 返回頂部 返回列表