📄 ch452jp.c
字号:
#include <pic.h>
/********************************************************************************************
CH452驱动程序
与单片机接口方式:4线
********************************************************************************************/
typedef unsigned int uint;
typedef unsigned char uchar;
unsigned int Led_seg[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,
0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x02,0x01}; //*0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,-,.的字符码*/
unsigned int Bitmap[]={0xc00,0xd00,0xe00,0xf00,0x800,0x900,0xa00,0xb00}; //显示用位码列表
//管脚定义
#define CH452_DCLK RD0 // 串行数据时钟上升沿激活
#define CH452_DIN RD1 // 串行数据输出,接CH452的数据输入
#define CH452_LOAD RD2 // 串行命令加载,上升沿激活
#define CH452_DOUT RB0 // INT0,键盘中断和键值数据输入,接CH452的数据输出
// 4线接口的位操作,与单片机有关
#define CH452_DCLK_SET (CH452_DCLK=1)
#define CH452_DCLK_CLR (CH452_DCLK=0)
#define CH452_DIN_SET (CH452_DIN=1)
#define CH452_DIN_CLR (CH452_DIN=0)
#define CH452_LOAD_SET (CH452_LOAD=1)
#define CH452_LOAD_CLR (CH452_LOAD=0)
// 与单片机有关,与中断连接方式有关
#define DISABLE_INTERRUPT (INTE=0)
#define ENABLE_INTERRUPT (INTE=1)
#define CLEAR_INTER_FLAG (INTF=0)
//命令码
#define CH452_NOP 0x0000 // 空操作
#define CH452_RESET 0x0201 // 复位
#define CH452_LEVEL 0x0100 // 加载光柱值
#define CH452_CLR_BIT 0x0180 // 段位清0
#define CH452_SET_BIT 0x01C0 // 段位置1
#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码
#define CH452_SYSOFF 0x0400 //关显示、键盘(设置系统参数)
#define CH452_SYSON1 0x0401 //开显示 (设置系统参数)
#define CH452_SYSON2 0x0423 //开显示、键盘 (设置系统参数)
#define CH452_SYSON2W 0x0423 //开显示、键盘, 真正2线接口 (设置系统参数)
#define CH452_DSP 0x0500 //设置默认显示方式 (设置显示参数)
#define CH452_BCD 0x0580 //设置BCD译码方式
#define CH452_TWINKLE 0x0600 //设置闪烁控制
#define CH452_GET_KEY 0x0700 // 获取按键
void InitCh452();
void WrietCh452(uint da);
void DelayUs();
void Bit_Display_Num(uint bite,uint buf);
void Display_Reset();
void Flash_SingleBit(uint bitnumber);
uint ReadCh452();
void Flash_AllBit();
void display(uint keyda);
void initial();
//系统初始化函数*/
void initial()
{
INTCON=0x00; //开总中断
ADCON1=0x07;
PIE1=0;
PIE2=0;
}
/********************************************************************************************
初始化
********************************************************************************************/
void InitCh452()
{
WrietCh452(CH452_SYSON2); //打开显示
WrietCh452(CH452_DSP); //设置默认方式
//Display_Reset();
}
/********************************************************************************************
向CH452发送指令和数据
da;指令和数据
********************************************************************************************/
void WrietCh452(uint da)
{
uint iq0;
DISABLE_INTERRUPT; //关闭键盘中断
CH452_LOAD_CLR; //复位LOAD信号
for(iq0=0;iq0<12;iq0++)
{
if((da&0x0001)==1)
CH452_DIN_SET;
else
CH452_DIN_CLR;
CH452_DCLK_CLR;
da >>=1;
CH452_DCLK_SET; //CH452上升沿读取数据
}
CH452_LOAD_SET; //加载数据,LOAD上升沿
DelayUs();
ENABLE_INTERRUPT; //打开键盘中断
}
/*--------------------------------------------------------------------------------------------
单个位上显示数据
---------------------------------------------------------------------------------------------*/
void Bit_Display_Num(uint bite,uint buf)
{
WrietCh452(Bitmap[bite]+Led_seg[buf]);
}
/****************************************************************
显示复位
****************************************************************/
void Display_Reset()
{
WrietCh452(0x201);
}
/*--------------------------------------------------------------------------------------------
单个位的闪烁操作
---------------------------------------------------------------------------------------------*/
void Flash_SingleBit(uint bitnumber)
{
WrietCh452(CH452_TWINKLE+(0x01<<bitnumber));
}
/*--------------------------------------------------------------------------------------------
全闪操作
---------------------------------------------------------------------------------------------*/
void Flash_AllBit()
{
WrietCh452(CH452_TWINKLE+0xff);
}
/***************************************************************************************
按键中断函数
***************************************************************************************/
void interrupt IntKey()
{uint i;
InitCh452();
for(i=0;i<8;i++)
{
Bit_Display_Num(i,i);
}
//Flash_AllBit();
CLEAR_INTER_FLAG;
}
/***************************************************************************************
延时
***************************************************************************************/
void DelayUs()
{
asm("nop");
asm("nop");
asm("nop");
}
void main()
{
TRISD=0x00;
TRISB=0x01;
initial();
CLEAR_INTER_FLAG;
GIE=1;
ENABLE_INTERRUPT;
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -