打印

0200请教如何判断高位的0

[复制链接]
1879|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
avocationA|  楼主 | 2009-2-8 15:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pi, IO, gp, GPIO, LED
写一个  printf_led(-23.4A)!!!5位数码管!
写一个  printf_led(-23.4A)!!!5位数码管!
写一个  printf_led(-23.4A)!!!5位数码管!

//  基于《Stellaris外设驱动库》的例程扩展:按键控制LED


//  包含必要的头文件
#include  "LED.H"
#include  "KEY.H"
#include  <hw_types.h>
#include  <hw_memmap.h>
#include  <hw_sysctl.h>
#include  <hw_gpio.h>
#include  <sysctl.h>
#include  <gpio.h>

//  PA0    HC595_HC166_CLK
//  PA1    HC595_STR
//  PA2    HC595_DATA
//  PA3 HC166_S_L
//  PA4    HC166_Q_H

//  将较长的标识符定义成较短的形式
#define  SysCtlPeriEnable       SysCtlPeripheralEnable
#define  SysCtlPeriDisable      SysCtlPeripheralDisable
#define  GPIOPinTypeIn          GPIOPinTypeGPIOInput
#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput


//  定义KEY
#define  KEY_PERIPH             SYSCTL_PERIPH_GPIOG
#define  KEY_PORT               GPIO_PORTG_BASE
#define  KEY_PIN                GPIO_PIN_5

//  定义全局的系统时钟变量
unsigned long  TheSysClock  =  12000000UL;
/***************************
【函数】:seg[16]
【功能】:显示段码
【参数】:无
***************************/
unsigned char seg[16]=
{
  0xC0,0xF9,0xA4,0xB0, /* 0 1 2 3*/
  0x99,0x92,0x82,0xF8, /* 4 5 6 7 */
  0x80,0x90,0x88,0x83, /* 8 9 A B */
  0xC6,0xA1,0x86,0x8E  /* C D E F */
};

/***************************
【函数】:DigTab[6]
【功能】:LED位扫描
【参数】:无
***************************/
unsigned char DigTab[6] =                         //  定义数码管位选数据
{
  0x01, 0x02, 0x04, 0x08, 0x10, 0x00
};

/***************************
【函数】:JTAG_Wait(void)
【功能】:防止JTAG失效
【参数】:无
***************************/
void  JTAG_Wait(void)
{
    SysCtlPeriEnable(KEY_PERIPH);                               //  使能KEY所在的GPIO端口
    GPIOPinTypeIn(KEY_PORT , KEY_PIN);                          //  设置KEY所在管脚为输入

    if ( GPIOPinRead(KEY_PORT , KEY_PIN)  ==  0x00 )            //  如果复位时按下KEY,则进入
    {
        for (;;);                                               //  死循环,以等待JTAG连接
    }

    SysCtlPeriDisable(KEY_PERIPH);                              //  禁止KEY所在的GPIO端口
}

/***************************
【函数】:Delay()
【功能】:延时
【参数】:无
***************************/
void  Delay(unsigned long  ulVal)
{
  while ( --ulVal  !=  0 );
}

/***************************
【函数】:SystemInit()
【功能】:系统初始化
【参数】:无
***************************/
void  SystemInit(void)
{
    SysCtlLDOSet(SYSCTL_LDO_2_50V);                             //  设置LDO输出电压

    SysCtlClockSet(SYSCTL_USE_OSC |                             //  系统时钟设置,采用主振荡器
                   SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_6MHZ |
                   SYSCTL_SYSDIV_1);

/*
    SysCtlLDOSet(SYSCTL_LDO_2_75V);                             //  配置PLL前将LDO电压设置为2.75V

    SysCtlClockSet(SYSCTL_USE_PLL |                             //  系统时钟设置,采用PLL
                   SYSCTL_OSC_MAIN |                            //  主振荡器
                   SYSCTL_XTAL_6MHZ |                           //  外接6MHz晶振
                   SYSCTL_SYSDIV_10);                           //  分频结果为20MHz
*/

    TheSysClock  =  SysCtlClockGet();                           //  获取系统时钟,单位:Hz                                    
}

/***************************
【函数】:IoInit(void)
【功能】:IO初始化
【参数】:无
***************************/
void  IoInit(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOA);                  //  使能GPIOA端口
    GPIOPinTypeOut(GPIO_PORTA_BASE , GPIO_PIN_0);           //  设置PA0为输入类型
    GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_0 , 0x00);      //  PA0输出低电平
        
    GPIOPinTypeOut(GPIO_PORTA_BASE , GPIO_PIN_1);           //  设置PA1为输出类型
    GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_1 , 0x00<< 1);  //  PA1输出低电平
        
    GPIOPinTypeOut(GPIO_PORTA_BASE , GPIO_PIN_2);           //  设置PA2为输出类型
    GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_2 , 0x00<< 2);  //  PA2输出低电平
    
    GPIOPinTypeOut(GPIO_PORTA_BASE , GPIO_PIN_3);           //  设置PA3为输出类型
    GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_3 , 0x00<< 3);  //  PA2输出低电平
    
    GPIOPinTypeIn(GPIO_PORTA_BASE , GPIO_PIN_4);            //  设置PA4输入类型
    
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB);                  //  使能GPIOB端口
    GPIOPinTypeIn(GPIO_PORTB_BASE , GPIO_PIN_0);            //  设置PB0输入类型

    LED_Init(LED1 | LED2);                                  //  初始化LED1和LED2
    KEY_Init(KEY1 | KEY2); 
}

/***************************
【函数】:HC595_HC166_CLK_Hi(void)
【功能】:io设定
【参数】:无
***************************/
void  HC595_HC166_CLK_Hi(void)//PA0管脚输出高电平
{
  GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_0 , 0x01);      //  PA0输出高电平
}

/***************************
【函数】:HC595_HC166_CLK_Lo(void)
【功能】:io设定
【参数】:无
***************************/
void  HC595_HC166_CLK_Lo(void)//PA0管脚输出低电平
{
  GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_0 , 0x00);      //  PA0输出低电平
}

/***************************
【函数】:HC595_STR_Hi(void)
【功能】:io设定
【参数】:无
***************************/
void  HC595_STR_Hi(void)//PA1管脚输出高电平
{
  GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_1 , 0x01<< 1);  //  PA1输出高电平
}

/***************************
【函数】:HC595_STR_Lo(void)
【功能】:io设定
【参数】:无
***************************/
void  HC595_STR_Lo(void)//PA1管脚输出低电平
{
  GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_1 , 0x00<< 1);  //  PA1输出低电平
}

/***************************
【函数】:HC595_DATA_Hi(void)
【功能】:io设定
【参数】:无
***************************/
void  HC595_DATA_Hi(void)//PA2管脚输出高电平
{
  GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_2 , 0x01<< 2);  //  PA2输出高电平
}

/***************************
【函数】:HC595_DATA_Lo(void)
【功能】:io设定
【参数】:无
***************************/
void  HC595_DATA_Lo(void)//PA2管脚输出低电平
{
  GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_2 , 0x00<< 2);  //  PA2输出低电平


/***************************
【函数】:HC166_SL_Hi(void)
【功能】:io设定
【参数】:无
***************************/
void  HC166_SL_Hi(void)//PA3管脚输出高电平
{
  GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_3 , 0x01<< 3);  //  PA3输出高电平
}

/***************************
【函数】:HC166_SL_Lo(void)
【功能】:io设定
【参数】:无
***************************/
void  HC166_SL_Lo(void)//PA3管脚输出低电平
{
  GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_3 , 0x00<< 3);  //  PA3输出低电平
}        
 
/***************************
【函数】:HC166_read(void)
【功能】:io设定
【参数】:无
***************************/
unsigned char HC166_read(void)//HC166_read
{
  unsigned char i,set;
  HC166_SL_Lo();        //cp底电平
  
  HC595_HC166_CLK_Lo(); //CLK底电平

  HC595_HC166_CLK_Hi(); //CLK高电平

  HC166_SL_Hi();        //cp高电平

  for(i = 0, set = 0; i < 8;i ++)//依次读取锁存的8位数据
  {
    set <<= 1;
    if ( GPIOPinRead(GPIO_PORTA_BASE , GPIO_PIN_4)  ==  0x00 )      //  如果PA4为低电平
    {
      set ++;
    }
    HC595_HC166_CLK_Lo(); //CLK底电平

    HC595_HC166_CLK_Hi(); //CLK高电平//第8个脉冲将SER发送出来
  }
  return set;


/***************************
【函数】:DataOut(void)
【功能】:io设定
【参数】:无
***************************/
void DataOut(unsigned char nValue)
{
 int i;
 //int j;
 for(i = 0;i < 8;i++)
 {
    if ((nValue & 0x80) == 0x80)
    {
      HC595_DATA_Hi();//输出高电平
    }
    else
    {
      HC595_DATA_Lo();//输出低电平
    } 
  
  HC595_HC166_CLK_Hi();//时钟高电平,上升沿有效
  HC595_HC166_CLK_Lo();//时钟低电平
  nValue <<= 1;  
 }
 return;
}

/***************************
【函数】:Show_Led_Bit(void)
【功能】:io设定
【参数】:DigValue//显示位数, SegValue//显示值
***************************/
void  Show_Led_Bit(unsigned char DigValue,unsigned char SegValue)
{

  HC595_STR_Lo();//清除锁存信号
  DataOut(DigTab[DigValue]);
  DataOut(seg[SegValue]);
  HC595_STR_Hi();//给锁存信号,共送了16位数据  高8位是 扫描数据 低8位是段码   
}

/***************************
【函数】:Show_Led_5(void)//5位数码管
【功能】:io设定
【参数】:根据Led_Bit显示位数, 根据SegValue显示数据
***************************/
void  Show_Led_5(unsigned int Led_Bit,unsigned int Led_Value)

  unsigned char DispBuf[5];
  DispBuf[0] = Led_Value / 10000;
  DispBuf[1] = Led_Value % 10000 / 1000;
  DispBuf[2] = Led_Value % 1000 / 100;       
  DispBuf[3] = Led_Value % 100 / 10;
  DispBuf[4] = Led_Value % 10;
  
  switch(Led_Bit) //读取扫描值 
  {
    case 0: Show_Led_Bit(5,DispBuf[0]);break; //关闭显示
    
    case 1: Show_Led_Bit(4,DispBuf[4]);break; //显示个位
    
    case 2: Show_Led_Bit(3,DispBuf[3]);
            Show_Led_Bit(4,DispBuf[4]);break; //显示个十位
            
    case 3: Show_Led_Bit(2,DispBuf[2]);
            Show_Led_Bit(3,DispBuf[3]);
            Show_Led_Bit(4,DispBuf[4]);break; //显示个十百位
            
    case 4: Show_Led_Bit(1,DispBuf[1]);
            Show_Led_Bit(2,DispBuf[2]);
            Show_Led_Bit(3,DispBuf[3]);
            Show_Led_Bit(4,DispBuf[4]);break; //显示个十百千位
            
    case 5: Show_Led_Bit(0,DispBuf[0]);
            Show_Led_Bit(1,DispBuf[1]);
            Show_Led_Bit(2,DispBuf[2]);
            Show_Led_Bit(3,DispBuf[3]);
            Show_Led_Bit(4,DispBuf[4]); break; //显示个十百千万位
    default : break;
  }
}

/***************************
【函数】:main(void)
【功能】:io设定
【参数】:主函数
***************************/
int  main(void)
{   
    unsigned char HC66_DATA;
    JTAG_Wait();                                                //  防止JTAG失效,重要!
    SystemInit();                                               //  系统初始化
    IoInit();                                                   //  IO始化

    for (;;)
    {
        HC66_DATA=HC166_read();//读键盘
        switch(HC66_DATA) //读取扫描值 
        {
          case 0x01: Show_Led_5(1,1);  break; //显示1位 显示1
          case 0x02: Show_Led_5(1,2);  break; //显示1位 显示2
          case 0x04: Show_Led_5(1,3);  break; //显示1位 显示3 
          case 0x08: Show_Led_5(1,4);  break; //显示1位 显示4                            
          case 0x10: Show_Led_5(1,5);  break; //显示1位 显示5
          case 0x20: Show_Led_5(1,6);  break; //显示1位 显示6
          case 0x40: Show_Led_5(1,7);  break; //显示1位 显示7
          case 0x80: Show_Led_5(1,8);  break; //显示1位 显示8
          case 0xFF: Show_Led_5(2,88);  break; //显示2位 显示88
          case 0x00: Show_Led_5(3,888); break; //显示3位 显示888
          
          case 0x03: Show_Led_5(2,13); break; //显示2位 显示13
                   
          default :  Show_Led_5(5,88888);  break; //显示5位 显示88888
        }
        //Delay(10 * (TheSysClock / 4000));                       //  延时约10ms
        LED_Off(LED1 | LED2);                                       //  熄灭LED1和LED2
    }
}

相关帖子

沙发
avocationA|  楼主 | 2009-2-8 15:21 | 只看该作者

还没有 写完 最终想写成 VC的 API 那样可以方便扩展的数码管

//  基于LM3S1138
个位大峡 请指点 指点!!!

使用特权

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

本版积分规则

123

主题

935

帖子

0

粉丝