深圳市航顺芯片技术研发有限公司
直播中

木頭瓶子

11年用户 558经验值
擅长:353304
私信 关注
[问答]

如何用一个LCD12864显示操作和结果的界面?

如何用一个LCD12864显示操作和结果的界面?

回帖(1)

沈茜

2021-11-3 11:00:15
一、设计要求:

主芯片: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=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 = n % 2;
  n /= 2;
}
for(i=0;i<16;i++)
{
  if(test==a)
  {
   error[flage]=0;
  }
  else
  {
   error[flage]=1;
  }
}
if(flage==3)
{
  for(i=0;i<4;i++)
  {
   for(j=0;j<16;j++)
   {
    if(error[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==1)
    {
     position=position+(i-j)*8;  
     LCD_DIS_Number(6,position,i+1,MIDDLE);
    }else
     j++;
   }
  }
}
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分