找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2693|回復(fù): 6
收起左側(cè)

51單片機(jī)向STC8H移植問題

[復(fù)制鏈接]
ID:743542 發(fā)表于 2022-1-10 17:57 | 顯示全部樓層 |閱讀模式
大佬們,我最近在學(xué)習(xí)寫STC8單片機(jī)的程序,但是我之前只學(xué)過89C51的,而且我不知道怎么規(guī)范化程序。官方的文檔看起來也很晦澀,有沒有大佬能夠指導(dǎo)一下我的這個(gè)程序的移植問題~我是用89C51寫的兩個(gè)按鍵來控制數(shù)碼管顯示0-8,并且輸出數(shù)字到P2口,向STC8移植并且規(guī)范化需要怎么來寫呢?
  1. #include<reg51.h>
  2. #define uchar unsigned char        
  3. #define uint unsigned int
  4. sbit key=P0^0;
  5. sbit key1=P0^1;
  6. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  7. void delay_lms(uint i){
  8.         uchar t;
  9.         while(i--)
  10.                 for(t=0;t<=150;t++);
  11. }
  12. void main(){
  13.         uchar i=0;
  14.         key=1;
  15.         P1=0xc0;
  16.         while(1){
  17.                 if(key==0){
  18.                         delay_lms(20);
  19.                         if(key==0){
  20.                                 if(i<=6){i++;}
  21.                                 else{i=7;}
  22.                                 
  23.                                 P1=tab[i];
  24.                                 P2=i;
  25.                                 if(i==7)i=7;
  26.                         }
  27.                                 while(key==0);
  28.                 }
  29.                 if(key1==0){
  30.                         delay_lms(20);
  31.                         if(key1==0){
  32.                                 if(i>=1){i--;}
  33.                                 else{i=0;}
  34.                                 P1=tab[i];
  35.                                 P2=i;
  36.                                 if(i==0)i=0;
  37.                         }
  38.                                 while(key1==0);
  39.                 }
  40.         }
  41. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-1-10 18:58 | 顯示全部樓層
你的代碼很簡單
沒有用到任何寄存器,可直接使用
但要注意:除P3.0和P3.1外,其余所有I/O口上電后的狀態(tài)均為高阻輸入狀態(tài),
在使用I/O口時(shí)必須先設(shè)置I/O口模式
2022-01-10_185818.png
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;

    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;

而目STC8比傳統(tǒng)51單片機(jī)快12倍
延時(shí)函數(shù)要改一改

題外話:阻塞式延時(shí)浪費(fèi)系統(tǒng)資源,少用為妙
回復(fù)

使用道具 舉報(bào)

ID:743542 發(fā)表于 2022-1-10 19:36 | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-10 18:58
你的代碼很簡單
沒有用到任何寄存器,可直接使用
但要注意:除P3.0和P3.1外,其余所有I/O口上電后的狀態(tài) ...

謝謝大佬的回復(fù)!我看了官方的例程,已經(jīng)將I/O口初始化了,但是我現(xiàn)在的主要的問題是我現(xiàn)在的輸出最高就是0x07,但是我不知道怎么在不改變0x0x的情況下進(jìn)行寫入數(shù)據(jù),我只知道應(yīng)該用或/非,但是不知道具體怎么操作,另外就是我現(xiàn)在寫的代碼很簡單,但是如果我繼續(xù)加功能這樣寫肯定是不行的,我規(guī)范化的話該怎么寫呢?
回復(fù)

使用道具 舉報(bào)

ID:57657 發(fā)表于 2022-1-10 21:43 | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-10 18:58
你的代碼很簡單
沒有用到任何寄存器,可直接使用
但要注意:除P3.0和P3.1外,其余所有I/O口上電后的狀態(tài) ...

你應(yīng)該直接用STC提供的頭文件,除頭文件外 不要用 sfr。
不同型號(hào)的某些寄存器sfr地址都可能不一樣,否則出現(xiàn)問題都找不到北。
1.png
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-1-10 21:45 | 顯示全部樓層
erevn38107 發(fā)表于 2022-1-10 19:36
謝謝大佬的回復(fù)!我看了官方的例程,已經(jīng)將I/O口初始化了,但是我現(xiàn)在的主要的問題是我現(xiàn)在的輸出最高就 ...

你這情況是需要學(xué)習(xí)一下單片機(jī)的C語言
回復(fù)

使用道具 舉報(bào)

ID:884042 發(fā)表于 2022-1-12 19:17 | 顯示全部樓層
STC8H還是基于8051內(nèi)核改的,只不過是增加了can,adc,pwn,pac等模塊,所以只要你的程序沒用到其它的一些特殊寄存器的話直接復(fù)制程序就得了。。。。。。。
回復(fù)

使用道具 舉報(bào)

ID:382454 發(fā)表于 2022-1-12 22:14 | 顯示全部樓層
記住學(xué)會(huì)用模塊化編程。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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