简单数字ic测试

1 篇文章 0 订阅
1 篇文章 0 订阅

proteus8.9+stm32f103对74HC00(四与非门)、74HC02(四或非门)、74HC04(六非门)进行简单测试

一、设计要求:

主芯片:STM32F103R6
IC测试座:DIP18 (18个引脚)
有四只开关:分别为“向上选择”、“向下选择”、“确定”、“退出”
用一个LCD12864显示操作和结果的界面

二、展示内容:

LCD12864显示内容:
第一屏:见图 显示可检测的器件的列表,被选中的型号反白显示
第二屏:见图 标题为被检测的器件的型号+testing…,下面有两行,第一行显示器件是否完好,如果有故障,在第二排显示是哪个部件出现故障。最后一排有状态显示,三种内容,没有测量时显示“开始测量”,正在测量时显示“测量中…”,测量完成后,显示“测量结束”

三、操作说明:

(1)开机,显示第一屏
(2)按“向上选择”和“向下选择”,可以依次选中列表中的器件,再按下“确认”键,可以选中该器件,进入第二屏,最下显示“开始测量”
(3)按“确认”键,开始测量,测量完成后,最下显示“测量结束”,并把结果在第二行和第三行的提示后显示。
(4)按“退出”键,回到第一屏。

四、测试芯片:

(1)74HC00 四与非门
(2)74HC02 四或非门
(3)74HC04 六非门

五、效果展示:

完整电路图
正确展示
检测结果,错误情况
测试逻辑
部分代码展示(检测函数)(因水平有限,且半夜赶出来的,未优化代码,欢迎大佬指正哈)

u16 pinout[3][4]={{0xE493,0xEDB7,0xF6DB,0xDB6F},{0xE493,0xD24B,0xC927,0xDB6F},{0xEAAB,0xD557,0xEAAB,0xD557}};
int test[16];
void testing(int dis)    //该函数为设置引脚电位函数
{
 int i,flage;
 for(flage=0;flage<4;flage++)
 {
  GPIO_Write(GPIOB,pinout[dis][flage]);
  for(i=0;i<16;i++)
  {
   if(i<8)
   {
    IC74HC251_OE1_0;
    IC74HC251_OE2_1;
   }
   else
   {
    IC74HC251_OE1_1;
    IC74HC251_OE2_0;
   }
   if(i==0 || i==2 || i==4 ||i==6 || i==8 || i==10 || i==12 || i==14)
   {
    IC74HC251_S0_0;
   }
   else
   {
    IC74HC251_S0_1;
   }
   if(i==0 || i==1 || i==4 ||i==5 || i==8 || i==9 || i==12 || i==13)
   {
    IC74HC251_S1_0;
   }
   else
   {
    IC74HC251_S1_1;
   }
   if(i==0 || i==1 || i==2 ||i==3 || i==8 || i==9 || i==10 || i==11)
   {
    IC74HC251_S2_0;
   }
   else
   {
    IC74HC251_S2_1;
   }
   test[i]=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
   }
  compare(dis,flage);
 }
}
int error[4][16];
int errpart[6];
void compare(int dis,int flage)     //该函数为比对函数
{
 int i,j,winflage=0,position=80;
 u16 n=pinout[dis][flage];
 int a[16];
 for (i = 0; i != 16; ++i)
 {
  a[i] = n % 2;
  n /= 2;
 }
 for(i=0;i<16;i++)
 {
  if(test[i]==a[i])
  {
   error[flage][i]=0;
  }
  else
  {
   error[flage][i]=1;
  }
 }
 if(flage==3)
 {
  for(i=0;i<4;i++)
  {
   for(j=0;j<16;j++)
   {
    if(error[i][j]==0)
    {
     winflage++;
     if(winflage==64)
     {
      LCD_DIS_Char(3,50,"TRUE",MIDDLE,0);
     }
    }
    else
    {
     if(dis==2)
     {
      if(j<5 && j>2){errpart[0]=1;}
      if(j<7 && j>4){errpart[1]=1;}
      if(j<9 && j>6){errpart[2]=1;}
      if(j<11 && j>8){errpart[3]=1;}
      if(j<13 && j>10){errpart[4]=1;}
      if(j<15 && j>12){errpart[5]=1;}
     }
     else
     {
      if(j<6 && j>2){errpart[0]=1;}
      if(j<9 && j>5){errpart[1]=1;}
      if(j<12 && j>8){errpart[2]=1;}
      if(j<15 && j>11){errpart[3]=1;}
     }
    }
   }
  }
  if(winflage!=64){
   LCD_DIS_Char(4,50,"FLASE",MIDDLE,0);
   j=0;
   for(i=0;i<6;i++)
   {
    if(errpart[i]==1)
    {
     position=position+(i-j)*8;  
     LCD_DIS_Number(6,position,i+1,MIDDLE);
    }else
     j++;
   }
  }
 }
}

全部代码及仿真:
https://download.csdn.net/download/wqndxjr/12493085

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值