📄 ch452ldriver.c
字号:
#include<iom8v.h>
#include<macros.h>
#include"delay.h"
unsigned flag;
/************************************************************************
*说明:运行与CH452L的4线模式,MCU使用ATMEGA8L,MCU与CH452L引脚连接如下:
LOAD PC0
DCLK PC1
DIN PC2
DOUT PD2()INT0
LOAD,DCLK,DIN都为输出,DOUT为输入,若要使用其它IO口,只需更改如下宏定义即可
*************************************************************************/
#define PC0 0
#define PC1 1
#define PC2 2
#define PD2 2
#define LOAD_OUT DDRC |= BIT(PC0)
#define LOAD_OUT0 PORTC &= ~BIT(PC0)
#define LOAD_OUT1 PORTC |= BIT(PC0)
#define DCLK_OUT DDRC |= BIT(PC1)
#define DCLK_OUT0 PORTC &= ~BIT(PC1)
#define DCLK_OUT1 PORTC |= BIT(PC1)
#define DIN_OUT DDRC |= BIT(PC2)
#define DIN_OUT0 PORTC &= ~BIT(PC2)
#define DIN_OUT1 PORTC |= BIT(PC2)
#define DOUT_IN DDRD &= ~BIT(PD2)
#define DOUT_OUT0 PORTD &= ~BIT(PD2)
#define DOUT_OUT1 PORTD |= BIT(PD2)
#define DOUT_PIN PIND & 0x04
/*************************************************************************
*宏定义CH452L系统命令
*************************************************************************/
#define RESET_CHIP 0x0201
#define OPEN_DISPLAY 0x0401 //开启显示
#define OPEN_KEYBOARD 0x0422 //开启键盘
#define OPEN_DISPLAY_KEYBOARD 0x0423 //开启显示和键盘
#define DATA_LEFT 0x0300 //数据左移
#define DATA_RIGHT 0x0302 //数据右移
#define LEFT_CIRCLE 0x0301 //数据左循环
#define RIGHT_CIRCLE 0x0303 //数据右循环
#define READ_KEYCODE 0x0700 //读取按键代码
/*************************************************************************
*宏定义CH452L加载数据DIG7~DIG0
* 说明:若要使用小数点,则只需将第7位置为1即可,例如0x0f80
*************************************************************************/
#define CH452L_DIG7 0x0f00
#define CH452L_DIG6 0x0e00
#define CH452L_DIG5 0x0d00
#define CH452L_DIG4 0x0c00
#define CH452L_DIG3 0x0b00
#define CH452L_DIG2 0x0a00
#define CH452L_DIG1 0x0900
#define CH452L_DIG0 0x0800
/**************************************************************************
*函数名:初始化CH452L端口
*函数功能:LOAD,DCLK,DIN都为输出,DOUT为输入
*入口参数:无
*出口参数:无
**************************************************************************/
int Init_Ch452lport(void)
{
LOAD_OUT;
LOAD_OUT1;
DCLK_OUT;
DCLK_OUT1;
DIN_OUT;
DIN_OUT1;
DOUT_IN;
DOUT_OUT1;
Delay_Nus(30); //延时
return 0x31;
}
/**************************************************************************
*函数名称:向CH452L写入命令函数
*函数功能:
*入口参数:定义一无符号整型变量存储12字节的命令字。
*出口参数:无
***************************************************************************/
void Ch452l_Writecommand(unsigned int command)
{
unsigned char i;
LOAD_OUT0;
Delay_Nus(2);
for(i=0;i<12;i++)
{
DCLK_OUT0;
if(command&0x0001==0x0001)
{
DIN_OUT1;
}
else
{
DIN_OUT0;
}
command=command>>1;
DCLK_OUT1;
}
LOAD_OUT1; //LOAD上升沿加载一帧数据
DIN_OUT1;
DCLK_OUT1;
}
/**************************************************************************
*函数名:Init_Ch452lsystem(void)
*函数功能:初始化CH452L
*命令说明:
*(1)采用BCD译码方式显示设置显示参数命令:
* 命令 显示位数
* 0x0580 8
* 0x0590 1
* 0x05a0 2
* 0x05b0 3
* 0x05c0 4
* 0x05d0 5
* 0x05e0 6
* 0x05f0 7
*(2)OPEN_DISPLAY_KEYBOARD开启显示和键盘命令
* 命令 开启 输出中断方式
* 0x0401 显示 无(无键盘功能下不考虑)
* 0x0402 键盘 低电平中断(不推荐用于测试)
* 0x0422 键盘 边缘中断
* 0x0403 显示和键盘 低电平中断(不推荐使用)
* 0x0423 显示和键盘 边缘中断
*入口参数:无
*出口参数:无
**************************************************************************/
int Init_Ch452lsystem(void)
{
Ch452l_Writecommand(RESET_CHIP);//芯片复位
Delay_Nus(40);
Ch452l_Writecommand(OPEN_DISPLAY_KEYBOARD);//开启显示和键盘,边缘中断
Delay_Nus(5);
return 0x32;
}
/***************************************************************************
*函数名:
*功能:
*入口参数:
n 要显示的数码管的位数
*p 要显示的数码管的值,BCD码,在显示前将要显示的数码管的BCD码存入该数组
*出口参数:
****************************************************************************/
void Display_Ch452lBCD(unsigned char n,unsigned char *p)
{
unsigned char i;
switch(n)
{
case(1):
Ch452l_Writecommand(0x0590);//1位显示,BCD译码
Delay_Nus(3);
break;
case(2):
Ch452l_Writecommand(0x05a0);//2位显示,BCD译码
Delay_Nus(3);
break;
case(3):
Ch452l_Writecommand(0x05b0);//3位显示,BCD译码
Delay_Nus(3);
break;
case(4):
Ch452l_Writecommand(0x05c0);//4位显示,BCD译码
Delay_Nus(3);
break;
case(5):
Ch452l_Writecommand(0x05d0);//5位显示,BCD译码
Delay_Nus(3);
break;
case(6):
Ch452l_Writecommand(0x05e0);//6位显示,BCD译码
Delay_Nus(3);
break;
case(7):
Ch452l_Writecommand(0x05f0);//7位显示,BCD译码
Delay_Nus(3);
break;
case(8):
Ch452l_Writecommand(0x0580);//8位显示,BCD译码
Delay_Nus(3);
break;
default:
break;
}
Ch452l_Writecommand(CH452L_DIG7 | p[7]);
Ch452l_Writecommand(CH452L_DIG6 | p[6]);
Ch452l_Writecommand(CH452L_DIG5 | p[5]);
Ch452l_Writecommand(CH452L_DIG4 | p[4]);
Ch452l_Writecommand(CH452L_DIG3 | p[3]);
Ch452l_Writecommand(CH452L_DIG2 | p[2]);
Ch452l_Writecommand(CH452L_DIG1 | p[1]);
Ch452l_Writecommand(CH452L_DIG0 | p[0]);
Ch452l_Writecommand(CH452L_DIG0 | p[0]);
}
/***************************************************************************
*函数名:
*功能:读取CH452L按键代码
*入口参数:无
*出口参数:返回读取到的键值,参考手册上的键值表
*说明:由于读取按键代码时B0~B7无效,只有B8~B11有效,可以使用简化的读取按键命
令,即输出命令0111。必须关中断,再开中断,否则读出的键值出错
****************************************************************************/
unsigned char Read_Keycode(void)
{
unsigned char keyvalue=0,temp,i;
unsigned char cmd=0x07;//使用简化的读取按键命令,使用cmd的低四位
GICR &= 0xbf; //关中断INT0
Delay_Nus(5);
LOAD_OUT0; //LOAD输出0
for(i=0;i<4;i++)
{
DCLK_OUT0;
if(cmd & 1)
{
DIN_OUT1;
}
else
{
DIN_OUT0;
}
DCLK_OUT1;
cmd=cmd>>1;
}
LOAD_OUT1; //LOAD上升沿加载一帧数据
DIN_OUT1;
DCLK_OUT1;
keyvalue=0;
for(i=0;i<7;i++)
{
keyvalue<<=1;
if(DOUT_PIN)
{
keyvalue=keyvalue+1;
Uart_Transmit(0x01);
}
DCLK_OUT0;
DCLK_OUT1;
}
DCLK_OUT1;
DIN_OUT1;
GICR |= 0x40; //开中断
GIFR = 0x40; //清中断标志INT0
Delay_Nus(5);
return keyvalue;
}
/***************************************************************************
*函数名:
*功能:外部中断INT0的初始化,边缘触发
*入口参数:无
*出口参数:无
*中断方式说明: MCUCR INT0中断方式
* 0x00 低电平中断
* 0x01 上升沿和下降沿都产生中断
* 0x02 下降沿产生中断
* 0x03 上升沿产生中断
****************************************************************************/
void Init_Int0(void)
{
CLI();
MCUCR = 0x00; //0x00为低电平触发INT0中断
GICR |= 0x40; //INT0使能
TIMSK = 0x00;
SEI();
}
/***************************************************************************
*函数名:INT0中断服务函数
*功能:
*说明:低电平触发中断
*入口参数:无
*出口参数:无
****************************************************************************/
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
flag=1;
Uart_Transmit(0xbb);
GIFR = 0x40; //清中断标志INT0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -