YFROBOT创客社区
标题:
利用arduino控制16*16点阵显示汉字
[打印本页]
作者:
YFRobot
时间:
2013-6-20 15:11
标题:
利用arduino控制16*16点阵显示汉字
本帖最后由 AllBlue 于 2020-3-31 07:55 编辑
测试视频:
http://v.youku.com/v_show/id_XNTczNDg3NDA4.html
[vedio=375,500]https://player.youku.com/embed/XNTczNDg3NDA4[/vedio]
点阵模块的原理图:
[attach]402[/attach]
方案为:2片74HC164(行)+2片74HC595(列)
下面给出arduino示例代码,用户可通过改变代码中的table1-4数组来改变显示内容,字符生成代码见附件下载,下有使用教程。
/*16*16点阵屏的显示*/
/*******************
PIN -- 点阵
-------------------
DATA -- Ser
SCLH -- Srck
SCLT -- rck
AB -- ab
SC -- ck
*******************/
int DATA=3; //列数据输出位
int SCLH=4; //列扫描时钟位
int SCLT=5; //列数据锁存位
int AB =6; //行数据输出位
int SC=7; //行扫描时钟位
unsigned char i=0,j=0;
unsigned char date[32]; //32字节RAM做为16*16点阵屏显示缓存
void setup() {
// initialize the digital pin as an output.
pinMode(DATA, OUTPUT);
pinMode(SCLH, OUTPUT);
pinMode(SCLT, OUTPUT);
pinMode(AB, OUTPUT);
pinMode(SC, OUTPUT);
}
int table1[32]={
0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xFC,0x02,0x00,0x02,0x00,0x3F,0xF0,0x20,0x10,
0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x24,0x88,0x22,0x44,0x42,0x44,0x80,0x04};/*"点"*/
int table2[32]={
0x00,0x40,0x7C,0x40,0x44,0x40,0x4B,0xFE,0x48,0x80,0x50,0xA0,0x49,0x20,0x49,0xFC,
0x44,0x20,0x44,0x20,0x44,0x20,0x6B,0xFE,0x50,0x20,0x40,0x20,0x40,0x20,0x40,0x20};/*"阵"*/
int table3[32]={
0x00,0x04,0x27,0xC4,0x14,0x44,0x14,0x54,0x85,0x54,0x45,0x54,0x45,0x54,0x15,0x54,
0x15,0x54,0x25,0x54,0xE5,0x54,0x21,0x04,0x22,0x84,0x22,0x44,0x24,0x14,0x08,0x08};/*"测"*/
int table4[32]={
0x00,0x28,0x20,0x24,0x10,0x24,0x10,0x20,0x07,0xFE,0x00,0x20,0xF0,0x20,0x17,0xE0,
0x11,0x20,0x11,0x10,0x11,0x10,0x15,0x10,0x19,0xCA,0x17,0x0A,0x02,0x06,0x00,0x02};/*"试"*/
/* 显示函数 */
void display()
{
unsigned char i,ia,j,tmp; //定义变量
digitalWrite(AB,LOW); //将行数据位清0,准备移位
for(i=0;i<=16;i++) //循环输出16行数据
{
digitalWrite(SC,LOW); //为行移位做准备
digitalWrite(SCLT,LOW); //为列锁存做准备
for(ia=2;ia>0;) //每行16个点,循环位移两个字节,循环两次
{
ia--;
tmp=~date[i*2+ia]; //读取点阵数据做输出,
shiftOut(DATA,SCLH,LSBFIRST,tmp); //将DATA上的数据移入寄存器
}
PORTD |= 0xa0; //移入两个字节结束,SCK\SCLT拉高.
digitalWrite(AB,HIGH); //行数据位只在第一行时为0,其它时候都为1
//移位的过程,AB就必需是1
}
j=64;
while(j--); //每一行的显示,保持两个字节的移位时间
digitalWrite(SC,LOW);
digitalWrite(SC,HIGH); //将最后一行数据移出
}
/* timer=1时,为1s左右的延时 */
void display_time(unsigned int timer) //指定时间扫描显示
{
unsigned char i;
while(timer--)
{
i=110;
while(i--)
display();
}
}
void disp()
{
for(i=0;i<32;i++)
date[i]=table1[i];//将"点"字数据复制到显示缓存
display_time(2); //显示约2秒
for(i=0;i<32;i++)
date[i]=table2[i];//将"阵"字数据复制到显示缓存
display_time(2); //显示约2秒
for(i=0;i<32;i++)
date[i]=table3[i];//将"测"字数据复制到显示缓存
display_time(2); //显示约2秒
for(i=0;i<32;i++)
date[i]=table4[i];//将"试"字数据复制到显示缓存
display_time(2); //显示约2秒
}
void loop()
{
disp();
}
复制代码
字符生成方法如下,下载附件中的点阵生成工具,打开软件,“模式”里面选择“字符模式”
[attach]403[/attach]
点击“选项”,进行如下设置,完成后点确定:
[attach]404[/attach]
在如图输入框中输入要取模的汉字,点“生成字模”
[attach]405[/attach]
将生成的数组替换到上面的示例代码中就可以更改显示内容了!
作者:
azi1974
时间:
2019-6-3 23:37
认真学习中,
作者:
JQK34229
时间:
2019-12-24 10:08
问一下,这个是用的共阴极的点阵么
欢迎光临 YFROBOT创客社区 (http://yfrobot.com.cn/)
Powered by Discuz! X3.1