LCD显示--TM1721芯片驱动程序
发布时间
阅读量:
阅读量
该代码为TM1721芯片的驱动程序,主要实现了以下功能:初始化端口和定时器、按键扫描、显示控制、PWM输出、以及相关辅助函数。代码中包含多种功能模块,如初始化端口配置、定时器延时、按键扫描、固定地址显示、PWM输出控制等,能够实现芯片的显示控制、按键扫描以及PWM信号的输出。
TM1721芯片驱动
带LCD/LED显示屏驱动以及按键扫描功能:
STB在下降沿初始化串行接口后等待指令。STB作为指令的第一字节。当处理指令期间,其他处理被终止。当STB为高时,CLK和DIO被忽略。时钟上升沿时输入/输出串行数据,从低位开始。输出为开漏N管,需外加拉电阻。
CLK:在时钟上升沿输入/输出串行数据。
DIO:通过时钟上升沿的输入输出串行数据,从低位输入。输出为N管开漏输出类型,需要外接上拉电阻。
#include "global.h"
#include "drv_tm1721.h"
#include "drv_key.h"
/*-------------------------------------------*/
/*驱动包含函数: */
/*-------------------------------------------*/
unsigned char ret_var;
#define PWM2_VALUE 0x3f
#define PWM3_VALUE 0x1f
#define MODE_SET 0x30 //显示模式//0011 0000 SW2~3 PWM2~3 KEY0~3
#define PWM_WRITE 0x45 //写PWM寄存器 控制背光 固定地址模式
#define DISP_WRITE 0x44 //0100 0100 显示寄存器数据地址 固定地址
#define KEY_READ 0x46 //读键扫数据 0100 0010 固定地址
DISPLAT_DATA_U DisplayData;
/******************************************
函数:初始化端口
参数:
返回值:无
******************************************/
void TM1721_PORT_INIT(void)
{
GPIO_Init(PANEL_STB_GPIO_PORT, PANEL_STB_GPIO_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW);
GPIO_Init(PANEL_CLK_GPIO_PORT, PANEL_CLK_GPIO_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW);
PANEL_DIO_OUT_MODE;
}
/******************************************
函数:延时函数
参数:
返回值:无
******************************************/
void TM1721_Delay_ms(void)
{
//当将=1的时候,延时1ms
unsigned short jj;
for (jj = 1; jj <= 2; jj++)
{
__asm("NOP");
//WDTCR2 = 0x4E;
}
}
/******************************************
函数:写一字节函数
参数:dat---写入的一字节数据
返回值:无
******************************************/
void TM1721_Write_Byte(unsigned char dat)
{
unsigned char i;
//TM1721_Delay_ms(2); //用于片选信号的延时
PANEL_STB_LOW; //STB下降沿后DIO输入的第一个字节作为指令//有效的片选信号
for (i = 0; i < 8; i++)
{
PANEL_CLK_LOW;
if (dat & 0x01)
{
PANEL_DIO_HIGH;
}
else
{
PANEL_DIO_LOW; //先写低位
}
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
//TM1721_Delay_ms();
PANEL_CLK_HIGH; //时钟上升沿,送入一位数据
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
dat >>= 1;
}
PANEL_CLK_LOW;
//TM1721_Delay_ms(2); //用于片选信号的延时
}
/********************************************
函数:固定地址一显示函数
参数: *dat---显示数据的数组指针
返回值:无
********************************************/
void TM1721_Write_String(unsigned char *dat)
{
PANEL_STB_HIGH;
TM1721_Write_Byte(DISP_WRITE); //固定地址方式写数据到显示寄存器//0100 0100
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc0); //显示寄存器的00H单元开始//SEG0~SEG1 //1100 0000
TM1721_Write_Byte(dat[0]); //给显示寄存器写入数据
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc1); //显示寄存器的01H单元
TM1721_Write_Byte(dat[1]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc2);
TM1721_Write_Byte(dat[2]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc3);
TM1721_Write_Byte(dat[3]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc4);
TM1721_Write_Byte(dat[4]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc5);
TM1721_Write_Byte(dat[5]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc6);
TM1721_Write_Byte(dat[6]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc7);
TM1721_Write_Byte(dat[7]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc8);
TM1721_Write_Byte(dat[8]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc9);
TM1721_Write_Byte(dat[9]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0xcc);
TM1721_Write_Byte(dat[10]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0xcd);
TM1721_Write_Byte(dat[11]);
PANEL_STB_HIGH;
TM1721_Write_Byte(0x97); //显示开//1001 0111 b7b6:10,显示控制;B4:0->0FF,1->ON;B3:0->1/3偏压
PANEL_STB_HIGH;
}
/*******************************************
函数:PWM输出控制函数
参数:addr---选择哪一路PWM输出:0、1、2、3
dat---输出的PWM的数据
返回值:无
*******************************************/
void TM1721_Write_PWM()
{
PANEL_STB_HIGH;
TM1721_Write_Byte(0x45); //PWM设定、采用固定地址//0100 0101
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc2); //PWM控制地址设定//1100 0001 //G
TM1721_Write_Byte(PWM2_VALUE); //(0x2d);//
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc3); //PWM控制地址设定//1100 0001 //G
TM1721_Write_Byte(PWM3_VALUE); //(0x2d);//
}
/*******************************************
函数:PWM输出控制函数
参数:addr---选择哪一路PWM输出:0、1、2、3
dat---输出的PWM的数据
返回值:无
*******************************************/
void TM1721_Write_Buzzer(unsigned char color)
{
PANEL_STB_HIGH;
TM1721_Write_Byte(0x45); //PWM设定、采用固定地址//0100 0101
PANEL_STB_HIGH;
TM1721_Write_Byte(0xc1); //PWM控制地址设定//1100 0010 //背光输出配置
TM1721_Write_Byte(color); //(0x2d);//
}
/*******************************************
函数:按键扫描位读取函数
参数:无
返回值:read_var
返回值类型:unsigned char
*******************************************/
uint8_t TM1721_Read_Key(void)
{
uint8_t i;
uint8_t read_bit;
uint8_t ReadValue = 0; //清零
//TM1721_Delay_ms(2); //用于片选信号的延时
PANEL_STB_LOW;
//PANEL_DIO_HIGH; //初始化数据端口
for (i = 0; i < 8; i++)
{
PANEL_CLK_LOW;
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
PANEL_CLK_HIGH; //上升沿
if (PANEL_DIO_READ & 0x40)
read_bit = 1;
else
read_bit = 0;
ReadValue |= (read_bit << i);
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
}
return (ReadValue); //传递返回值
}
/******************************************
函数:按键键值的判断函数
参数:无
返回值:无
*******************************************/
void TM1721_Key_Scan(void)
{
static unsigned char KEY_VAR[3]; //存放按键键值数组,最多存放3字节的数据,键值缓冲区
unsigned char i;
PANEL_STB_HIGH;
TM1721_Write_Byte(KEY_READ); //读按键指令、地址自动加一
TM1721_Delay_ms(); //延时
PANEL_DIO_IN_MODE;
for (i = 0; i < 3; i++)
{
KEY_VAR[i] = TM1721_Read_Key(); //读取按键键值
TM1721_Delay_ms(); //每读完一字节数据之后,一个小的延时、重要!
}
PANEL_DIO_OUT_MODE;
switch (KEY_VAR[0]) //键盘只有KEY0~2 3路输入 01110111
{
case 0x01: //KEY_EVENT_CRISPER_CLICK
KeyByte = 13;
break;
case 0x02: //KEY_EVENT_SAVE_CLICK
KeyByte = 16;
break;
case 0x04: //KEY_EVENT_SMART_CLICK
KeyByte = 7;
break;
case 0x10: //KEY_EVENT_DOWN_CLICK
KeyByte = 25;
break;
case 0x20: //KEY_EVENT_MODE_CLICK
KeyByte = 22;
break;
case 0x40: //KEY_EVENT_UP_CLICK
KeyByte = 19;
break;
case 0x30: //KEY_EVENT_DOWN_MODE_CLICK
KeyByte = 34;
break;
case 0x50: //KEY_EVENT_UP_DOWN_CLICK
KeyByte = 37;
break;
case 0x60: //KEY_EVENT_UP_MODE_CLICK
KeyByte = 28;
break;
}
switch (KEY_VAR[1]) //键盘只有KEY0~2 3路输入 01110111
{
case 0x01: //MD
KeyByte = 4;
break;
case 0x02: //KEY_EVENT_ICE_CLICK
KeyByte = 10;
break;
case 0x04: //AD
KeyByte = 1;
break;
case 0x05: //AD MD 组合键
KeyByte = 31;
default:
// KeyByte = 0; //有问题 可能会清除掉应该有的键值 还有组合键也应该加进来
break;
}
if (!KEY_VAR[0] && !KEY_VAR[1])
{
KeyByte = 0;
}
}
/*****************************************
函数:TM1721的初始化函数
参数:无
返回值:无
*****************************************/
void TM1721_Init(void)
{
TM1721_PORT_INIT();
//TM1721_Delay_ms(); //等待电压稳定
PANEL_STB_HIGH; //STB为高电平,CLK、DIO无效//端口配置初始化
PANEL_CLK_HIGH;
PANEL_DIO_HIGH;
TM1721_Write_Byte(MODE_SET); //显示模式//0010 1110 SW2~3 PWM2~3 KEY0~3
PANEL_STB_HIGH;
TM1721_Write_Byte(0x87); //显示关 //1000 0111 b7b6:10,显示控制;B4:0->0FF,1->ON;B3:0->1/3偏压
PANEL_STB_HIGH;
TM1721_Write_PWM(); //设置PWM,开背光
//
// PANEL_STB_HIGH;
// TM1721_Write_Byte(0x97); //显示关 //1000 0111 b7b6:10,显示控制;B4:0->0FF,1->ON;B3:0->1/3偏压
}
void TM1721_InitAgain(void)
{
PANEL_STB_HIGH; //STB为高电平,CLK、DIO无效//端口配置初始化
TM1721_Write_Byte(MODE_SET); //显示模式//0010 1110 SW2~3 PWM2~3 KEY0~3
PANEL_STB_HIGH;
//TM1721_Write_Byte(0x87); //显示关 //1000 0111 b7b6:10,显示控制;B4:0->0FF,1->ON;B3:0->1/3偏压
TM1721_Write_Byte(0x97); //显示开
PANEL_STB_HIGH;
TM1721_Write_PWM(); //设置PWM,开背光
}
全部评论 (0)
还没有任何评论哟~
