打印
[STM32F1]

TM1621驱动以及显示

[复制链接]
1101|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
uiint|  楼主 | 2023-12-31 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
#include " TM1621.h"

#define WRITE PCout(15)
#define CS          PDout(0)
#define DATA  PCout(14)


//unsigned char Smg[16]={0xad,0xad,0xad,0xad,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e};  //0~F字型码
/* 0-0 1-1 15-15 16-空格 17-0x04-负号 18-0x0B -L                                                                                                                                                                        */
unsigned char Smg0[30]={0xeb,0x60,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e,0x00,0x04,0x0B};   //0~F字型码 //正确字形
unsigned char Smg1[30]={0xbe,0x06,0x7c,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE,0xEE,0xF2,0xB8,0x76,0xf8,0xe8,0x00,0x40,0xB0};          //0~F字型码 //反向字形
unsigned char Smg2[30]={0xeb,0x60,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e};




unsigned char Tab0[30]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //清屏


/********************延时函数*************************/
void delay_nms(uint n)
{
        uint i;
        while (n--)
                for (i=0;i<500;i++);
}

/********************从高位写入数据*************************/
void Write_Data_H(uchar Data, uchar Cnt)           //Data的高cnt位写入TM1621,高位在前
{
        uchar i;
        for (i=0;i<Cnt;i++)
        {
                WRITE=0;
                if (Data&0x80)                                 //从最高位发送
                        DATA=1;
                else
                        DATA=0;
                nop;
                nop;
                WRITE=1;
                Data<<=1;
        }
        WRITE=0;
        DATA=0;
}

/********************从低位写入数据*************************/
void Write_Data_L(uchar Data,uchar Cnt)        //Data 的低cnt位写入TM1621,低位在前
{
        unsigned char i;
        for (i=0;i<Cnt;i++)
        {
                WRITE=0;
                if (Data&0x01)                               //从低位发送
                        DATA=1;
                else
                        DATA=0;
                nop;
                nop;
                WRITE=1;
                Data>>=1;
        }
        WRITE=0;
        DATA=0;
}


/********************写入控制命令*************************/
void WriteCmd(uchar Cmd)
{
        CS=0;
        nop;
        Write_Data_H(0x80,4);     //写入命令标志100
        Write_Data_H(Cmd,8);      //写入命令数据
        CS=1;
        nop;
}


/*********指定地址写入数据,实际写入后4位************/
void WriteOneData(uchar Addr, uchar Data)
{
        CS=0;
        Write_Data_H(0xa0,3);     //写入数据标志101
        Write_Data_H(Addr<<2,6);  //写入地址数据(A5-A4-A3-A2-A1-A0)从高位开始写数据
        Write_Data_L(Data,4);     //写入数据
        CS=1;
        nop;
}

/*********连续写入方式,每次数据为8位,写入数据************/
void WriteAllData(uchar Addr,uchar *p,uchar cnt)
{
        uchar i;
        CS=0;
        Write_Data_H(0xa0,3);      //写入数据标志101
        Write_Data_H(Addr<<2,6);   //写入地址数据
        for(i=0;i<cnt;i++)            //写入数据
        {
                Write_Data_L(*p,8);
                p++;
        }
        CS=1;
        nop;
}
/***************这个子程序暂时没用,注释掉******************/

/*******************TM1621初始化**********************/

void TM1621_Gpio_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;


        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD |RCC_APB2Periph_GPIOB, ENABLE);//开C口时钟,复用时钟。

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//使能JTAGDisable,即禁用JTAG接口


        PWR_BackupAccessCmd(ENABLE);//允许修改RTC 和后备寄存器
        RCC_LSEConfig(RCC_LSE_OFF);//关闭外部低速外部时钟信号功能 后,PC13 PC14 PC15 才可以当普通IO用。
        BKP_TamperPinCmd(DISABLE);//关闭入侵检测功能,也就是 PC13,也可以当普通IO 使用


        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_14 | GPIO_Pin_15;//PC14-Data   PC15-WR
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15 | GPIO_Pin_3;//PB15 - 背光
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_ResetBits(GPIOB,GPIO_Pin_15);/*低电平开启背光 高电平关闭背光*/

        GPIO_ResetBits(GPIOB,GPIO_Pin_3);
        GPIO_SetBits(GPIOB,GPIO_Pin_3);


        GPIO_PinRemapConfig(GPIO_Remap_PD01,ENABLE);/*映射PD01的使能*/
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PD0-CS
        GPIO_Init(GPIOD, &GPIO_InitStructure);

        PWR_BackupAccessCmd(DISABLE);/* 禁止修改RTC和后备寄存器*/
        BKP_ITConfig(DISABLE);      
}

void TM1621_init(void)
{
        TM1621_Gpio_Init();

        CS=1;
        WRITE=1;
        DATA=1;      

        nop;
        delay_nms(1);
        WriteCmd(BIAS);                 //1/3偏压 4公共口
        WriteCmd(RC);                         //内部RC振荡
        WriteCmd(SYSDIS);                 //关系统振荡器和LCD偏压发生器
        WriteCmd(WDTDIS);                 //禁止看门狗
        WriteCmd(SYSEN);                 //打开系统振荡器
        WriteCmd(LCDON);                 //开LCD偏压

}
/*************TM1621清屏函数*****************/
//void Clear1621()
//{
//        uchar i;
//        for(i=9;i<22;i++)
//        {
//                WriteOneData(i, 0x00);
//        }
//}


/*******************************************************************************
* 函数名称                   :1621显示函数显示
* 函数功能                   :
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

//void Disp1621(uchar Addr, uchar Data)
//{
//        WriteOneData(Addr, Data);
//}


void Display1621(unsigned char * bmp , unsigned char dot)
{
        //unsigned char cwDispalyAddress = 11;
        /* 地址 11*/
        /* 数组bmp第一个数据对应显示最左边数码管 第二个对应第二个数码管 以此类推 */


        /* void WriteOneData(uchar Addr, uchar Data)   */
        /* WriteAllData(uchar Addr,uchar *p,uchar cnt) */


        WriteAllData(18,Smg0+(0+bmp[0]),1);                //0

        WriteAllData(20,Smg0+(0+bmp[1]),1);                //1

        WriteOneData(22,Smg0[0+bmp[2]]);                //2
        WriteOneData(17,Smg0[0+bmp[2]]>>4);                //2

        WriteAllData(15,Smg1+(0+bmp[3]),1);                //3

        WriteAllData(13,Smg1+(0+bmp[4]),1);                //4

        WriteAllData(11,Smg1+(0+bmp[5]),1);                //5

        if(RTData[40] == 2)        //如果是标定界面  则显示小数点
                dot = 3;

        if(dot != 5){
                if(dot <= 1 ){        //绘制小数点
                        Smg0[bmp[dot]] |= 0x10;
                }else if(dot == 2){
                        Smg0[bmp[dot]] |= 0x10;
                }else if(dot >  2){
                        Smg1[bmp[dot]] |= 0x01;
                }

                if(RTData[40] == 0 || RTData[40] == 2){        // 只有在实时值显示界面和标定界面才显示小数点

                        switch(dot)
                        {
                                case 0:
                                        WriteAllData(18,Smg0+(0+bmp[0]),1);                //0

                                break;

                                case 1:
                                        WriteAllData(20,Smg0+(0+bmp[1]),1);                //1

                                break;

                                case 2:
                                        WriteOneData(22,Smg0[0+bmp[2]]);                //2
                                        WriteOneData(17,Smg0[0+bmp[2]]>>4);                //2

                                break;

                                case 3:
                                        WriteAllData(15,Smg1+(0+bmp[3]),1);                //3

                                break;

                                case 4:
                                        WriteAllData(13,Smg1+(0+bmp[4]),1);                //4

                                break;
                        }


                        if(dot <= 1 ){        //绘制小数点
                                Smg0[bmp[dot]] &= 0xef;
                        }else if(dot == 2){
                                Smg0[bmp[dot]] &= 0xef;
                        }else if(dot > 2){
                                Smg1[bmp[dot]] &= 0xfe;
                        }
                }
        }
}


/*
* @brief 将整型数转换为字符并显示
*
*
*/

void DisplayNum(int num , unsigned dot)
{
        unsigned char cwchar[6]={0,0,0,0,0,0};
        u8 b[6];
        u8 j=0,k=0,m;
        int i;

        if(num>999999)
                num=999999;
        if(num<-99999)
                num=-99999;      

        if(num>=0){
                b[5]=0;//正数
        }
        else{
                num=-num;
                //num[0]=45;
                b[5]=1;//负数
        }

        for(i=5 ; i>=0 ; i--){                        //整型数转字符数

                if(num!=0)        //判断是否
                        cwchar=(num%10);
                else{                                                  //无数字
                        if(j==0)j=i;                        //数据位数

                        if(!b[5]){
                                if((dot<5-i))                //&&(RTData[11]!=2&&RTData[11]!=3)&&RTData[13]!=2
                                        cwchar=16;
                        }else{

                                if((dot<5-i)){                //&&(RTData[11]!=2&&RTData[11]!=3)&&RTData[13]!=2
                                        cwchar=16;
                                        if(k==0)
                                        k=i;//负数小数点首位位数定位
                                }

                        }
                }
                num/=10;
        }      
……………………


使用特权

评论回复
沙发
kkzz| | 2024-1-3 11:45 | 只看该作者
TM1621是一款常用的LCD显示驱动芯片,广泛应用于各种显示模块,如汽车电子、仪表显示、家电等领域。

使用特权

评论回复
板凳
updownq| | 2024-1-3 13:28 | 只看该作者
TM1621是一个多功能的LCD驱动器,带有蜂鸣器驱动功能。通讯采用四线串行接口。

使用特权

评论回复
地板
minzisc| | 2024-1-3 13:52 | 只看该作者
TM1621的主要引脚功能包括:

CLK:时钟输入,用于生成时序信号。
DIN:数据输入,用于接收数据输入信号。
STB:片选输入,用于控制芯片的工作状态。
VDD:电源正极。
GND:地。

使用特权

评论回复
5
pentruman| | 2024-1-3 14:41 | 只看该作者
TM1621是一款内存映射和多功能的LCD驱动器,适用于多种LCD应用场合

使用特权

评论回复
6
kkzz| | 2024-1-3 15:16 | 只看该作者
TM1621还有一个节电命令,用于降低系统功耗,实现节能。

使用特权

评论回复
7
tabmone| | 2024-1-3 15:40 | 只看该作者
TM1621是一款用于驱动段码液晶显示屏(LCD)的集成电路,它能够控制多位数码管或段式LCD,并且通常带有内置的显示数据RAM和一些附加功能如蜂鸣器驱动等。

使用特权

评论回复
8
plsbackup| | 2024-1-3 16:58 | 只看该作者
可采用常见的编程语言如C、C++或汇编进行驱动程序的开发。

使用特权

评论回复
9
maqianqu| | 2024-1-3 17:16 | 只看该作者
使用TM1621的局部刷新功能,降低闪烁和拖影现象

使用特权

评论回复
10
51xlf| | 2024-1-3 17:55 | 只看该作者
这个驱动器具有内存映象和软件配置特性,适用于多种LCD应用场合,包括LCD模块和显示子系统

使用特权

评论回复
11
fengm| | 2024-1-3 18:19 | 只看该作者
TM1621通过串行四线接口与主控制器连接,主控制器发送数据和命令来控制TM1621的操作。TM1621内部集成了32x4位的显示RAM,可以存储并显示图形数据。

使用特权

评论回复
12
saservice| | 2024-1-3 19:09 | 只看该作者
TM1621通过四线SPI接口(SDI、SCK、CS, WR)与微控制器进行通信。
连接液晶显示屏的公共端(COM)和段选端(SEG)到TM1621相应的输出引脚。

使用特权

评论回复
13
sesefadou| | 2024-1-3 19:31 | 只看该作者
显示的数据存储在TM1621内部的显示RAM中,按照特定的字节顺序和内存映射关系将要显示的数字或字符编码成对应的段码数据,然后通过SPI逐个字节地写入到芯片的显示RAM中。

使用特权

评论回复
14
tabmone| | 2024-1-3 19:55 | 只看该作者
通过发送命令和数据来实现TM1621的各种功能,如初始化、设置显示参数、填充屏幕、绘制图形等

使用特权

评论回复
15
averyleigh| | 2024-1-4 10:10 | 只看该作者
通过软件优化,如调整帧率、优化图形绘制算法等,提高显示性能。

使用特权

评论回复
16
lzmm| | 2024-1-4 10:40 | 只看该作者
TM1621是一款功能强大、易于使用的LCD驱动器,适用于各种LCD显示应用。通过了解其工作原理和配置方式,可以充分发挥其功能,实现出色的显示效果

使用特权

评论回复
17
mattlincoln| | 2024-1-4 11:11 | 只看该作者
TM1621是一个功能强大而且灵活的驱动器

使用特权

评论回复
18
rosemoore| | 2024-1-4 11:41 | 只看该作者
TM1621的工作电压范围为2.4V至5.2V,这使得它能够在各种电源条件下稳定工作。

使用特权

评论回复
19
pl202| | 2024-1-4 12:16 | 只看该作者
TM1621是一款功能强大的LCD驱动器,通过合理的驱动和显示优化,可以实现良好的显示效果

使用特权

评论回复
20
ccook11| | 2024-1-4 13:33 | 只看该作者
TM1621具备多种功能特性,如内存映象、多路复用、内置振荡器等,可以满足各种LCD显示需求。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

4176

帖子

1

粉丝