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

📄 show_module1.c

📁 一个电表的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*===========================================================================
* 			 2006年。三星仪表SOC芯片开发项目
*
*
* 文件名称:Show_Module.c
* 文件标识:
* 摘    要:
*
*
* 当前版本:Ver 1.0
* 作    者:罗冬生
* 修改内容:
* 修改日期:
* 完成日期:

===============================================================================================*/
#ifndef   _Show_Module_
#define   _Show_Module_

//===============================================================================================

#include "includes.h"

//===============================================================================================


//    *************  Definition of LCD MACROS   ************

//===============================================================================================

//  LCD 配置
        #define LCD_COM          4         // 4个COM 输出模式
        #define LCD_SEG          23        // 23个液晶屏显示段SEG
        #define LCD_BLVL         3         // 液晶显示电压3V
        #define LCD_CLK          2048      // 2048Hz LCD操作频率
        #define LCD_BIAS         1         // LCD_BIAS=1为1/3Bias模式 ,LCD_BIAS=0为1/2Bias模式

//---------------------------------------------------------------------------------------------------

    #define LcdWrData(addr,value) {LCDDAT = (value); LCDPTR = ((addr)|0x80);}     // 写显示缓冲区
    #define LcdRdData(addr,value) {LCDPTR = (addr);    value  = LCDDAT;}          // 读显示缓冲区
//    #define LcdBlinkEnable()      LCDCON |= LCDBLINKEN_cfg
    #define LcdBlinkDisable()     LCDCON &= ~LCDBLINKEN_cfg
 //   #define LcdBlinkRate(c)       LCDCLK = (LCDCLK & 0x0f)|(c)
    #define LcdLock()             LCDCONY |= 0x01                     //修改显示内容开锁
    #define LcdRefresh()          LCDCONY &= 0xfe                     //刷新显示内容


  //       LCD段配置

    #define     SEG19EN_cfg     0x08             //D3~D0  LCDSEGE2 存储器
    #define     SEG18EN_cfg     0x04
    #define     SEG17EN_cfg     0x02
    #define     SEG16EN_cfg     0x01

    #define     SEG25EN_cfg     0x80             //D7~D2  LCDSEGE 存储器
    #define     SEG24EN_cfg     0x40
    #define     SEG23EN_cfg     0x20
    #define     SEG22EN_cfg     0x10
    #define     SEG21EN_cfg     0x08
    #define     SEG20EN_cfg     0x04

    #define     FDELAY_cfg      0x03            //D1~D0  配置掉电延时几个"cycles" 8、4、2、0 ,在 LCDSEGE 存储器中

//      LCD Config set ;LCDCON寄存器

    #define     LCDEN_cfg          0x80         //D7 LCD模块功能使能配置
    #define     LCDRST_cfg         0x40         //D6 The LCD data registers will reset to zero.blink
    #define     LCDBLINKEN_cfg     0x20         //D5 闪烁使能,设置由LCDCLK存储器的BLKMOD和BLKFREQ位确定
    #define     LCDPSM2_cfg        0x00         //D4 在PSM2工作模式时,由LCDEN位控制LCD显示或关闭
    #define     CLKSEL_cfg         0x00         //D3 LCD 时钟选择2048Hz
    #define     BIAS_cfg           0x04         //D2 1/3Bias模式
    #define     LMUX_cfg           0x03         //D1~D0 4COM 输出模式


//    外部或内部电阻分压网络配置:LCDCONX寄存器

    #define     EXTRES_cfg          0x00        //D6 不使用外部分压电阻网络
    #define     BLVL_cfg            0x1F        //D5~D0 内部电阻网络配置:1/3Bias模式,3V液晶 ,Va=Vref=1V

//    LCD新数据配置和数据刷新及反置模式:LCDCONY寄存器

    #define     INV_LVL_cfg         0x00        //D6 不使用反置模式
    #define     UPData_cfg          0X00        //D1 不上传数据 ,在正常使用时对其进行操作
    #define     REFRESH_cfg         0x00        //D0 不刷新数据 ,在正常使用时对LCD显示屏进行数据刷新

  //    LCD系统时钟配置:LCDCLK寄存器

    #define   BLKMOD_cfg           0xC0         //D7~D6   闪烁时钟周期模式配置:由 BLKFREQ的配置确定闪烁频率
    #define   BLKFREQ_cfg          0x10         //D5~D4   Blink Rate 1/2Hz, 闪烁时钟周期0.5S
    #define   FD_cfg               0x01         //D3~D0   选择2048Hz



    #define   LCD_Vref   PERIPH_bit.REF_BATT_EN    // 在PSM2模式时,LCD 参考电压选择(内部或外部提供)


//==============================================================================================

//    *************  Definition of LCD RAM   ************

//==============================================================================================


 __idata unsigned char LcdBuffer[LCD_DispLen];            //显示缓冲区-内部SRAM
 __idata unsigned char Disp_Count;                        //显示序号计数器


//-----------------------------------------------------------------------------------------------

//          公共数据运算区8字节
  __idata union                                         //公共数据运算区8字节
 {
    unsigned char TempChar[8];
    unsigned long Temp32;
    unsigned int  Temp16;
    unsigned char Temp8;

    struct
     {
        unsigned long Temp32A;
        unsigned long Temp32B;
     };
    struct
    {
        unsigned char Temp8L;
        unsigned char Temp8M;
        unsigned char Temp8H;
    };
  };


 //==============================================================================================

//    *************   LCD SHOW CODE   ************

//==============================================================================================

//  ******************  LCD 初始化  ************************

  void LcdInit(void)
   {
    LCD_Vref=1;                   //选择LCD参考电压:由内部提供; //This bit should be set if LCD On in PSM2 mode.
    PERIPH = PERIPH | 0x08;       //置MODE2能显示
    LCDCON  = LCDPSM2_cfg  +  CLKSEL_cfg +  BIAS_cfg +  LMUX_cfg ;
    LCDCONX = EXTRES_cfg  + BLVL_cfg ;
    LCDCONY = INV_LVL_cfg + UPData_cfg + REFRESH_cfg;
    LCDCLK  = BLKMOD_cfg  + BLKFREQ_cfg + FD_cfg ;
    LCDSEGE2= SEG16EN_cfg + SEG17EN_cfg + SEG18EN_cfg + SEG19EN_cfg ;
    LCDSEGE = SEG20EN_cfg + SEG21EN_cfg + SEG22EN_cfg + FDELAY_cfg ;
    LCDCON |= LCDEN_cfg ;                                             //使能LCD模块
   }

 //  *************  LCD 上传一屏数据  ***************************************************

  void LcdUpData(void)
  { unsigned char i;
    LcdLock();                         //开锁
    for (i=0;i<LCD_DispLen;i++)
      LcdWrData(i,LcdBuffer[i]);      //上传数据
    LcdRefresh();                     //刷新显示内容
  }

//  *************  LCD 显示屏--设置数据 data  ****************************************

  void LcdSetDisplay(unsigned char data)
   {
    unsigned char i;

    for (i=0;i <LCD_DispLen;i++)
      LcdBuffer[i] = data;
    LcdUpData();
   }

//==================================================================================================

//          LCD 显示模块

//==================================================================================================

#define	Ping_seg	0X01		/*平   buffer[1]*/
#define	Feng_seg	0X02		/*峰   buffer[1]*/
#define	Jian_seg	0X04		/*尖   buffer[1]*/
#define	Zong_seg	0X08		/*总   buffer[1]*/
#define	Gu_seg	0X10		/*谷   buffer[1]*/
#define	Dong_seg	0X20		/*冬   buffer[1]*/
#define	DianLiang_seg	0X40	        /*电量   buffer[1]*/
#define	KWH_seg 	0X80		/*KWH   buffer[1]*/

#define	Shi_Time 	0X01		/*时   buffer[10]*/
#define	Jian_Time	0X02		/*间   buffer[10]*/
#define	Duan_seg        0X04		/*段   buffer[10]*/
#define	BiaoHao_seg	0X08		/*表号   buffer[10]*/
#define	ShangYue_seg	0X10		/*上月   buffer[10]*/
#define	DangQian_seg	0X20		/*当前   buffer[10]*/
#define	FanXiang_seg	0X40		/*反向   buffer[10]*/
#define	RiQi_seg	0X80		/*日期   buffer[10]*/

//    与平、峰、尖、总、谷共用D0~D4,D4=1时,设定第二功能

#define  Point_1     0x11           //一位小数点
#define  Point_2     0x12           //二位小数点
#define  Point_3     0x13           //三位小数点
#define  Point_4     0x14           //四位小数点
#define  TEMP_FH     0x15           //温度符号

#define  U_FH        0x18           //电压符号


 //-------------------------------------------------------------------------------------------------
 //
 //             液晶显示段码结构关系图

    typedef volatile struct
    {
     unsigned char  LcdDataBuff0 ;        // 显示"上 x 月"  ,一位数码
     union
       {
         unsigned char  LcdDataBuff1;
         struct
            {
             unsigned  char Lcd_Ping:1;         //*平   buffer[1]*/
             unsigned  char Lcd_Feng:1;         //*峰   buffer[1]*/
             unsigned  char Lcd_Jian:1;		   //*尖   buffer[1]*/
             unsigned  char Lcd_Zong:1;		   //*总   buffer[1]*/
             unsigned  char Lcd_Gu:1;	         //*谷   buffer[1]*/
             unsigned  char Lcd_Dong:1;		   //*冬   buffer[1]*/
             unsigned  char Lcd_DianLiang:1;    //*电量   buffer[1]*/
             unsigned  char Lcd_KWH:1;		      //*KWH   buffer[1]*/
            };
       };
     union
       {
        unsigned char LcdDataBuff2[8];     //  数码显示区
        struct
            {
              unsigned char :7;
              unsigned char Lcd_P5:1;     //   液晶P5段   第一位数码上点--显示一位小数时用
              unsigned char :7;
              unsigned char Lcd_P4:1;     //   液晶P4段   第二位数码上点--显示二位小数时用
              unsigned char :7;
              unsigned char Lcd_P3:1;     //   液晶P3段   第三位数码上点
              unsigned char :7;
              unsigned char Lcd_P2:1;     //   液晶P2段   第四位数码上点, 用于显示时间用
              unsigned char :7;
              unsigned char Lcd_S6:1;     //   液晶S6段   "开锁" -状态
              unsigned char :7;
              unsigned char Lcd_P1:1;     //   液晶P1段   第六位数码上点        7
              unsigned char :7;
              unsigned char Lcd_S1:1;     //   液晶S1段    "冬"-状态
              unsigned char :7;
              unsigned char Lcd_P6:1;     //   液晶P6段   显示中层二个点,用于显示时间用
            };
       };
    union
       {
        unsigned char  LcdDataBuff10;
        struct
            {
             unsigned  char Lcd_Shi:1;               //*时   buffer[10]
             unsigned  char Lcd_Jian1:1;             //*间   buffer[10]
             unsigned  char Lcd_Duan:1;		     //*段   buffer[10]
             unsigned  char Lcd_BiaoHao:1;	     //*表号   buffer[10]
             unsigned  char Lcd_ShangYue:1;	     //*上月   buffer[10]
             unsigned  char Lcd_DangQian:1;	     //*当前   buffer[10]
             unsigned  char Lcd_FanXiang:1;          //*反向   buffer[10]
             unsigned  char Lcd_RiQi:1;		     //*日期   buffer[10]
            } ;
        };
    union
       {
        unsigned char  LcdDataBuff11;           //状态显示段
        struct
            {
             unsigned char Lcd_S2:1;           //   <-  符号
             unsigned char Lcd_S3:1;           //  电池-符号
             unsigned char Lcd_S4:1;           //  信电话-符号
             unsigned char Lcd_S5:1;           //  按键-符号
            } ;
       };
    } LcdDataStruct;                        //LCD液晶屏显示段码结构



//---------------------------------------------------------------------------------

//          1、显示序号
//          2、显示数据指针
//          3、数据长度
//          4、显示汉字提示符
//          5、S-状态标志符号
//          6、P-数字点符号

 /*

 __idata  volatile struct
    {
      DispDataStruct DispData;          //显示序号、显示数据指针、数据长度、显示汉字(16BIT)
      unsigned char Lcd_P;              //小数点、时分秒的点,年月日的点
      unsigned char Lcd_S;              //信号提示状态(电池电压、通信、按键、密码开锁、方向、冬)

    }DispDataBuff;

 */

//--------------------------------------------------------------------------------------------------------------------
/*
    A,B,C,D,E,F,G,P--->D0,D1,D2,D3,D4,D5,D6,D7

 */
//      Lcd 显示字符表

 __code const unsigned char Lcd_Zifu_Tab[]=

 //                                                                                10   11   12    13   14   15   16   17
 //0    1    2     3    4    5    6    7    8    9    A    B    C    D    E    F  null   H    L     R    O    N   n     -

 {0x5F,0x06,0x6B,0x2F,0x36,0x3D,0x7D,0x07,0x7F,0x3F,0x77,0x7C,0x59,0x6E,0x79,0x71,0x00, 0x76,0x58,0x60,0x5F,0x57,0x64,0x20};
									

#define  H_Code  0x76
#define  E_Code  0x79
#define  L_Code  0x58
#define  R_Code  0x60
#define  O_Code  0x6C
#define  N_Code  0x57
#define  D_Code  0x6e
#define	F_Code  0x71
#define  n_Code  0x64
#define  _Code   0x20
#define  u_Code  0x4C
#define  C_Code  0x59

 enum {Source_Code,Hex_Code,BCD_Code};          //数据属性定义(显示原段码、十六进制码、BCD码)



#define P1_Code  0x01                           //显示小数点的代码
#define P2_Code  0x02
#define P3_Code  0x04
#define P4_Code  0x08
#define P5_Code  0x10
#define P6_Code  0x20

#define S1_Code  0x10                           //显示小数点的代码
#define S2_Code  0x01
#define S3_Code  0x02
#define S4_Code  0x04
#define S5_Code  0x08
#define S6_Code  0x20

#define Set_Lcd_P1()   (LcdBuffer[7] |= 0x80)       //置显示小数点的代码宏定义
#define Set_Lcd_P2()   (LcdBuffer[5] |= 0x80)
#define Set_Lcd_P3()   (LcdBuffer[4] |= 0x80)
#define Set_Lcd_P4()   (LcdBuffer[3] |= 0x80)
#define Set_Lcd_P5()   (LcdBuffer[2] |= 0x80)
#define Set_Lcd_P6()   (LcdBuffer[9] |= 0x80)

#define Set_Lcd_S1()   (LcdBuffer[8]  |= 0x80)      //置显示状态点的代码宏定义
#define Set_Lcd_S2()   (LcdBuffer[11] |= 0x01)
#define Set_Lcd_S3()   (LcdBuffer[11] |= 0x02)
#define Set_Lcd_S4()   (LcdBuffer[11] |= 0x04)
#define Set_Lcd_S5()   (LcdBuffer[11] |= 0x08)
#define Set_Lcd_S6()   (LcdBuffer[6]  |= 0x80)


#define Close_Lcd_P1()   (LcdBuffer[7] &= 0x7F)       //清显示小数点的代码宏定义
#define Close_Lcd_P2()   (LcdBuffer[5] &= 0x7F)
#define Close_Lcd_P3()   (LcdBuffer[4] &= 0x7F)
#define Close_Lcd_P4()   (LcdBuffer[3] &= 0x7F)
#define Close_Lcd_P5()   (LcdBuffer[2] &= 0x7F)
#define Close_Lcd_P6()   (LcdBuffer[9] &= 0x7F)

#define Close_Lcd_S1()   (LcdBuffer[8]  &= 0x7F)      //清显示状态点的代码宏定义
#define Close_Lcd_S2()   (LcdBuffer[11] &= 0xFE)
#define Close_Lcd_S3()   (LcdBuffer[11] &= 0xFD)
#define Close_Lcd_S4()   (LcdBuffer[11] &= 0xFB)
#define Close_Lcd_S5()   (LcdBuffer[11] &= 0xF7)
#define Close_Lcd_S6()   (LcdBuffer[6]  &= 0x7F)

 //********************************************************************************

 //         取显示字符函数

  unsigned char GetDispCode(unsigned char Da)
  {
    if (Da >= (sizeof Lcd_Zifu_Tab))
      return 0;
    return  (Lcd_Zifu_Tab[Da]);
  }

//********************************************************************************

//函数名称:   LcdDispApi

//函数描述:   将显示缓冲区"DispDataBuff"(显示数据结构体)的数据送液晶屏显示

//输入参数:  1、 "DispDataBuff"(显示数据结构体)的数据,见结构体;2、输入数据属性。

//输出参数:  无

//********************************************************************************



  //       显示- 小数点处理

  /*
   void LcdDispPontApi(unsigned char Pont_Val)
   {
     if (Pont_Val & P1_Code)
       Set_Lcd_P1();
//     else
//       Close_Lcd_P1();
     if (Pont_Val & P2_Code)
       Set_Lcd_P2();
//     else
//       Close_Lcd_P2();
     if (Pont_Val & P3_Code)
       Set_Lcd_P3();
//     else
//       Close_Lcd_P3();
     if (Pont_Val & P4_Code)
       Set_Lcd_P4();
//     else
//       Close_Lcd_P4();
     if (Pont_Val & P5_Code)
       Set_Lcd_P5();
//     else
//       Close_Lcd_P5();
     if (Pont_Val & P6_Code)
       Set_Lcd_P6();
//      else
//       Close_Lcd_P6();

   }

 */
 //----------------------------------------------------------------

 //       显示- 状态处理

 void LcdDispStatApi(unsigned char Stat_Val)
   {

⌨️ 快捷键说明

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