📄 show_module1.c
字号:
/*===========================================================================
* 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 + -