/*
参考资料链接
1.我写的JXI5020LED 驱动芯片,负责位选,段选由主控IO直接给。 单个跑是没问题,但是在while(1)循环跑就会一闪一闪的,现在…-OpenEdv-开源电子网
http://www.openedv.com/forum.php?mod=viewthread&tid=84828&page=1
2.Microsoft Word - JXI5020 Preliminary Datasheet V2.01_簡中_傳簽版_20150423
https://atta.szlcsc.com/upload/public/pdf/source/20161009/1475994308654.pdf
3.LED显示屏原理详细解析(用到的芯片74HC138、74HC245、74HC595、4953、TB62726、JXI5020等芯片功能详解)?- 百度文库
https://wenku.baidu.com/view/ea751b755f0e7cd1842536c3.html
4.STM32和51单片机控制标准08接口 LED单元板 点阵单元板源码样例等资料-OpenEdv-开源电子网
http://www.openedv.com/forum.php?mod=viewthread&tid=76581&tdsourcetag=s_pctim_aiomsg
5.【新提醒】我写的JXI5020LED 驱动芯片,负责位选,段选由主控IO直接给。 单个跑是没问题,但是在while(1)循环跑就会一闪一闪的,现在…-OpenEdv-开源电子网
http://www.openedv.com/forum.php?mod=viewthread&tid=84828&page=1

效果图
TC_typedef TcInfo;//TC5020结构体信息
volatile uint8_t LedScanTime; //定义扫描时间计数器

u16 DisplayFrontBuf[LedH][LedW/Dbyte]; //定义前台显示缓存
//u16 DisplayBackBuf[LedH][LedW/Dbyte]; //定义后台显示缓存
uint8_t BackFlag; //定义前后台标志
volatile uint8_t ScanFlag; //定义扫描完成标志。注:只有当ScanFlag = 1时,才能切换显示内容。
uint8_t ScanRow; //定义行扫描计数器

void TC5020Init(void)//初始化
{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB,PE端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //LED0–>PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
// GPIO_SetBits(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB.5 输出高

TcInfo.Width = LedW; //定义显示长度为:128像素
TcInfo.Height = LedH; //定义显示高度为:32像素
TcInfo.ScanMode = 16; //定义扫描方式为:1/16扫描
TcInfo.FirstRow = 0; //定义扫描起始行为:0行
TcInfo.ENMode = 0; //定义使能信号有效电平为:低有效
TcInfo.BlankTime = 50;
TcInfo.OnOff =ON;// OFF; // //默认不显示(关闭显示)

LedScanTime = 0;
ScanFlag = 0;
BackFlag = 1;
ScanRow = TcInfo.FirstRow; //行扫描计数器初始化为扫描起始行
memset(DisplayFrontBuf,0x0000,LedHLedW/Dbyte2); //初始化显示缓存
}

/* 选择显示行

当管脚LD、LC、LB、LA的输出分别为0000时,LED显示屏的第一行被选中;
  当管脚LD、LC、LB、LA的输出分别为0001时,LED显示屏的第二行被选中;
  当管脚LD、LC、LB、LA的输出分别为0010时,LED显示屏的第三行被选中;
  …
  当管脚LD、LC、LB、LA的输出分别为1111时,LED显示屏的第十六行被选中。
*/
void TcSelRow(u8 Nd)
{ u8 N=Nd;
N=N%16;//对 16 求余数 大于16的就是下半部分的16行了
LA=(N&0x01)>0?1:0;
LB=(N&0x02)>0?1:0;
LC=(N&0x04)>0?1:0;
LD=(N&0x08)>0?1:0;
}

/**************************************************************************************************
**程序名称:void TcOutByte(u16 dat)
**输入参数:u16 dat LED串行数据
**输出参数:无
**返 回 值:无
**描 述:LED显示板列显示程序。向TC5020送一个16位数
**************************************************************************************************/

void TcOutByte(u16 dat )
{
u8 i=0 ;
for(i=0;i<16;i++)
{ LSCL=0;
if(dat&0x8000)
{
if(ScanRow<16)LR1=1;//上半部分
else LR2=1; //下半部分
}
else
{
if(ScanRow<16)LR1=0;//上半部分 上16行
else LR2=0; //下半部分 下16行
}
dat=dat<<1;
LSCL=1;
}
delay_us(20);
}
void TcOutByte1(u16 dat1,u16 dat2 )
{
u8 i=0 ;
for(i=0;i<16;i++)
{ LSCL=0;

   if(dat1&0x0001)LR1=1;//上半部分else LR1=0;//上半部分 上16行 if(dat2&0x0001) LR2=1;     //下半部分 else LR2=0;     //下半部分  下16行dat1=dat1>>1;dat2=dat2>>1;LSCL=1;
}

}
/**************************************************************************************************
**程序名称:void TcDisCol(u16 *data,u16 *data1,u16 lenght)
**输入参数: u16 *data 显示数据指针 上半部分
u16 data1 下半部分
** u16 lenght 数据长度 每行所有列的字节数
**输出参数:无
**返 回 值:无
**描 述:LED显示板列显示程序。 一个16
16
**************************************************************************************************/
void TcDisCol(u16 *data,u16 *data1,u16 lenght)
{

while(lenght--)
{ TcOutByte1(*data,*data1);data++;data1++;
}

}
//定时器刷新显示的数据 定时刷新间隔200us
void TcDisplay(void)
{
/* 输出列数据*/
TcDisCol(DisplayFrontBuf[ScanRow],DisplayFrontBuf[ScanRow+16],TcInfo.Width/Dbyte);//输出一行数据
LEN=1; //关显示
LSTB=1; //锁存数据
LSTB=0;
TcSelRow(ScanRow);//选择行 ScanRow
LEN=0;
ScanRow++;
if(ScanRow>15)ScanRow=0;
}

void LedClose(void)
{
/关显示/
if(!TcInfo.ENMode)
{
LEN=1; //关显示
}
else
{
LEN=0;
}
TcInfo.OnOff = OFF;
}

void LedOpen(void)
{
/开显示(消隐)/
if(!TcInfo.ENMode)
{
LEN=0; //开显示
}
else
{
LEN=1;
}
TcInfo.OnOff = ON;
}
//画一个点
void Drawpoint(u16 x,u16 y,u8 dat)
{
if((x<TcInfo.Width)&&(y<TcInfo.Height))//在显示范围内
{
DisplayFrontBuf[y][x/Dbyte]&=~(1<<(x%Dbyte));// 先清零
DisplayFrontBuf[y][x/Dbyte]|=dat<<(x%Dbyte);// 再赋值

}
}
//画任意线
//x0,y0:起点 x1,y1:终点
//color:颜色
void gui_draw_line(u16 x0,u16 y0,u16 x1,u16 y1,u16 color)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;

delta_x=x1-x0; //计算坐标增量
delta_y=y1-y0;
uRow=x0;
uCol=y0;
if(delta_x>0)incx=1; //设置单步方向
else if(delta_x==0)incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;//水平线
else{incy=-1;delta_y=-delta_y;}
if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0;t<=distance+1;t++ )//画线输出
{  Drawpoint(uRow,uCol,color);//画点 xerr+=delta_x ; yerr+=delta_y ; if(xerr>distance) { xerr-=distance; uRow+=incx; } if(yerr>distance) { yerr-=distance; uCol+=incy; }
}

}
//向缓存区写入一个字节
//x,y:起始坐标
//num:要显示的字符:" “—>”~"
//size:字体大小 12/16/24
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size)
{
u8 temp,t1,t;
u16 y0=y;
u8 csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数
num=num-’ ‘;//得到偏移后的值(ASCII字库是从空格开始取模,所以-’ '就是对应字符的字库)
for(t=0;t<csize;t++)
{
if(size12)temp=asc2_1206[num][t]; //调用1206字体
else if(size16)temp=asc2_1608[num][t]; //调用1608字体
else if(size==24)temp=asc2_2412[num][t]; //调用2412字体
else return; //没有的字库
for(t1=0;t1<8;t1++)
{
if(temp&0x80)Drawpoint(x,y,1);
else Drawpoint(x,y,0);
temp<<=1;
y++;

     if((y-y0)==size){y=y0;x++;if(x>=TcInfo.Width)return;   //超区域了break;}}
}

}
//m^n函数
//返回值:m^n次方.
u32 LCD_Pow(u8 m,u8 n)
{
u32 result=1;
while(n–)result*=m;
return result;
}
//显示数字,高位为0,则不显示
//x,y :起点坐标
//len :数字的位数
//size:字体大小
//color:颜色
//num:数值(0~4294967295);
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/LCD_Pow(10,len-t-1))%10;
if(enshow0&&t<(len-1))
{
if(temp0)
{
LCD_ShowChar(x+(size/2)*t,y,’ ',size);
continue;
}else enshow=1;

 }LCD_ShowChar(x+(size/2)*t,y,temp+'0',size);
}

}
//显示数字,高位为0,还是显示
//x,y:起点坐标
//num:数值(0~999999999);
//len:长度(即要显示的位数)
//size:字体大小
//mode:
//[7]:0,不填充;1,填充0.
//[6:1]:保留
//[0]:0,非叠加显示;1,叠加显示.
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)
{
u8 t,temp;
u8 enshow=0;
for(t=0;t<len;t++)
{
temp=(num/LCD_Pow(10,len-t-1))%10;
if(enshow0&&t<(len-1))
{
if(temp0)
{
if(mode&0X80)LCD_ShowChar(x+(size/2)*t,y,‘0’,size);
else LCD_ShowChar(x+(size/2)*t,y,’ ',size);
continue;
}else enshow=1;

 }LCD_ShowChar(x+(size/2)*t,y,temp+'0',size);
}

}
//显示字符串
//x,y:起点坐标
//width,height:区域大小
//size:字体大小
//*p:字符串起始地址
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)
{
u8 x0=x;
width+=x;
height+=y;
while((*p<=’~’)&&(*p>=’ '))//判断是不是非法字符!
{
if(x>=width){x=x0;y+=size;}
if(y>=height)break;//退出
LCD_ShowChar(x,y,*p,size);
x+=size/2;
p++;
}
}

16位LED恒流源芯片TC5020A,32*128点阵屏驱动函数相关推荐

  1. 计算机组成原理快速加法器与32位ALU设计实验报告(8位可控加减法电路设计、CLA182四位先行进位电路设计、4位快速加法器设计、16位快速加法器设计、32位快速加法器设计)

    实验二 快速加法器与32位ALU设计实验 本次实验,进行了五个实验,分别是8位可控加减法电路设计.CLA182四位先行进位电路设计.4位快速加法器设计.16位快速加法器设计.32位快速加法器设计.这次 ...

  2. java md5 16位解密_Java实现MD5(32/16位)大小写加密

    MD5简单介绍 大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方法:与之类似,MD5就可以为任何文件(不管其大小.格式.数量)产生一个同样独一无二的&quo ...

  3. MD5的应用场景以及MD5 32位和16位的区别

    MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现.将数据(如汉 ...

  4. 关于单片机位数的思考(8位、16位、32位)

    ================================ 关于单片机位数的思考(8位.16位.32位) ================================ 8位.16位.32位是 ...

  5. ASP.Net中MD5加密-16位32位

    public string md5(string str,int code) { if(code==16) //16位MD5加密(取32位加密的9~25字符) { return System.Web. ...

  6. 16位代码段与32位代码段的区别

    16位代码段与32位代码段的区别: 16位代码段与32位代码段的区别如下: 16位代码段最长只能为64k,段内偏移量为16位,默认的指令地址及操作地址为16位:  32位代码段最长可以4G,段内偏移量 ...

  7. 16位/32位中断机制比較

    16位/32位中断机制比較 原理: 16位中断机制:使用中断向量表 32位中断机制:使用中段描写叙述符表IDT 位置: 中断向量表的位置是固定的,位于内存的開始0x00000 中断向量符表位置不固定, ...

  8. STM32模拟SPI时序控制双路16位数模转换(16bit DAC)芯片DAC8552电压输出

    STM32模拟SPI时序控制双路16位数模转换(16bit DAC)芯片DAC8552电压输出 STM32部分芯片具有12位DAC输出能力,要实现16位及以上DAC输出需要外挂DAC转换ASIC. D ...

  9. C语言:8位、16位、32位数据转换

    先看一下测试代码 #include <stdio.h>int main() {/* Write C code in this online editor and run it. */int ...

  10. md5 16位加密 java_MD5加密,MD5在线加密,MD5校验

    MD5加密 MD5在线加密 MD5校验 MD5加密工具 请在下面输入需要MD5加密的字符串 16位大写: (双击复制) 16位小写: (双击复制) 32位大写: (双击复制) 32位小写: (双击复制 ...

最新文章

  1. 机器学习笔记7-监督学习
  2. 自学python可以做什么兼职-一行生财:毕业100天,通过副业赚(挣)到我的第一个10w...
  3. 从零开始入门 K8s | 应用存储和持久化数据卷:存储快照与拓扑调度
  4. [基础常识]申请免费SSL证书 - 阿里云云盾证书 - Digicert+Symantec 免费型DV SSL
  5. logback输出日志到sentry
  6. JDK 9是某些功能的终结
  7. hp g6服务器安装系统,HPProLiantDL180G6服务器安装图.PDF
  8. MySQL和Oracle的添加字段的处理差别
  9. Python__正则表达式
  10. Java下载文件,中文文件名乱码问题解决
  11. Java医院网上预约挂号系统源码
  12. python qq空间登录_Python案例之QQ空间自动登录程序实现-阿里云开发者社区
  13. 机器视觉检测技术发展趋势分析
  14. 【老生谈算法】matlab实现方位角计算源码——方位角计算
  15. 如何防止条码流水号打印出现重码漏码错码的防呆检错系统?
  16. 统计英文中单词的个数
  17. ElasticSearch 中文分词器ik的安装、测试、使用、自定义词库、热更新词库
  18. keychron:一款能让我工作效率提升50%的设备。
  19. java通过手机号查询地区信息
  20. EasyAR尝鲜系列教程之视频播放功能的实现

热门文章

  1. Nginx源码分析(25篇)
  2. Java课设——文本编辑器
  3. 单测量矢量多目标精确DOA估计的高效稀疏表示算法
  4. 使用Altium Designer绘制电路原理图
  5. matlab 音乐传奇,matlab 如何打开wav声音文件
  6. 微信小程序中-[渲染层网络层错误] pages/card/card.wxss 中的本地资源图片无法通过 WXSS 获取-解决办法
  7. 考计算机一级应该学什么条件,计算机一级考试要求
  8. .mdb mysql_ACCESS数据库(.mdb 文件)转 MYSQL
  9. Android URL Scheme
  10. java 根据模板,导出word并提供下载