|
大佬們,之前我用STC8AK432S2A12單片機(jī)弄輸入控制輸出的程序。后來換了STC8A8K64D4的板子。然后接收程序不變,中斷程序按照燒錄軟件的例程復(fù)制過來。然而運(yùn)行后一直沒有反應(yīng)。之后一直改都亦是如此。我也是有點(diǎn)懵了。所以浪費(fèi)大佬們的一點(diǎn)時(shí)間來幫我看看具體是什么問題...
#include "main.h"
#include <intrins.h>
unsigned char ucSystemMode = 0;/*系統(tǒng)工作模式,對應(yīng)256個實(shí)驗(yàn)*/
unsigned char CP = 0; /*時(shí)序邏輯門電路需要的時(shí)序信號*/
unsigned char CP_RisingEdge = 0;/*上升沿信號*/
unsigned char CP_FallingEdge = 0;/*下降沿信號*/
sysFunction mdFunctionList[MAX_FUNC_ITEM] =
{
Input1NotDoor, /*1輸入非門*/
/***************兩輸入邏輯門實(shí)驗(yàn)***/
Input2AndDoor, /*兩輸入與門*/
Input2OrNotDoor, /*兩輸入或非門*/
Input2OrDoor, /*兩輸入或門*/
Input2AndNotDoor, /*兩輸入與非門*/
Input2YiHuoDoor, /*兩輸入異或門*/
Input2TongHuoDoor,/*2輸入同或門*/
/**********三輸入邏輯門實(shí)驗(yàn)******/
Input3AndDoor, /*3輸入與門*/
Input3AndNotDoor,/*3輸入與非門*/
Input3OrDoor,/*3輸入或門*/
Input3OrNotDoor, /*3輸入或非門*/
Input3XorDoor,/*3輸入異或門*/
/**********四輸入邏輯門實(shí)驗(yàn)******/
Input4AndDoor,/*4輸入與門*/
Input4AndNotDoor,/*4輸入與非門*/
Input4OrDoor,/*4輸入或門*/
Input4OrNotDoor,/*4輸入或非門*/
/******組合邏輯門電路實(shí)驗(yàn)********/
ComperDoor, /*比較器*/
QuanAdd, /*全加器*/
SiRenBiaoJueQi, /*四人表決器*/
ZuHeLogic1, /*組合邏輯門1*/
ZuHeLogic2, /*組合邏輯門2*/
ParityCheck3, /*三輸入的奇偶校驗(yàn)器*/
BinEncode, /*二進(jìn)制編碼器*/
#if 0
ShanRenBiaoJueQi,/*3人表決器*/
OneBitBanAdd,
/********時(shí)序邏輯門電路實(shí)驗(yàn)*****/
RsTrigger,
DTringger,
JKTrigger,
#endif
};
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*################################################1輸入邏輯門####################################################*/
/******************************************************************************************************************
函數(shù)功能:OutPutPortReset
函數(shù)說明:將輸出端口的電平狀態(tài)進(jìn)行重設(shè)
******************************************************************************************************************/
void OutPutPortReset()
{
OutputPort0 = 0X00;
OutputPort1 = 0X00;
}
/*################################################1輸入邏輯門####################################################*/
/******************************************************************************************************************
函數(shù)功能:1輸入非門
函數(shù)說明:
******************************************************************************************************************/
void Input1NotDoor()
{
OutPutPortReset();
OutputY1 = !InputA;
}
/*################################################2輸入邏輯門####################################################*/
/******************************************************************************************************************
函數(shù)功能:2輸入門
函數(shù)說明:
******************************************************************************************************************/
void Input2AndDoor()
{
OutPutPortReset();
if(InputA && InputB)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函數(shù)功能:2輸入或非門
函數(shù)說明:
******************************************************************************************************************/
void Input2OrNotDoor()
{
OutPutPortReset();
if(!InputA && !InputB)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函數(shù)功能:2輸或門
函數(shù)說明:
******************************************************************************************************************/
void Input2OrDoor()
{
if(InputA || InputB)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函數(shù)功能:2輸入與非門
函數(shù)說明:
******************************************************************************************************************/
void Input2AndNotDoor()
{
unsigned char ucData = InputA & InputB;
OutPutPortReset();
OutputY1 = !ucData;
}
/******************************************************************************************************************
函數(shù)功能:2輸入異或門
函數(shù)說明:相異出1 相同出0
******************************************************************************************************************/
void Input2YiHuoDoor()
{
OutPutPortReset();
if(InputA == InputB)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函數(shù)功能:2輸入同或門
函數(shù)說明:
******************************************************************************************************************/
void Input2TongHuoDoor()
{
OutPutPortReset();
if(InputA == InputB)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/*################################################3輸入邏輯門####################################################*/
/******************************************************************************************************************
函數(shù)功能:3輸入與門
函數(shù)說明:
******************************************************************************************************************/
void Input3AndDoor()
{
OutPutPortReset();
if(InputA && InputB && InputC)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函數(shù)功能:3輸入與非門
函數(shù)說明:
******************************************************************************************************************/
void Input3AndNotDoor()
{
OutPutPortReset();
if(InputA && InputB && InputC)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函數(shù)功能:3輸入或非門
函數(shù)說明:
******************************************************************************************************************/
void Input3OrNotDoor()
{
OutPutPortReset();
if(InputA == 0 && InputB == 0 && InputC == 0)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函數(shù)功能:3輸入或門
函數(shù)說明:
******************************************************************************************************************/
void Input3OrDoor()
{
OutPutPortReset();
if(InputA == 0 && InputB == 0 && InputC == 0)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函數(shù)功能:3輸入或門
函數(shù)說明:
******************************************************************************************************************/
void Input3XorDoor()
{
unsigned char flag = 0;
OutPutPortReset();
if(InputA == InputB)
{
flag = 0;
}
else
{
flag = 1;
}
if(flag == InputC)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函數(shù)功能:4輸入與門
函數(shù)說明:
******************************************************************************************************************/
void Input4AndDoor()
{
OutPutPortReset();
if(InputA && InputB && InputC && InputD)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函數(shù)功能:4輸入與非門
函數(shù)說明:
******************************************************************************************************************/
void Input4AndNotDoor()
{
OutPutPortReset();
if(InputA && InputB && InputC && InputD)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函數(shù)功能:4輸入或門
函數(shù)說明:
******************************************************************************************************************/
void Input4OrDoor()
{
OutPutPortReset();
if(InputA == 0 && InputB == 0 && InputC == 0 && InputD == 0)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函數(shù)功能:4輸入或非門
函數(shù)說明:
******************************************************************************************************************/
void Input4OrNotDoor()
{
OutPutPortReset();
if(InputA == 0 && InputB == 0 && InputC == 0 && InputD == 0)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/*################################################組合邏輯門####################################################*/
/******************************************************************************************************************
函數(shù)功能:比較器
函數(shù)說明:
******************************************************************************************************************/
void ComperDoor()
{
OutPutPortReset();
/*Y1 = A + B*/
if(InputA || InputB )
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
/*Y2 = /A + B*/
if(!InputA || InputB)
{
OutputY2 = 1;
}
else
{
OutputY2 = 0;
}
/*Y3 = /A/B*/
if(!InputA || !InputB)
{
OutputY3 = 1;
}
else
{
OutputY3 = 0;
}
/*Y4 = /Y1/Y2/Y3*/
OutputY4 = !(OutputY1 & OutputY2 & OutputY3);
/*邏輯功能A大于等于B則輸出高電平,否則輸出低電平*/
}
/******************************************************************************************************************
函數(shù)功能:一位半加器
函數(shù)說明:
******************************************************************************************************************/
void OneBitBanAdd()
{
if(InputA || InputB)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
if(InputA && InputB)
{
OutputY2 = 1;
}
else
{
OutputY2 = 0;
}
}
/******************************************************************************************************************
函數(shù)功能:一位半加器
函數(shù)說明:
******************************************************************************************************************/
void QuanAdd()
{
OutPutPortReset();
OutputY1 = !(InputA & InputB & InputC);
OutputY2 = (InputA | InputB | (!InputC));
OutputY3 = (InputA | (!InputB) | InputC);
OutputY4 = ((!InputA) | InputB | InputC);
OutputY5 = !(OutputY1 & OutputY2 & OutputY3 & OutputY4);/*合數(shù)*/
OutputY6 = (InputA | (!InputB) | (!InputC));
OutputY7 = ((!(InputA & InputC)) | InputB);
OutputY8 = ((!(InputA & InputB)) | InputC);
OutputY9 = !(OutputY1 & OutputY6 & OutputY7 & OutputY8);/*進(jìn)位*/
}
/******************************************************************************************************************
函數(shù)功能:4人表決器
函數(shù)說明:
******************************************************************************************************************/
void SiRenBiaoJueQi()
{
OutPutPortReset();
OutputY1 = !(InputA & InputB & InputC);
OutputY2 = !(InputA & InputB & InputD);
OutputY3 = !(InputA & InputC & InputD);
OutputY4 = !(OutputY1 & OutputY2 & OutputY3);
}
/******************************************************************************************************************
函數(shù)功能:組合邏輯門實(shí)驗(yàn)1
函數(shù)說明:
******************************************************************************************************************/
void ZuHeLogic1()
{
OutPutPortReset();
OutputY1 = !(InputA & InputB & InputC & InputC);
OutputY2 = !(OutputY1 & InputD);
OutputY3 = !OutputY2;
OutputY4 = !(OutputY3 & InputC);
OutputY5 = !(OutputY4 & InputA & OutputY1 & OutputY2);
}
/******************************************************************************************************************
函數(shù)功能:組合邏輯門實(shí)驗(yàn)2
函數(shù)說明:
******************************************************************************************************************/
void ZuHeLogic2()
{
OutPutPortReset();
OutputY1 = ((!InputA) & (!InputB) & (InputC)) | (InputB & (!InputC));
OutputY2 = !InputB;
OutputY3 = (InputA & (!InputC)) | (InputB & (!InputC));
}
/******************************************************************************************************************
函數(shù)功能:3輸入奇偶校驗(yàn)器
函數(shù)說明:
******************************************************************************************************************/
void ParityCheck3()
{
OutPutPortReset();
OutputY1 = !(InputA & (!InputB) & (!InputC));
OutputY2 = !((!InputA) & InputB & (!InputC));
OutputY3 = !((!InputA) & (!InputB) & InputC);
OutputY4 = !(InputA & InputB & InputC);
OutputY5 = !(OutputY1 & OutputY2 & OutputY3 & OutputY4);
}
/******************************************************************************************************************
函數(shù)功能:二進(jìn)制編碼器
函數(shù)說明:
******************************************************************************************************************/
void BinEncode()
{
OutPutPortReset();
OutputY1 = !((!InputA) & (!InputC) & (!InputE) & (!InputG));
OutputY2 = !((!InputB) & (!InputC) & (!InputF) & (!InputG));
OutputY3 = !((!InputD) & (!InputE) & (!InputF) & (!InputG));
}
/******************************************************************************************************************
函數(shù)功能:二進(jìn)制譯碼器
函數(shù)說明:
******************************************************************************************************************/
void BinDecode()
{
OutPutPortReset();
OutputY1 = (!InputA) & (!InputB) & (!InputC);
OutputY2 = (!InputA) & (!InputB) & InputC;
OutputY3 = (!InputA) & InputB & (!InputC);
OutputY4 = (!InputA) & InputB & InputC;
OutputY5 = InputA & (!InputB) & InputC;
OutputY6 = InputA & InputB & (!InputC);
}
/******************************************************************************************************************
函數(shù)功能:三人表決器
函數(shù)說明:四與非門實(shí)現(xiàn)
******************************************************************************************************************/
void ShanRenBiaoJueQi()
{
if(InputA && InputB)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
if(InputA && InputC)
{
OutputY2 = 0;
}
else
{
OutputY2 = 1;
}
if(InputB && InputC)
{
OutputY3 = 0;
}
else
{
OutputY3 = 1;
}
if(OutputY1 && OutputY2 && OutputY3)
{
OutputY4 = 0;
}
else
{
OutputY4 = 1;
}
}
/*################################################時(shí)序門電路####################################################*/
/******************************************************************************************************************
函數(shù)功能:基本RS觸發(fā)器
函數(shù)說明:不需要CP信號
******************************************************************************************************************/
void RsTrigger()
{
/*A為R輸入端 B為S輸入端 Y2 為Q輸出 Y1 !Q輸出*/
unsigned char ucData1 = 0;
unsigned char ucData2 = 0;
ucData1 = InputA & OutputY2;
OutputY1 = !ucData1;
ucData2 = InputB & OutputY1;
OutputY2 = !ucData2;
}
/******************************************************************************************************************
函數(shù)功能:JK觸發(fā)器
函數(shù)說明:
******************************************************************************************************************/
void JKTrigger()
{
}
/******************************************************************************************************************
函數(shù)功能:D觸發(fā)器
函數(shù)說明:
******************************************************************************************************************/
void DTringger()
{
if(InputA && CP_RisingEdge)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
if(CP_RisingEdge && OutputY1)
{
OutputY2 = 0;
}
else
{
OutputY2 = 1;
}
if(OutputY1 && OutputY4)
{
OutputY3 = 0;
}
else
{
OutputY3 = 1;
}
if(OutputY2 && OutputY3)
{
OutputY4 = 0;
}
else
{
OutputY4 = 1;
}
CP_RisingEdge = 0;/*清除邊緣信號*/
}
void clkCreateInit()
{
/*使用定時(shí)器模擬一個時(shí)序邏輯門電路的時(shí)鐘信號*/
AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0xCD; //設(shè)置定時(shí)初值 1K
TH0 = 0xD4; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
}
void UsartSendByte(char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
char putchar(char c)//重定向
{
UsartSendByte(c);
return c;
}
void UsartSendString(char *string)
{
while(*string != '\0')
{
UsartSendByte(*string);
string++;
}
}
void UsartInit()
{
SCON = 0x50;
TMOD = 0x00;
AUXR = 0X40;
TL1 = (65535 - (24000000 / 4/ 115200));
TH1 = (65535 - (24000000 / 4 / 115200)) >> 8;
TR1 = 1;
EA = 1;
}
int systemInit()
{
P1 = 0X00;
P0 = 0X00;
P2 = 0X00;
UsartInit();
}
/******************************************************************************************************************
函數(shù)功能:模式狀態(tài)掃描
函數(shù)說明:
******************************************************************************************************************/
void SysteModeScan()
{
unsigned int uidata = 0;
unsigned char ucModePinStatus = 0;
static unsigned char ucLastSystemMode = 0xff;
ucModePinStatus |= SW_PIN5;
ucModePinStatus <<= 1;
ucModePinStatus |= SW_PIN4;
ucModePinStatus <<= 1;
ucModePinStatus |= SW_PIN3;
ucModePinStatus <<= 1;
ucModePinStatus |= SW_PIN2;
ucModePinStatus <<= 1;
ucModePinStatus |= SW_PIN1;
ucModePinStatus <<= 1;
ucModePinStatus |= SW_PIN0;
if(ucModePinStatus >= 0 && ucModePinStatus <= 255)
{
ucSystemMode = ucModePinStatus;
}
else
{
ucSystemMode = 0;
}
if(ucLastSystemMode != ucSystemMode)
{
ucLastSystemMode = ucSystemMode;
uidata = ucSystemMode + 1;
printf("SysteMode:%d\r\n",uidata);
}
}
int main()
{
systemInit();
while(1)
{
SysteModeScan();
mdFunctionList[ucSystemMode]();
}
}
void clkInterrupt(void) interrupt 1 using 1
{
static unsigned char LastCP = 0;
LastCP = CP;/*記錄上一次的電平狀態(tài)*/
CP = !CP;/*電平信號*/
if(LastCP && !CP)
{
CP_FallingEdge = 1;/*下降沿信號*/
}
else
{
CP_FallingEdge = 0;
}
if(!LastCP && CP)
{
CP_RisingEdge = 1;/*上身沿信號*/
}
else
{
CP_RisingEdge = 0;
}
}
#ifndef MAIN_H
#define MAIN_H
#include "stc8.h"
#include "stdio.h"
/*模式切換按鈕輸入管腳*/
sbit SW_PIN0 = P3^7;
sbit SW_PIN1 = P3^6;
sbit SW_PIN2 = P3^5;
sbit SW_PIN3 = P3^4;
sbit SW_PIN4 = P3^3;
sbit SW_PIN5 = P3^2;
/*8組輸入信號*/
sbit InputA = P1^0;
sbit InputB = P1^1;
sbit InputC = P1^2;
sbit InputD = P1^3;
sbit InputE = P1^4;
sbit InputF = P1^5;
sbit InputG = P1^6;
sbit InputH = P1^7;
/*16路輸入信號*/
sbit OutputY1 = P0^7;
sbit OutputY2 = P0^6;
sbit OutputY3 = P0^5;
sbit OutputY4 = P0^4;
sbit OutputY5 = P0^3;
sbit OutputY6 = P0^2;
sbit OutputY7 = P0^1;
sbit OutputY8 = P0^0;
#define OutputPort0 P0
#define OutputPort1 P2
sbit OutputY9 = P2^7;
sbit OutputY10 = P2^6;
sbit OutputY11 = P2^5;
sbit OutputY12 = P2^4;
sbit OutputY13 = P2^3;
sbit OutputY14 = P2^2;
sbit OutputY15 = P2^1;
sbit OutputY16 = P2^0;
#define MAX_FUNC_ITEM 256
typedef void (*sysFunction)(void);
int systemInit();
void Input1NotDoor();
void Input2AndDoor();
void Input2OrNotDoor();
void Input2OrDoor();
void Input2AndNotDoor();
void Input2YiHuoDoor();
void Input2TongHuoDoor();
void Input1NotDoor();
void Input3AndDoor();
void Input3AndNotDoor();
void Input3OrDoor();
void Input3OrNotDoor();
void Input3XorDoor();
void Input4AndDoor();
void Input4AndNotDoor();
void Input4OrDoor();
void Input4OrNotDoor();
void ComperDoor();
void OneBitBanAdd();
void QuanAdd();
void SiRenBiaoJueQi();
void ZuHeLogic1();
void ZuHeLogic2();
void ParityCheck3();
void BinEncode();
void ShanRenBiaoJueQi();
void RsTrigger();
void DTringger();
void JKTrigger();
#endif
|
|