打印
[STM8]

关于数码管的程序看不懂,帮忙看一下

[复制链接]
1656|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zini1900|  楼主 | 2013-12-13 23:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void key_s(void)
{
                uchar ss=2;
                uchar flat=0x00;
                if( (PD_IDR & CS_I) == 0)//按键低电平有效 ==CS_I高电平有效
                  {
                                                for(i=0;i<1000;i++)
                                                        {
                                                                display_b(v,bai);
                                                                display_s(v,shi);
                                                                display_g(ge);
                                                        }
                                       
                                if((PD_IDR & CS_I) == 0)//按键低电平有效 ==CS_I高电平有效
                                {
                                        key_z=1;n=0;
                                        while(ss-->0)
                                        {
                                                for(i=0;i<200;i++)
                                                {
                                                        display_b(v,bai);
                                                        display_s(v,shi);display_g(ge);
                                                }
                                                        delay(300);
                                        }       
                                                while(n<15)
                                        {
                                                        display_b(v,bai);
                                                        display_s(v,shi);
                                                        display_g(ge);
                                                if((PD_IDR & CS_I) == 0)//按键低电平有效 ==CS_I高电平有效
                                                {         
                                                        delay(2);aj_xmi=150;TIM2_CR1=0X00;aj_num=xs;fl_a=flat;TIM4_CR1 = 0x01;
                                                        while( (PD_IDR & CS_I) == 0)//按键低电平有效 ==CS_I高电平有效
                                                        {
                                                                xs=aj_num;
                                                                v=(3.3*s/1024)*SCALE*(fd(s)/1000.0);
                                                                if(v<10.0) shu=v*1000;
                                                                else if(v<100.0&&v>=10.0)shu=v*100;
                                                                                else  shu=v*10;
                                                                               
                                                                bai=shu/1000;shi=shu%1000/100;ge=shu%100/10;
       
                                                                display_b(v,bai);
                                                                display_s(v,shi);display_g(ge);
                                                        }
                                                                flat = flat ^ 0xff; TIM4_CR1 = 0x00;n=0; TIM2_CR1=0X01;xs=aj_num;
                                                }       
                                        }
                                                E2_PROM_Write(0,xs);ss=2;
                                                                                        while(ss-->0)
                                                                                                        {
                                                                                                                delay(300);
                                                                                                                for(i=0;i<200;i++)
                                                                                                                {
                                                                                                                        display_b(v,bai);
                                                                                                                        display_s(v,shi);display_g(ge);
                                                                                                                }
                                                                                                        }
                                                                                E2_PROM_Read();
                                                        key_z=0;
                                }
                               
                        }
}                       
沙发
Rain_King| | 2013-12-14 10:05 | 只看该作者
首先...一般人都不会去帮人去看代码,其次,你的排版格式实在让人没有看的冲动....最后,你应该直接问问题,而不是叫别人帮你看代码.....

使用特权

评论回复
板凳
zini1900|  楼主 | 2013-12-14 14:37 | 只看该作者
Rain_King 发表于 2013-12-14 10:05
首先...一般人都不会去帮人去看代码,其次,你的排版格式实在让人没有看的冲动....最后,你应该直接问问题 ...

ss-->0
这个逻辑运算符是什么意思

使用特权

评论回复
地板
Rain_King| | 2013-12-14 14:57 | 只看该作者
zini1900 发表于 2013-12-14 14:37
ss-->0
这个逻辑运算符是什么意思

你确定是s-->,而不是s->......这个是一个基础的语法知识,当然国内的那个什么谭的教程没有介绍,不过你要是学过数据结构就应该知道,这和指针的点有点差不多,我举个例子吧.....
typede struct
{
   int a;
   int b;
   int c;
}Exm;

Exm Var;
Exm *P;
一般来说,Var.a来使用,但是如果我p=&Var的话,就可以这样:
p->a来使用...和Var.a是一样的.....不知道你明白了没,如果这里有一些语法错误就忽略吧,好久没有用到
数据结构了,都有点陌生了.....

使用特权

评论回复
5
hkcj| | 2013-12-14 19:20 | 只看该作者
这一块   基本没有接触过   楼主   帮你顶起来   看看别人的意见如何   顶一个

使用特权

评论回复
6
hjl714016| | 2013-12-16 11:34 | 只看该作者
你就发一个函数key_s();没头没尾的,谁知道是啥。
-->应该这样写-- >好看点,看看C的双目运算符
ss-- > 0 是指ss自减,直到表达式s--的值小于等于0时不成立。

使用特权

评论回复
7
zini1900|  楼主 | 2013-12-16 15:10 | 只看该作者
本帖最后由 zini1900 于 2013-12-16 15:15 编辑
hjl714016 发表于 2013-12-16 11:34
你就发一个函数key_s();没头没尾的,谁知道是啥。
-->应该这样写-- >好看点,看看C的双目运算符
ss-- > 0  ...

明白了,就是WHILE里面的程序执行两次,也就是三个数码管闪烁两次
关于ADC的运算,它是将高八位左移两位再与低八位相或,实在看不懂得到的结果有什么意义,最高两位不是最有意义的吗,为什么忽略,程序如下:
                                        result_H=ADC_DRH;
                                        result_L=ADC_DRL;
                                        result_H=result_H<<2|result_L;
                                        return result_H;
还有就是ADC与实际电压的转换,它用的公式是:
(3.3*sum/1024)*SCALE*(fd(sum)/1000.0)
3.3应该就是基准电压,SUM是ADC值,这个SCALE是不是因为量程比3.3大,所以在输入那里加了电阻分压,所以测得的电压要乘以SCALE,它等于10.17,fd(sum)是为了校正,比如用9.5伏做为输入电压去校正,如果数码管显示9.4,这时就把9.5/9.4存起来,再检测电压的时候,9.4*9.5/9.4,就是9.5,这样就正确了,可是这个函数里有一个判断,当0<sum<60时,这个函数返回sum*1.005,当60<sum<180时,这个函数返回sum*1.003,还有几个这样的判断,在FD函数里定义有。我不知道有什么意图,还有fd(sum)为什么要除以1000。
还有一个就是key_s这个函数我不明白是做什么用的。好像是为了对校正系数xs修改,但具体怎么改的我看不懂。我把整个程序贴上来。display函数只是显示个十百位数码管的,那个程序我没有贴。

#define  CS_I   0x08
#define    XS  1000//按键微调电压起始比例值
#define CS 0X20
#define SCALE 10.17  //电压系数(此为0-30v)
#define AUTO_REVISE 9.0//电压自动校正点9.0-9.0V
#define EXCEED_RANGE 30.3 //最高电压超限值30.3V 显示---

void GPIO_init(void)
{
//数码管端口初始化
//////////////////////////////////////////////
  PA_DDR|=0X0E;
PA_CR1|=0X0E;
PA_CR2|=0X00;
     
PD_DDR|=0X8A;
PD_CR1|=0X8A;
PD_CR2|=0X00;
   
PC_DDR|=0XF8;
PC_CR1|=0XF8;
PC_CR2|=0X00;
     
PB_DDR|=0X30;
PB_CR1|=0X30;
PB_CR2|=0X00;
/////////////////////////////////////////////////
//在GPIO_Iint(void)中加入这三条按键口初始化
/////////////////////////////////////////////////
PD_DDR &= 0XF7;
PD_CR1 |= 0X08;
PD_CR2 &= 0XF7;
//////////////////////////////////////////////////
TIM4_IER = 0x00;            
  TIM4_EGR = 0x01;         
  TIM4_PSCR = 0x07;                                      
  TIM4_ARR = 255;            
  TIM4_CNTR = 255;
TIM4_CR1 = 0x00;
  TIM4_IER = 0x01;           
  _asm("rim");      
//中断初始化
//////////////////////////////////////////////////
TIM2_IER = 0x00;           
TIM2_EGR = 0x01;         
TIM2_PSCR = 0x01;         
TIM2_ARRH = 0XEA;           
TIM2_ARRL = 0X60;
TIM2_CNTRH = 0XEA;
TIM2_CNTRL = 0X60;
TIM2_CR1=0X01;
TIM2_IER = 0x01;
  _asm("rim");
}
//////////////////////////////////////////////////
//延时函数
//////////////////////////////////////////////////
void delay(uint xm)
{
  uint x,y;
  for(x=xm;x>0;x--)
   for(y=343;y>0;y--);
}
///////////////////////////////////////////////////
//ADC端口参数设置
///////////////////////////////////////////////////
void ad_init(uchar ch)
{
  ADC_CSR=table[ch];//设置A/D通道
  ADC_CR1=0X01;//设置转换速率和A/D转换开关
  ADC_CR2=0X00;//主要设置A/D转换值对齐方式,采用左对齐
   delay(2);//采集延时
}
///////////////////////////////////////////////////
//ADC输出采集的AD值
////////////////////////////////////////////////////
uint adc_cj(uchar ch)
{
   uint result_H=0,result_L=0;
     ADC_CSR=table[ch];
     delay(3);//采集延时
     ADC_CR1|=0X01;
     while(!(ADC_CSR&0X80));
         ADC_CSR&=0X7F;
     result_H=ADC_DRH;
     result_L=ADC_DRL;
     result_H=result_H<<2|result_L;
     return result_H;
}
/////////////////////////////////////////////////////
//采集并处理返回真实电压值
/////////////////////////////////////////////////////
float adc_cl(uchar ch)
{
  float sum=0.0;
  uchar i;
  static uchar count_v=0;
  static uint cj_v[64];
   
   cj_v[count_v++]=adc_cj(ch);
      
    if(count_v==64) count_v=0;
     if(ft==0x00)
     {display_cb(14);display_cg(14);display_cs(14);}
     else if(ft==0x01 && v <= EXCEED_RANGE )
        {
         display_b(v,bai);
         display_s(v,shi);display_g(ge);display_s(v,shi);}
      else if(ft==0x01 && v > EXCEED_RANGE)
       {display_cb(11);display_cg(11); display_cs(11);}
    for(i=0;i<64;i++)
      sum+=cj_v;
      sum/=64;s=sum;
  return (3.3*sum/1024)*SCALE*(fd(sum)/1000.0);
}
///////////////////////////////////////////////////////

//主函数
///////////////////////////////////////////////////////
void main()
{
GPIO_init();
ad_init(0);
E2_PROM_Read();

CLK_CKDIVR = 0X00;
for(i=0;i<100;i++)
{
  v=adc_cl(0);
  display_cb(14);
  display_cg(14);
  display_cs(14);
}
delay(2000);
ft=0x01;
while(1)
{
  //自动校正需重新更改校正电压值
//////////////////////////////////////////////     
  if((PD_IDR & CS) == 0)//按键低电平有效 ==CS高电平有效
   {
    delay(100);
    if((PD_IDR & CS) == 0)//按键低电平有效 ==CS高电平有效
     {   
      xs=(uint)(((AUTO_REVISE+0.05)/((3.3*s/1024)*SCALE))*1000.0/1.0+0.5);
      E2_PROM_Write(0,xs);
      E2_PROM_Read(  );
     }
      while((PD_IDR & CS) == 0);
   }
  /////////////////////////////////////////////  
     if(v <= EXCEED_RANGE)
      for(i=0;i<140;i++)
      {
       v=adc_cl(0);
       display_b(v,bai);
       display_s(v,shi);display_g(ge);
       display_b(v,bai);
       key_s( );
      }
      while(v > EXCEED_RANGE)
        {
         v=adc_cl(0);
         display_cb(11);display_cg(11);display_cs(11);
        }
}
}
/////////////////////////////////////////////////////
//中断函数
/////////////////////////////////////////////////////
@far @interrupt void TIM2_UPD_OVF_IRQHandler()
{
  TIM2_SR1 = 0X00;
  num++;
  switch(key_z)
  {
    case 0: if(num==40)
       {
         num=0;
   
         if(v<10.0)shu=v*1000;
         else if(v<100.0&&v>=10.0)shu=v*100;
         else if(v>=100.0)shu=v*10;
              
         if(v <= EXCEED_RANGE)
          {
           bai=shu/1000;
           shi=shu%1000/100;
           ge=shu%100/10;
          }
         else if(v > EXCEED_RANGE)
           {bai=11;shi=11;ge=11;}
       }break;
    case 1:
         if(num==40)
         {num=0;n++;if(n==2000)n=0;}break;
  }
  return;
}
@far @interrupt void TIM4_UPD_OVF_IRQHandler (void)
{
TIM4_SR= 0x00;
  aj_xm++;
if(aj_xm==aj_xmi)
{
  aj_xm=0;
  if(aj_xmi>50) aj_xmi-=1;//修改系数调节最快速度50
  if(fl_a==0x00) aj_num++;
  else if(fl_a==0xff) aj_num--;
}
return;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

106

帖子

0

粉丝