大佬们,之前我用STC8AK432S2A12单片机弄输入控制输出的程序。后来换了STC8A8K64D4的板子。然后接收程序不变,中断程序按照烧录软件的例程复制过来。然而运行后一直没有反应。之后一直改都亦是如此。我也是有点懵了。所以浪费大佬们的一点时间来帮我看看具体是什么问题...
#include "main.h"
#include <intrins.h>
unsigned char ucSystemMode = 0;/*系统工作模式,对应256个实验*/
unsigned char CP = 0; /*时序逻辑门电路需要的时序信号*/
unsigned char CP_RisingEdge = 0;/*上升沿信号*/
unsigned char CP_FallingEdge = 0;/*下降沿信号*/
sysFunction mdFunctionList[MAX_FUNC_ITEM] =
{
Input1NotDoor, /*1输入非门*/
/***************两输入逻辑门实验***/
Input2AndDoor, /*两输入与门*/
Input2OrNotDoor, /*两输入或非门*/
Input2OrDoor, /*两输入或门*/
Input2AndNotDoor, /*两输入与非门*/
Input2YiHuoDoor, /*两输入异或门*/
Input2TongHuoDoor,/*2输入同或门*/
/**********三输入逻辑门实验******/
Input3AndDoor, /*3输入与门*/
Input3AndNotDoor,/*3输入与非门*/
Input3OrDoor,/*3输入或门*/
Input3OrNotDoor, /*3输入或非门*/
Input3XorDoor,/*3输入异或门*/
/**********四输入逻辑门实验******/
Input4AndDoor,/*4输入与门*/
Input4AndNotDoor,/*4输入与非门*/
Input4OrDoor,/*4输入或门*/
Input4OrNotDoor,/*4输入或非门*/
/******组合逻辑门电路实验********/
ComperDoor, /*比较器*/
QuanAdd, /*全加器*/
SiRenBiaoJueQi, /*四人表决器*/
ZuHeLogic1, /*组合逻辑门1*/
ZuHeLogic2, /*组合逻辑门2*/
ParityCheck3, /*三输入的奇偶校验器*/
BinEncode, /*二进制编码器*/
#if 0
ShanRenBiaoJueQi,/*3人表决器*/
OneBitBanAdd,
/********时序逻辑门电路实验*****/
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输入逻辑门####################################################*/
/******************************************************************************************************************
函数功能:OutPutPortReset
函数说明:将输出端口的电平状态进行重设
******************************************************************************************************************/
void OutPutPortReset()
{
OutputPort0 = 0X00;
OutputPort1 = 0X00;
}
/*################################################1输入逻辑门####################################################*/
/******************************************************************************************************************
函数功能:1输入非门
函数说明:
******************************************************************************************************************/
void Input1NotDoor()
{
OutPutPortReset();
OutputY1 = !InputA;
}
/*################################################2输入逻辑门####################################################*/
/******************************************************************************************************************
函数功能:2输入门
函数说明:
******************************************************************************************************************/
void Input2AndDoor()
{
OutPutPortReset();
if(InputA && InputB)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函数功能:2输入或非门
函数说明:
******************************************************************************************************************/
void Input2OrNotDoor()
{
OutPutPortReset();
if(!InputA && !InputB)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函数功能:2输或门
函数说明:
******************************************************************************************************************/
void Input2OrDoor()
{
if(InputA || InputB)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函数功能:2输入与非门
函数说明:
******************************************************************************************************************/
void Input2AndNotDoor()
{
unsigned char ucData = InputA & InputB;
OutPutPortReset();
OutputY1 = !ucData;
}
/******************************************************************************************************************
函数功能:2输入异或门
函数说明:相异出1 相同出0
******************************************************************************************************************/
void Input2YiHuoDoor()
{
OutPutPortReset();
if(InputA == InputB)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函数功能:2输入同或门
函数说明:
******************************************************************************************************************/
void Input2TongHuoDoor()
{
OutPutPortReset();
if(InputA == InputB)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/*################################################3输入逻辑门####################################################*/
/******************************************************************************************************************
函数功能:3输入与门
函数说明:
******************************************************************************************************************/
void Input3AndDoor()
{
OutPutPortReset();
if(InputA && InputB && InputC)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函数功能:3输入与非门
函数说明:
******************************************************************************************************************/
void Input3AndNotDoor()
{
OutPutPortReset();
if(InputA && InputB && InputC)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函数功能:3输入或非门
函数说明:
******************************************************************************************************************/
void Input3OrNotDoor()
{
OutPutPortReset();
if(InputA == 0 && InputB == 0 && InputC == 0)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函数功能:3输入或门
函数说明:
******************************************************************************************************************/
void Input3OrDoor()
{
OutPutPortReset();
if(InputA == 0 && InputB == 0 && InputC == 0)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函数功能:3输入或门
函数说明:
******************************************************************************************************************/
void Input3XorDoor()
{
unsigned char flag = 0;
OutPutPortReset();
if(InputA == InputB)
{
flag = 0;
}
else
{
flag = 1;
}
if(flag == InputC)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函数功能:4输入与门
函数说明:
******************************************************************************************************************/
void Input4AndDoor()
{
OutPutPortReset();
if(InputA && InputB && InputC && InputD)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/******************************************************************************************************************
函数功能:4输入与非门
函数说明:
******************************************************************************************************************/
void Input4AndNotDoor()
{
OutPutPortReset();
if(InputA && InputB && InputC && InputD)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函数功能:4输入或门
函数说明:
******************************************************************************************************************/
void Input4OrDoor()
{
OutPutPortReset();
if(InputA == 0 && InputB == 0 && InputC == 0 && InputD == 0)
{
OutputY1 = 0;
}
else
{
OutputY1 = 1;
}
}
/******************************************************************************************************************
函数功能:4输入或非门
函数说明:
******************************************************************************************************************/
void Input4OrNotDoor()
{
OutPutPortReset();
if(InputA == 0 && InputB == 0 && InputC == 0 && InputD == 0)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
}
/*################################################组合逻辑门####################################################*/
/******************************************************************************************************************
函数功能:比较器
函数说明:
******************************************************************************************************************/
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则输出高电平,否则输出低电平*/
}
/******************************************************************************************************************
函数功能:一位半加器
函数说明:
******************************************************************************************************************/
void OneBitBanAdd()
{
if(InputA || InputB)
{
OutputY1 = 1;
}
else
{
OutputY1 = 0;
}
if(InputA && InputB)
{
OutputY2 = 1;
}
else
{
OutputY2 = 0;
}
}
/******************************************************************************************************************
函数功能:一位半加器
函数说明:
******************************************************************************************************************/
void QuanAdd()
{
OutPutPortReset();
OutputY1 = !(InputA & InputB & InputC);
OutputY2 = (InputA | InputB | (!InputC));
OutputY3 = (InputA | (!InputB) | InputC);
OutputY4 = ((!InputA) | InputB | InputC);
OutputY5 = !(OutputY1 & OutputY2 & OutputY3 & OutputY4);/*合数*/
OutputY6 = (InputA | (!InputB) | (!InputC));
OutputY7 = ((!(InputA & InputC)) | InputB);
OutputY8 = ((!(InputA & InputB)) | InputC);
OutputY9 = !(OutputY1 & OutputY6 & OutputY7 & OutputY8);/*进位*/
}
/******************************************************************************************************************
函数功能:4人表决器
函数说明:
******************************************************************************************************************/
void SiRenBiaoJueQi()
{
OutPutPortReset();
OutputY1 = !(InputA & InputB & InputC);
OutputY2 = !(InputA & InputB & InputD);
OutputY3 = !(InputA & InputC & InputD);
OutputY4 = !(OutputY1 & OutputY2 & OutputY3);
}
/******************************************************************************************************************
函数功能:组合逻辑门实验1
函数说明:
******************************************************************************************************************/
void ZuHeLogic1()
{
OutPutPortReset();
OutputY1 = !(InputA & InputB & InputC & InputC);
OutputY2 = !(OutputY1 & InputD);
OutputY3 = !OutputY2;
OutputY4 = !(OutputY3 & InputC);
OutputY5 = !(OutputY4 & InputA & OutputY1 & OutputY2);
}
/******************************************************************************************************************
函数功能:组合逻辑门实验2
函数说明:
******************************************************************************************************************/
void ZuHeLogic2()
{
OutPutPortReset();
OutputY1 = ((!InputA) & (!InputB) & (InputC)) | (InputB & (!InputC));
OutputY2 = !InputB;
OutputY3 = (InputA & (!InputC)) | (InputB & (!InputC));
}
/******************************************************************************************************************
函数功能:3输入奇偶校验器
函数说明:
******************************************************************************************************************/
void ParityCheck3()
{
OutPutPortReset();
OutputY1 = !(InputA & (!InputB) & (!InputC));
OutputY2 = !((!InputA) & InputB & (!InputC));
OutputY3 = !((!InputA) & (!InputB) & InputC);
OutputY4 = !(InputA & InputB & InputC);
OutputY5 = !(OutputY1 & OutputY2 & OutputY3 & OutputY4);
}
/******************************************************************************************************************
函数功能:二进制编码器
函数说明:
******************************************************************************************************************/
void BinEncode()
{
OutPutPortReset();
OutputY1 = !((!InputA) & (!InputC) & (!InputE) & (!InputG));
OutputY2 = !((!InputB) & (!InputC) & (!InputF) & (!InputG));
OutputY3 = !((!InputD) & (!InputE) & (!InputF) & (!InputG));
}
/******************************************************************************************************************
函数功能:二进制译码器
函数说明:
******************************************************************************************************************/
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);
}
/******************************************************************************************************************
函数功能:三人表决器
函数说明:四与非门实现
******************************************************************************************************************/
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;
}
}
/*################################################时序门电路####################################################*/
/******************************************************************************************************************
函数功能:基本RS触发器
函数说明:不需要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;
}
/******************************************************************************************************************
函数功能:JK触发器
函数说明:
******************************************************************************************************************/
void JKTrigger()
{
}
/******************************************************************************************************************
函数功能:D触发器
函数说明:
******************************************************************************************************************/
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()
{
/*使用定时器模拟一个时序逻辑门电路的时钟信号*/
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值 1K
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
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();
}
/******************************************************************************************************************
函数功能:模式状态扫描
函数说明:
******************************************************************************************************************/
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;/*记录上一次的电平状态*/
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
|