⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 这是一个uC/OS的系统驱动程序
💻 C
字号:
#include <includes.h>

/*
//  LCD段码表(可自定义扩充,参考原理电路图)
 显示字符(十进制表示)  a b c d e f g dp  段码值(十六进制)
  -----------------------------------------------
   0                   1 1 1 1 1 1 0 0     0x3F
   1                   0 0 0 0 1 1 0 0     0x30
   2                   1 1 0 1 1 0 1 0     0x5B
   3                   1 1 1 1 0 0 1 0     0x4F
   4                   0 1 1 0 0 1 1 0     0x66
   5                   1 0 1 1 0 1 1 0     0x6D
   6                   1 0 1 1 1 1 1 0     0x7D
   7                   1 1 1 0 0 0 0 0     0x07
   8                   1 1 1 1 1 1 1 0     0x7F
   9                   1 1 1 1 0 1 1 0     0x6F
   .                   0 0 0 0 0 0 0 1     0x80
  -----------------------------------------------
*/
unsigned char dataSeg[11] = {0x3F,0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80};
_sn74hc138_status sn74hc138_statusTable[8];
/* sn74hc138真值表定义 与LED,LCD电路相关 */
void SetSn74hc138StatusTable(void);
void Set74hc595Output(unsigned char data);     //  设置74HC595的并行输出值
void LcdInitlize(void);                        //  LCD初始化设置
void LcdClear(void);                           //  LCD清屏

void  TaskLcd(void *p_arg)
{
    int i, j;


    p_arg = p_arg;


    AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);

    LcdInitlize();

    while(1)
    {
      for( j = 0; j < 8; j++)         //  依次选通LCD
      {
        if( sn74hc138_statusTable[j].nPfLow  != NONE )  AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, sn74hc138_statusTable[j].nPfLow);
        if( sn74hc138_statusTable[j].nPfHigh != NONE )  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, sn74hc138_statusTable[j].nPfHigh);
        for( i = 0; i < 11; i++)      //  对选通的LCD,依次显示段表中的所有段值
        {
          Set74hc595Output(dataSeg[i]);
          OSTimeDlyHMSM(0, 0, 0, 100);
        }
      }

      for( i = 0; i < 11; i++)        //  依次选择段值
      {
        Set74hc595Output(dataSeg[i]);
        for( j = 0; j < 8; j++)       //  对选定的段值,依次选通LCD
        {
          if( sn74hc138_statusTable[j].nPfLow  != NONE )  AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, sn74hc138_statusTable[j].nPfLow);
          if( sn74hc138_statusTable[j].nPfHigh != NONE )  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, sn74hc138_statusTable[j].nPfHigh);
          OSTimeDlyHMSM(0, 0, 0, 100);
        }
      }
      LcdClear();

      OSTimeDlyHMSM(0, 0, 2, 0);
    }
}


/*
  描    述:74HC595输出指定字节
  参数说明:byte data -- 指定输出的字节
*/
void Set74hc595Output(unsigned char data)
{
  int i;

  AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCD_74HC595_RCLK);
  for( i=0; i<8; i++)
  {
     AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCD_74HC595_SRCLK);
     (data&0x80) == 0x00 ? AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LCD_74HC595_SER) : AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LCD_74HC595_SER);
     data = data << 1;
     AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LCD_74HC595_SRCLK);
  }
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LCD_74HC595_RCLK);   // 改变时序,并行输出
}

void LcdInitlize(void)
{
  //  设置PMC、PIO
  AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
  AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LCD_74HC138_A_PA31|LCD_74HC138_B_PA2|LCD_74HC138_C_PA30) ;
  AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LCD_74HC595_RCLK|LCD_74HC595_SRCLK|LCD_74HC595_SER) ;

  //  LCD清屏,设置74HC138真值表
  LcdClear();
  SetSn74hc138StatusTable();
}


void LcdClear(void)
{
  Set74hc595Output(0x0);
}


void SetSn74hc138StatusTable(void)
{
   sn74hc138_statusTable[0].nPfLow  = LCD_74HC138_A_PA31|LCD_74HC138_B_PA2|LCD_74HC138_C_PA30;
   sn74hc138_statusTable[0].nPfHigh = NONE;

   sn74hc138_statusTable[1].nPfLow  = LCD_74HC138_B_PA2|LCD_74HC138_C_PA30;
   sn74hc138_statusTable[1].nPfHigh = LCD_74HC138_A_PA31;

   sn74hc138_statusTable[2].nPfLow  = LCD_74HC138_A_PA31|LCD_74HC138_C_PA30;
   sn74hc138_statusTable[2].nPfHigh = LCD_74HC138_B_PA2;


   sn74hc138_statusTable[3].nPfLow  = LCD_74HC138_C_PA30;
   sn74hc138_statusTable[3].nPfHigh = LCD_74HC138_A_PA31|LCD_74HC138_B_PA2;

   sn74hc138_statusTable[4].nPfLow  = LCD_74HC138_A_PA31|LCD_74HC138_B_PA2;
   sn74hc138_statusTable[4].nPfHigh = LCD_74HC138_C_PA30;

   sn74hc138_statusTable[5].nPfLow  = LCD_74HC138_B_PA2;
   sn74hc138_statusTable[5].nPfHigh = LCD_74HC138_A_PA31|LCD_74HC138_C_PA30;

   sn74hc138_statusTable[6].nPfLow  = LCD_74HC138_A_PA31;
   sn74hc138_statusTable[6].nPfHigh = LCD_74HC138_B_PA2|LCD_74HC138_C_PA30;

   sn74hc138_statusTable[7].nPfLow  = NONE;
   sn74hc138_statusTable[7].nPfHigh = LCD_74HC138_A_PA31|LCD_74HC138_B_PA2|LCD_74HC138_C_PA30;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -