📄 sy-mck280x_display.c
字号:
/*------------------------------------------------------------------------
System Name: SY-MCK280X_Display
File Name: SY-MCK280x_Display.c
Description:
--------------------------------------------------------------------------*/
#include "target.h"
#include "DSP280x_Device.h"
#include "IQmathLib.h"
#include <math.h>
#define SDA_1 GpioDataRegs.GPBDAT.bit.GPIO32 = 1
#define SDA_0 GpioDataRegs.GPBDAT.bit.GPIO32 = 0
#define SCL_1 GpioDataRegs.GPBDAT.bit.GPIO33 = 1
#define SCL_0 GpioDataRegs.GPBDAT.bit.GPIO33 = 0
#define Read_SDA GpioDataRegs.GPBDAT.bit.GPIO32
#define DelaymsNum 5000 //100MHz
/* 常量定义 */
/* CH451和CH452的常用命令码 */
#define CH452_NOP 0x0000 // 空操作
#define CH452_RESET 0x0201 // 复位
#define CH452_LEVEL 0x0100 // 加载光柱值,需另加7位数据
#define CH452_CLR_BIT 0x0180 // 段位清0,需另加6位数据
#define CH452_SET_BIT 0x01C0 // 段位置1,需另加6位数据
#define CH452_SLEEP 0x0202 // 进入睡眠状态
#define CH452_LEFTMOV 0x0300 // 设置移动方式-左移
#define CH452_LEFTCYC 0x0301 // 设置移动方式-左循环
#define CH452_RIGHTMOV 0x0302 // 设置移动方式-右移
#define CH452_RIGHTCYC 0x0303 // 设置移动方式-右循环
#define CH452_SELF_BCD 0x0380 // 自定义BCD码,需另加7位数据
#define CH452_SYSOFF 0x0400 // 关闭显示、关闭键盘
#define CH452_SYSON1 0x0401 // 开启显示
#define CH452_SYSON2 0x0403 // 开启显示、键盘
#define CH452_SYSON2W 0x0423 // 开启显示、键盘, 真正2线接口
#define CH452_NO_BCD 0x0500 // 设置默认显示方式,可另加3位扫描极限
#define CH452_BCD 0x0580 // 设置BCD译码方式,可另加3位扫描极限
#define CH452_BCD_D 0x05D0
#define CH452_TWINKLE 0x0600 // 设置闪烁控制,需另加8位数据
#define CH452_GET_KEY 0x0700 // 获取按键,返回按键代码
#define CH452_DIG0 0x0800 // 数码管位0显示,需另加8位数据
#define CH452_DIG1 0x0900 // 数码管位1显示,需另加8位数据
#define CH452_DIG2 0x0a00 // 数码管位2显示,需另加8位数据
#define CH452_DIG3 0x0b00 // 数码管位3显示,需另加8位数据
#define CH452_DIG4 0x0c00 // 数码管位4显示,需另加8位数据
#define CH452_DIG5 0x0d00 // 数码管位5显示,需另加8位数据
#define CH452_DIG6 0x0e00 // 数码管位6显示,需另加8位数据
#define CH452_DIG7 0x0f00 // 数码管位7显示,需另加8位数据
// BCD译码方式下的特殊字符
#define CH452_BCD_SPACE 0x10
#define CH452_BCD_PLUS 0x11
#define CH452_BCD_MINUS 0x12
#define CH452_BCD_EQU 0x13
#define CH452_BCD_LEFT 0x14
#define CH452_BCD_RIGHT 0x15
#define CH452_BCD_UNDER 0x16
#define CH452_BCD_CH_H 0x17
#define CH452_BCD_CH_L 0x18
#define CH452_BCD_CH_P 0x19
#define CH452_BCD_DOT 0x1A
#define CH452_BCD_SELF 0x1E
#define CH452_BCD_TEST 0x88
#define CH452_BCD_DOT_X 0x80
// 有效按键代码
#define CH452_KEY_MIN 0x40
#define CH452_KEY_MAX 0x7F
// 2线接口的CH452定义
#define CH452_I2C_ADDR0 0x40 // CH452的ADDR=0时的地址
#define CH452_I2C_ADDR1 0x60 // CH452的ADDR=1时的地址,默认值
#define CH452_I2C_MASK 0x3E // CH452的2线接口高字节命令掩码
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
interrupt void MainISR(void); //主中断函数
interrupt void KeyValueGet(void);
void IniteGpio_I2C(void); //I2C端口配置子程序
void delayms(unsigned char i); //延时子程序
void I2C_Start(void); //I2C启动子程序
void I2C_Stop(void); //I2C停止子程序
void DisableKeyInterrupt(void); //禁止按键中断子程序
void EnableKeyInterrupt(void); //使能按键中断子程序
void I2C_SDA_OUT(void);
void I2C_SDA_IN(void);
void I2C_SCL_OUT(void);
void I2C_WrByte(unsigned char dat);
unsigned char I2C_RdByte(void);
void CH452_Write(unsigned short cmd);
unsigned char CH452_Read(void);
unsigned int Key_Value(unsigned char Key);
unsigned short PerSetCode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//A B C D E F G . 段
unsigned short NumSetCode[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x58,0x5E,0x79,0x71,0x80};
//0 1 2 3 4 5 6 7 8 9 A B C D E F . 数据
//unsigned char erSetCode[4]={0x79,0x50,0x50,0x00};
Uint32 MainISR_Ticket = 0;
Uint32 KeyValueGetTicket = 0;
unsigned int KeyValue = 0;
Uint16 KeyValueKeep = 0;
Uint16 ValueTarget = 0;
Uint16 Bit1Num = 0;
Uint16 Bit2Num = 0;
Uint16 Bit3Num = 0;
Uint16 Bit4Num = 0;
Uint16 Bit1NumKeep = 0;
Uint16 Bit2NumKeep = 0;
Uint16 Bit3NumKeep = 0;
Uint16 Bit4NumKeep = 0;
void main(void)
{
InitSysCtrl();
IniteGpio_I2C(); //as gpio input
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
EALLOW; //中断程序入口
PieVectTable.TINT0 = &MainISR;
PieVectTable.XINT2 = &KeyValueGet;
EDIS;
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0, 100, 60);
StartCpuTimer0();
/*------------------flash 初始化程序------------------------*/
// MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
// InitFlash();
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //MainISR
PieCtrlRegs.PIEIER1.bit.INTx5 = 1; //xint2
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0; // GPIO
GpioCtrlRegs.GPADIR.bit.GPIO7 = 0; // input
GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 2; // XINT2 Qual using 6 samples
GpioCtrlRegs.GPACTRL.bit.QUALPRD0 = 0x03; // 鉴定周期选择
EDIS;
EALLOW;
GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL = 7; // XINT2 is GPIO7
EDIS;
XIntruptRegs.XINT2CR.bit.POLARITY = 0; // dowm edge interrupt
XIntruptRegs.XINT2CR.bit.ENABLE = 1; // Enable XINT2
//初始化变量
CH452_Write(CH452_RESET);
CH452_Write(CH452_SYSON2);
CH452_Write(CH452_BCD_D);
IER |= M_INT1;
EINT;
ERTM;
for(;;)
{;}
}
void interrupt MainISR(void)
{
MainISR_Ticket++;
//------------------------------------------
if(KeyValue == 1)
{
if(KeyValueKeep == 9999)
{
CH452_Write(CH452_RESET);
CH452_Write(CH452_SYSON2);
CH452_Write(CH452_BCD_D);
KeyValueKeep = 0;
}
else
KeyValueKeep++;
}
if(KeyValue == 2)
{
if((KeyValueKeep == 10)||(KeyValueKeep == 100)||(KeyValueKeep == 1000))
{
CH452_Write(CH452_RESET);
CH452_Write(CH452_SYSON2);
CH452_Write(CH452_BCD_D);
Bit1NumKeep = 0;
Bit2NumKeep = 0;
Bit3NumKeep = 0;
Bit4NumKeep = 0;
}
if(KeyValueKeep == 0)
{
KeyValueKeep = 9999;
Bit1Num = 9;
Bit2Num = 9;
Bit3Num = 9;
Bit4Num = 9;
}
else
KeyValueKeep--;
}
//------------得到每一位显示数据------------
if(KeyValueKeep < 10)
{
Bit1Num = KeyValueKeep;
}
else if(KeyValueKeep >=10 && KeyValueKeep < 100)
{
Bit1Num = KeyValueKeep%10;
Bit2Num = KeyValueKeep/10;
}
else if(KeyValueKeep >=100 && KeyValueKeep < 1000)
{
Bit1Num = KeyValueKeep%10;
Bit2Num = KeyValueKeep/10%10;
Bit3Num = KeyValueKeep/100;
}
else if(KeyValueKeep >=1000 && KeyValueKeep < 10000)
{
Bit1Num = KeyValueKeep%10;
Bit2Num = KeyValueKeep/10%10;
Bit3Num = KeyValueKeep/100%10;
Bit4Num = KeyValueKeep/1000;
}
else
{
;
}
//--------------------------
if(Bit1Num != Bit1NumKeep)
{
CH452_Write(CH452_DIG0 | Bit1Num);
}
if(Bit2Num != Bit2NumKeep)
{
CH452_Write(CH452_DIG1 | Bit2Num);
}
if(Bit3Num != Bit3NumKeep)
{
CH452_Write(CH452_DIG2 | Bit3Num);
}
if(Bit4Num != Bit4NumKeep)
{
CH452_Write(CH452_DIG3 | Bit4Num);
}
//------------------------------------------
KeyValue = 0;
Bit1NumKeep = Bit1Num;
Bit2NumKeep = Bit2Num;
Bit3NumKeep = Bit3Num;
Bit4NumKeep = Bit4Num;
//---------------------------------------------
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
interrupt void KeyValueGet(void)
{
KeyValueGetTicket++;
KeyValue = CH452_Read();
KeyValue = Key_Value(KeyValue);
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void IniteGpio_I2C(void)
{
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0; //pull up as SDA
GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0; //pull up as SCK
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 0; //as input
GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0; //as input
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0; //as gpio
GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 0; //as gpio
EDIS;
}
//--------------------延时子程序-----------------------------
void delayms(unsigned char i)
{
unsigned int j;
do
{
for(j=0;j!=DelaymsNum;j++)
{;}
}while(--i);
}
//-------------------------------------------------------------
//-----------------SDA引脚输出子程序---------------------------
void I2C_SDA_OUT(void)
{
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1; //SDA as output
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0; //as gpio
EDIS;
}
//-------------------------------------------------------------
//-----------------SDA引脚输入子程序---------------------------
void I2C_SDA_IN(void)
{
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 0; //SDA as input
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0; //as gpio
EDIS;
}
//-------------------------------------------------------------
//-----------------SCL引脚输入子程序---------------------------
void I2C_SCL_OUT(void)
{
EALLOW;
GpioCtrlRegs.GPBDIR.bit.GPIO33 = 1; //SDA as output
GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 0; //as gpio
EDIS;
}
//-------------------------------------------------------------
//-----------------I2C启动子程序-------------------------------
void I2C_Start(void)
{
// DisableKeyInterrupt();
SDA_1;
I2C_SDA_OUT();
delayms(1);
SCL_1; //SDA_1; SCL_1;两句准备启动信号
I2C_SCL_OUT();
delayms(1);
SDA_0; //至该句时,产生启动信号
delayms(1);
SCL_0; //至该句时,启运完成
delayms(1);
}
//-------------------------------------------------------------
//----------------I2C停止子程序--------------------------------
void I2C_Stop(void)
{
delayms(1);
SDA_0;
I2C_SDA_OUT();
delayms(1);
SCL_1; //SDA_0; SCL_1;两句准备停止信号
delayms(1);
SDA_1;
delayms(1);
// delayms(1); //结束时,建议将SDA SCL都恢复为高电平
// EnableKeyInterrupt();
}
//-------------------------------------------------------------
//----------------I2C写一个字节子程序--------------------------
void I2C_WrByte(unsigned char dat)
{
unsigned char i;
I2C_SDA_OUT(); // 设置SDA为输出方向
for(i=0;i!=8;i++) // 输出8位数据
{
if(dat&0x80)
SDA_1;
else
SDA_0;
delayms(1);
SCL_1;
dat<<=1;
delayms(1);
// delayms(1);
SCL_0;
delayms(1);
}
SDA_1;
delayms(1);
I2C_SDA_IN();
SCL_1; // 接收应答
delayms(1);
// delayms(1);
SCL_0;
delayms(1);
}
//-------------------------------------------------------------
//----------------I2C读一个字节数据子程序--------------------------
unsigned char I2C_RdByte(void)
{
unsigned char dat,i;
// delayms(1);
I2C_SDA_IN(); // 设置SDA为输入方向
dat=0;
for(i=0;i!=8;i++) // 输入8位数据
{
SCL_1;
delayms(1);
delayms(1);
dat<<=1;
if(Read_SDA == 1) dat++; // 输入1位
SCL_0;
if(i == 7)
{
I2C_SDA_OUT();
}
delayms(2);
}
SDA_1;//应答信号
delayms(1);
SCL_1; // 发出无效应答
delayms(1);
// delayms(1);
SCL_0;
return(dat);
}
//-------------------------------------------------------------
//-----------------I2C写命令子程序-----------------------------
void CH452_Write(unsigned short cmd)
{
I2C_Start(); //启动总线
I2C_WrByte((unsigned char)(cmd>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1); // CH452的ADDR=1时(默认)
I2C_WrByte((unsigned char)cmd); //发送数据
I2C_Stop(); //结束总线
}
//--------------------------------------------------------------
//-----------------I2C读取按键命令子程序------------------------------??????????????
unsigned char CH452_Read(void)
{
unsigned char keycode;
I2C_Start(); //启动总线
I2C_WrByte((unsigned char)(CH452_GET_KEY>>7)&CH452_I2C_MASK|0x01|CH452_I2C_ADDR1); // 若有两个CH452并连,当ADDR=0时,需修改为CH452_I2C_ADDR0
keycode=I2C_RdByte(); //读取数据
I2C_Stop(); //结束总线
return(keycode);
}
//----------------------------------------------------------------------------
//------------------------------------------------------------------------
void DisableKeyInterrupt(void)
{
XIntruptRegs.XINT2CR.bit.ENABLE = 0; // Disable XINT2
}
void EnableKeyInterrupt(void)
{
XIntruptRegs.XINT2CR.bit.ENABLE = 1; // Enable XINT2
}
//----------------------------------------------------------------------
unsigned int Key_Value(unsigned char Key)
{
unsigned int TargetValue;
TargetValue = (unsigned int)Key;
switch(TargetValue)
{
case 0x40:
KeyValue = 4;
break;
case 0x41:
KeyValue = 3;
break;
case 0x42:
KeyValue = 2;
break;
case 0x43:
KeyValue = 1;
break;
case 0x48:
KeyValue = 8;
break;
case 0x49:
KeyValue = 7;
break;
case 0x4A:
KeyValue = 6;
break;
case 0x4B:
KeyValue = 5;
break;
case 0x50:
KeyValue = 12;
break;
case 0x51:
KeyValue = 11;
break;
case 0x52:
KeyValue = 10;
break;
case 0x53:
KeyValue = 9;
break;
case 0x58:
KeyValue = 16;
break;
case 0x59:
KeyValue = 15;
break;
case 0x5A:
KeyValue = 14;
break;
case 0x5B:
KeyValue = 13;
break;
default:
break;
}
return (KeyValue);
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -