LCD显示--TM1640芯片驱动程序

TM1640芯片驱动

DIN:串行数据输入,输入数据在 SCLK 的低电平变化,在 SCLK 的高电平被传输。

SCLK:在上升沿输入数据 。

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "global.h"
#include "string.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define  DATA_COMMEND    0x40    //数据控制命令  0100 0000  自动地址  0100固定地址
#define  DISP_CLOSE      0x80     //显示关
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint8_t DisplayBuff[14];
//uint8_t DisplayBuffFinal[14];

uint8_t DispOpenValue = 0x8f;     //显示开  1000 1011 脉冲宽度为10/16
const uint8_t Mmap_Tab[] = {0x01, 0x02, 0x04 ,0x08 ,0x10, 0x20, 0x40, 0x80};

/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
static void DispData_Mmap();
//void DispData_Trans();
//void DispData_BitTrans();              //位地址转换

/* Public functions ----------------------------------------------------------*/

/*******************************************************************************
函数:初始化端口
参数:
返回值:无
********************************************************************************/
void TM1640_PORT_INIT(void)
{
   GPIO_Init(TM1640_CLK_GPIO_PORT, TM1640_CLK_GPIO_PIN, GPIO_MODE_OUT_PP_HIGH_SLOW);
   TM1640_DIN_OUT_MODE;
}

/*******************************************************************************
函数:延时函数 ms MS
参数:
返回值:无
*******************************************************************************/
void TM1640_Delayms(uint8_t ms)
{
   unsigned short jj;
   for (jj = 1; jj <= ms; jj++)
   {
      nop();
   }
}

/*******************************************************************************
函数:命令传输开始标志
参数:
返回值:无
*******************************************************************************/
void TM1640_Start()
{
   TM1640_CLK_LOW;
   TM1640_Delayms(5);

   TM1640_DIN_HIGH;
   TM1640_Delayms(5);

   TM1640_CLK_HIGH;
   TM1640_Delayms(10);

   TM1640_DIN_LOW;
   TM1640_Delayms(5);
}

/*******************************************************************************
函数:命令传输结束
参数:
返回值:无
*******************************************************************************/
void TM1640_End()
{
   TM1640_CLK_LOW;
   TM1640_Delayms(5);

   TM1640_DIN_LOW;
   TM1640_Delayms(5);

   TM1640_CLK_HIGH;
   TM1640_Delayms(10);

   TM1640_DIN_HIGH;
   TM1640_Delayms(5);
}

/*******************************************************************************
函数:写一字节函数
参数:dat---写入的一字节数据
返回值:无
*******************************************************************************/
void  TM1640_Write_Byte(unsigned char dat)
{
   uint8_t i;
   //START 有效 DIO输入的第一个字节作为指令//有效的片选信号

   for (i = 0; i < 8; i++)
   {
      TM1640_CLK_LOW;

      if (dat & 0x01)
      {
         TM1640_DIN_HIGH;
      }
      else
      {
         TM1640_DIN_LOW;     //先写低位
      }
      TM1640_Delayms(10);

      TM1640_CLK_HIGH;    //时钟上升沿,送入一位数据
      TM1640_Delayms(10);

      dat >>= 1;
   }
   TM1640_CLK_LOW;
   TM1640_Delayms(5);

}

/*******************************************************************************
函数:固定地址一显示函数
参数: *dat---显示数据的数组指针
返回值:无
*******************************************************************************/
void TM1640_Write_String()
{
   uint8_t i;

   DispData_Mmap();
//   DispData_Trans();
//   DispData_BitTrans();

   TM1640_Start();
   TM1640_Write_Byte(DATA_COMMEND);
   TM1640_End();
   TM1640_Delayms(5);

   TM1640_Start();
   TM1640_Write_Byte(0xc0);  

   for(i=0; i<14; i++)
   {
      TM1640_Write_Byte(DisplayBuff[i]);
//      TM1640_Write_Byte(g_SystemDisplayData.Buffer[i]);
   }
   TM1640_End();
   TM1640_Delayms(5);

   TM1640_Start();
   TM1640_Write_Byte(DispOpenValue);    //显示开
   TM1640_End();

}

/*******************************************************************************
函数:TM1640的初始化函数
参数:无
返回值:无
*******************************************************************************/
void TM1640_Init(void)
{
   TM1640_PORT_INIT();

   TM1640_Start();
   TM1640_Write_Byte(DispOpenValue);     //显示关 1000 0000
   TM1640_End();
   TM1640_Delayms(5);
}

/*******************************************************************************
函数:显示映射函数(由于硬件设计不合理 所以需要进行相应的转换)
返回值:无
*******************************************************************************/
static void DispData_Mmap()
{
   uint8_t i,j;

   for(i=0; i<=13; i++)
   {
      if(i <= 7)                        //前8字节沿对角线对换
      {
         for(j=0; j<=7; j++)
         {
            if(g_SystemDisplayData.Buffer[j] & Mmap_Tab[i])
            {
               DisplayBuff[i] |= Mmap_Tab[j];
            }
            else
            {
               DisplayBuff[i] &= ~Mmap_Tab[j];
            }
         }
      }
      else
      {
         DisplayBuff[i] = g_SystemDisplayData.Buffer[i];
      }
   }
}

//void DispData_Trans()              //段地址转换
//{
//   DisplayBuffFinal[0] = DisplayBuff[3];
//   DisplayBuffFinal[1] = DisplayBuff[4];
//   DisplayBuffFinal[2] = DisplayBuff[12];
//   DisplayBuffFinal[3] = DisplayBuff[10];
//   DisplayBuffFinal[4] = DisplayBuff[1];
//   DisplayBuffFinal[5] = DisplayBuff[2];
//   DisplayBuffFinal[6] = DisplayBuff[9];
//   DisplayBuffFinal[7] = DisplayBuff[13];
//   DisplayBuffFinal[8] = DisplayBuff[0];
//   DisplayBuffFinal[9] = DisplayBuff[11];
//   DisplayBuffFinal[10] = DisplayBuff[8];
//   DisplayBuffFinal[11] = DisplayBuff[7];
//   DisplayBuffFinal[12] = DisplayBuff[5];
//   DisplayBuffFinal[13] = DisplayBuff[6];
//}
//
//
//void DispData_BitTrans()              //位地址转换
//{
//   uint8_t  i;
//
//   memset(DisplayBuff,0,sizeof(DisplayBuff));
//
//   for(i=0; i<14; i++)
//   {
//      DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[1]) >>1);   //bit 0
//      DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[0]) <<1);   //bit 1
//      DisplayBuff[i] |= (DisplayBuffFinal[i] & Mmap_Tab[2]);         //bit 2
//      DisplayBuff[i] |= (DisplayBuffFinal[i] & Mmap_Tab[3]);         //bit 3
//      DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[6]) >>2);   //bit 4
//      DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[7]) >>2);   //bit 5
//      DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[5]) <<1);   //bit 6
//      DisplayBuff[i] |= ((DisplayBuffFinal[i] & Mmap_Tab[4]) <<3);   //bit 7
//   }
//}

LCD显示--TM1640芯片驱动程序

时间: 2024-10-11 10:27:59

LCD显示--TM1640芯片驱动程序的相关文章

LCD显示--HT1621b芯片驱动程序

HT1621b芯片驱动程序 CS : 片选输入接一上拉电阻当/CS 为高电平读写HT1621的数据和命令无效串行接口电路复位当/CS 为低电平和作为输入时读写HT1621的数据和命令有效. WR : WRITE脉冲输入接一上拉电阻在/WR 信号的上升沿 DATA线上的数据写到HT1621. DATA : 外接上拉电阻的串行数据输入/输出. /* Includes ------------------------------------------------------------------*

LCD显示--Ht1621b芯片显示屏驱动

Ht1621b芯片显示屏驱动 关于HT1621b芯片的详细信息可以参考数据手册上的内容:百度文库HT1621b中文资料 以下为芯片驱动程序(STM8单片机): /* Includes ------------------------------------------------------------------*/ #include "stm8s.h" #include "global.h" /* Private typedef ----------------

LCD显示方向

一.ILI9341内存到显示地址的映射 本文只讨论“正常显示”,不讨论“垂直滚动显示”模式. 可以看到物理内存被两个指针访问,行指针和列指针,行指针范围从000h到013Fh,列指针范围为0000h到00EFh.也就是说,物理内存和LCD显示屏的对应关系是一种竖屏(240*320)的对应的关系.至于如何让GRAM数据显示到LCD屏上,不需要我们去考虑,只要知道这种对应关系就可以了. 那么ILI9341有8种显示方式:左上角->右下角(竖屏).左下角->右上角(竖屏).右上角->左下角(竖

在emwin中显示字库芯片GT23L24M0140的字模

?? 在emwin中显示字库芯片GT23L24M0140的字模 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN8 开发环境:MDK5.13 mcu: stm32f407VGIGH6 emwin: STemWin5.22 字库芯片:GT23L24M0140 说明: 项目中需要显示生僻字,所以不能使用GB2312,选择字库芯片GT23L24M0140,支持GB18030标准. 难点在于在emwin中嵌入此字库芯片的字符,emwin

Raspberry PI Model B+ (LCD显示CPU温度)

Title:Raspberry PI Model B+ (LCD显示CPU温度)  --2015-01-29 17:44 买了块连接Raspberry PI Model B+的LCD显示器,上面没写CPU温度,就加工了下. 修改后的pcd8544_rpi.c: /* ================================================================================= Name : pcd8544_rpi.c Version : 0.1

ENC28j60以太网芯片驱动程序简介

ENC28j60以太网芯片驱动程序简介 ENC28J60 驱动开发要点 enc28J60 和 Arduino (1)——ping通你的Arduino MCU51单片机uIP协议栈+ENC28J60网卡 移植.应用

内核启动后,lcd显示logo失败

针对-s5pv210,但对其他平台也使用 lcd显示logo失败,若显示成功默认的logo是一只企鹅,但是串口打印"Start display and show logo",但是LCD屏没有显示 [ 0.833071] s3cfb s3cfb: [fb2] dma: 0x465ab000, cpu: 0xe1000000, size: 0x005dc000 [ 0.845112] FIMD src sclk = 166750000 [ 0.965701] s3cfb s3cfb: re

wm命令使用方法及LCD显示图标大小不正常时解决办法

注:Android 4.3引入的wm工具 wm命令及用法: 系统说明: usage: wm [subcommand] [options] wm size [reset|WxH] wm density [reset|DENSITY] wm overscan [reset|LEFT,TOP,RIGHT,BOTTOM] wm size: return or override display size. wm density: override display density. wm overscan:

mini2440裸机试炼之—计算器(LCD显示,触摸屏中断)

基于T35 TFT LCD屏实现功能: 1. 在屏幕上画一个计算器界面,包括0-9,+,-,*,/: 2. 实现触摸选择界面上的数字和运算符, 3. 并计算出结果显示在显示框内. 注意,只实现整数功能,没涉及小数,只实现一次运算,不保存上次运算结果. 实现界面: 实现过程: 开启LCD电源,初始化LCD>>>LCD填充界面图片>>>开启触摸屏中断>>>获取键值>>>区分数字和功能来调用数字图片显示.   数字图片: 空白图: 除数为零