⑴ 单片机1616点阵显示汉字程序
首先要用取模软件,获得要显示的汉字的字模,每行两个字节,共32字节。然后单片机控制每次送一行的数据,并进行显示,轮流16次,再反复即可。
⑵ 16*16点阵程序,行用单片机的P1和P0端口,列用两个74hc595串联。程序写到这儿不会了,求大侠来补充一下
调试成功,帮你简化了下程序,加了点注释
#include <reg52.h>
#define uchar unsigned char
sbit sck=P2^0;//11脚,上升沿时数据寄存器的数据移位
sbit rck=P2^1;//12脚,上升沿时移位寄存器的数据进入数据存储器
sbit outbyte=P2^3;//14脚,串行数据输入口
uchar code table[]={
0x08,0x20,0x08,0x24,0xFF,0xFE,0x08,0x20,
0x0A,0x20,0x02,0x10,0x3F,0xF8,0x02,0x10,
0x02,0x10,0x22,0x18,0x24,0x16,0x44,0x12,
0x08,0x10,0x10,0x10,0x20,0x50,0x40,0x20
};//这里是一个汉字的字模
////////////////////////
void del(uchar i)
{
for(i;i>0;i--);
}
////////////////////////
void hscan(uchar i)
{//假设你用P0^1第一行,P1^0第9行,且你的点阵是按行为0,列为1的方式设计
if(i<8)
P0=~(0x01<<i),P1=0xff;
else
P0=0xff,P1=~(0x01<<(i-8));
}
void send(uchar dat1,uchar dat2)
{
uchar i;
for(i=0;i<8;i++)
{ outbyte=(dat1<<i)&0x80;//可改为outbyte=(dat1>>i)&0x01; //从低位开始串行
sck=0,sck=1; //这里del()延时一般可以不要
}
for(i=0;i<8;i++)
{ outbyte=(dat2<<i)&0x80;//可改为outbyte=(dat1>>i)&0x01;//从低位开始串行
sck=0,sck=1;
}
rck=0;
del(1);
rck=1;
}
/////////////////
void main()
{
uchar i=0;
while(1)
{ for(i=0;i<16;i++)send(0xf0,0xf0),hscan(i),del(10);
}
}
另外P0口要加上拉电阻
行不行,给个反应啊
⑶ 你好,51单片机16*16点阵滚动显示程序能不能发个给我,谢谢了!
/*--------16*16点阵屏的移动显示------------*/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned char
#define DATE_OUT P1 //指定P1口做为输出
sbit DATA=DATE_OUT^0; //列数据输出位
sbit SCLH=DATE_OUT^1; //列扫描时钟位
sbit SCLT=DATE_OUT^2; //列数据锁存位
sbit AB =DATE_OUT^3; //行数据输出位
sbit SCK =DATE_OUT^4; //行扫描时钟位
sbit kong=DATE_OUT^5;
unsigned char xxx=0,upcount=0;
unsigned char ccc,time1time=0,s=0;
//段前缀{
//段后缀};
//注释前缀、/*"
//注释后缀",
//数据前缀 0x
//数据后缀,
//行前缀
//行后缀},
//行尾缀*/
code unsigned char dong[16][32]={
{0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,
0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02},/*"欢",0*/
{0x00,0x00,0x20,0x80,0x13,0x3C,0x12,0x24,0x02,0x24,0x02,0x24,0xF2,0x24,0x12,0x24,
0x12,0x24,0x12,0xB4,0x13,0x28,0x12,0x20,0x10,0x20,0x28,0x20,0x47,0xFE,0x00,0x00},/*"迎",1*/
{0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x11,0x10,0x09,0x10,0x09,0x20,
0xFF,0xFE,0x03,0x80,0x05,0x40,0x09,0x20,0x31,0x18,0xC1,0x06,0x01,0x00,0x01,0x00},/*"来",2*/
{0x00,0x04,0xFF,0x84,0x08,0x04,0x10,0x24,0x22,0x24,0x41,0x24,0xFF,0xA4,0x08,0xA4,
0x08,0x24,0x08,0x24,0x7F,0x24,0x08,0x24,0x08,0x04,0x0F,0x84,0xF8,0x14,0x40,0x08},/*"到",3*/
{0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,
0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x0A,0x01,0x02,0x01,0x02,0x00,0xFE},/*"电",4*/
{0x00,0x00,0x7F,0xF8,0x00,0x10,0x00,0x20,0x00,0x40,0x01,0x80,0x01,0x00,0xFF,0xFE,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00},/*"子",5*/
{0x00,0x00,0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00},/*"工",6*/
{0x08,0x00,0x1D,0xFC,0xF1,0x04,0x11,0x04,0x11,0x04,0xFD,0xFC,0x10,0x00,0x30,0x00,
0x39,0xFE,0x54,0x20,0x54,0x20,0x91,0xFC,0x10,0x20,0x10,0x20,0x13,0xFE,0x10,0x00},/*"程",7*/
{0x00,0xF8,0x3F,0x00,0x04,0x00,0x08,0x20,0x10,0x40,0x3F,0x80,0x01,0x00,0x06,0x10,
0x18,0x08,0x7F,0xFC,0x01,0x04,0x09,0x20,0x11,0x10,0x21,0x08,0x45,0x04,0x02,0x00},/*"系",8*/
{0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00},/*"三",9*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"一",10*/
{0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,
0x04,0x40,0x04,0x20,0x08,0x10,0x08,0x08,0x10,0x08,0x20,0x04,0x40,0x04,0x00,0x00},/*"六",11*/
{0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x88,0x84,0x04,0x80,0x04,0x80,0x10,0x80,
0x08,0x80,0x08,0x80,0xFF,0xFE,0x01,0x40,0x02,0x20,0x04,0x10,0x18,0x08,0x60,0x04},/*"实",12*/
{0x00,0x20,0xF8,0x20,0x08,0x50,0x48,0x50,0x48,0x88,0x49,0x04,0x4A,0xFA,0x7C,0x00,
0x04,0x44,0x04,0x24,0x1D,0x24,0xE4,0xA8,0x44,0x88,0x04,0x10,0x2B,0xFE,0x10,0x00},/*"验",13*/
{0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x80,0x04,0x3F,0xF8,0x04,0x00,0x08,0x20,
0x1F,0xF0,0x01,0x10,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00},/*"室",14*/
};
idata unsigned char date[3][32];
idata uchar i=0,displayflag=0;
uchar k=0;
void displaymoveup(unsigned char count,unsigned char time);
void display(unsigned char dis);//做为点阵扫描函数,将显示缓存的数据输出到点阵屏
void displaymove(unsigned char count,unsigned char timer);//显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数,
//非常好用的字摸软件PCtoLCD2002完美版 字模选项:阴码、逐行式、顺向
void main(void) //主入口函数
{
display(0);
while(1)
{
displaymove(16,10);
}
}
void display(unsigned char dis)//显示
{
unsigned char i,ia,j,tmp,x; //定义变量
DATE_OUT=0XFF; //置位高电平做准备
AB=0; //将列数据位清0,准备移位
for(i=0;i<16;i++)
{ //循环输出16行数据
SCK=0; //为列移位做准备
SCLT=0; //为行锁存做准备
for(x=3;x>0;x--)
{
for(ia=2;ia>0;)
{ //每行16个点,循环位移两个字节
ia--; //循环两次
if(dis==1)
{
tmp=~date[x-1][i*2+ia]; //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成, //电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据
}
if(dis==0)
tmp=0xff;
for(j=0;j<8;j++)
{ //循环两次,每次移一个字节,
SCLH=0; //为列移位做准备
DATA=tmp&0x01; //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位
tmp>>=1; //将数据缓冲右移一位,为下次输出做准备
SCLH=1; //将DATA上的数据移入寄存器
} //移入单字节结束
} //移入两个字节结束
}
SCK=1; //SCK拉高,列数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳)
SCLT=1; //SCLT拉高,将数据锁存输出到相应行的点阵发光管显示,显示一行后将保持到下一行显示开始
AB=1; //列数据位只在第一行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始一直移位最后一位,
//移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱
}
j=20;
while(j--); //每一行的显示,保持16个移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度
SCK=0; //
SCK=1; //将最后一行数据移出
}
void displaymove(unsigned char count,unsigned char timer)//显示汉字内容的移动效果,
//LP指向要显示第一个字的首地址,C表示显示字的个数, //timer是移动的速度
{
unsigned char c=8,i=0,ia=0,num=0;
unsigned char timerc=0;
unsigned char tmp2[16];
for(i=0;i<16;i++)
{
tmp2[i]=dong[xxx/2][i*2+ccc%2]; //取半个汉字点阵数据,16字节
}
xxx++;
if(xxx==(count*2))
xxx=0;
ccc++;
while(c)
{ //循环处理
ia=0; //做为点阵数组的元素
for(i=0;i<16;i++)
{//移动是16行同时移,因此要处理16个字节
// if(date[num][ia]&0x80)
date[num][ia]<<=1; //移当前显示缓冲的前半行字节
if(date[num][ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
date[num][ia]++;
ia++;
date[num][ia]<<=1; //移当前显示缓冲的前半行字节
if(date[num+1][ia-1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
date[num][ia]++;
ia--;
date[num+1][ia]<<=1; //移当前显示缓冲的前半行字节
if(date[num+1][ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
date[num+1][ia]++;
ia++;
date[num+1][ia]<<=1; //移当前显示缓冲的前半行字节
if(date[num+2][ia-1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
date[num+1][ia]++;
ia--;
date[num+2][ia]<<=1; //移当前显示缓冲的前半行字节
if(date[num+2][ia+1]&0x80) //判断后半行字节的高位是否为1,是移入前半行字节低位,否则不处理
date[num+2][ia]++;
ia++;
date[num+2][ia]<<=1;
if(tmp2[i]&0x80) //判断下一个要显示汉字的前半行字节的高位是否为1,是移入,否则不处理
date[num+2][ia]++;
ia++;
tmp2[i]<<=1; //下一个要显示汉字的半行字节向高位移一位,准备下一次取位
}
timerc=timer; //处理完16行,调用显示函数更新点阵
while(timerc--) //循环做为处理的速度,即移动的速度
display(1);
//----------
c--; //移完一半,进入下一半或下一个汉字,直到结束
}
}
void displaymoveup(unsigned char count,unsigned char time)
{
unsigned char k,i,j,tim=0;
for(i=0;i<3;i++)
{
for(j=0;j<32;j++)
{
date[i][j]=xin[upcount][j];
}
upcount++;
}
if(upcount==count)
upcount=0;
for(k=0;k<16;k++)
{
for(i=0;i<3;i++)
{
for(j=0;j<32;j++)
{
if(j<30)
date[i][j]=date[i][j+2];
if(j>=30)
date[i][j]=0x00;
}
}
tim=time;
while(tim--)
display(1);
}
}
⑷ 基于AT89C51单片机点亮16×16点阵的C语言程序
摘要 #include
⑸ C语言写51单片机驱动16*点阵
#define uchar unsigned char
#define uint unsigned int
sbit h1=P1^0;
sbit h2=P1^1;
sbit l1=P1^2;
sbit l2=P1^3;
sbit l3=P1^4;
sbit l4=P1^5;
uchar code tab_led[][32]=
{
};
void delay(uint g1)
{
uchar g2;
while(g1--)
{
for (g2=0;g2<125;g2++)
{
_nop_();
}
}
}
void disp(uchar a)
{
uchar i1=0;
uint hang=0x0001;
while(hang)
{
P0=hang%256;
h1=1;
h1=0;
P0=hang/256;
h2=1;
h2=0;
P0=tab_led[a][i1*2];
l1=1;
l1=0;
P0=tab_led[a][i1*2+1];
l2=1;
l2=0;
P0=tab_led[a+1][i1*2];
l3=1;
l3=0;
P0=tab_led[a+1][i1*2+1];
l4=1;
l4=0;
delay(1);
P0=0x00;
h1=1,h2=1,l1=1,l2=1,l3=1,l4=1;
h1=0,h2=0,l1=0,l2=0,l3=0,l4=0;
i1++;
hang=hang<<1;
}
}
void main()
{
while(1)
{
disp(0);
}
}
能看懂吗?有疑问可加Q;[email protected]
⑹ 单片机用c语言怎么写程序 点阵16x16的用74hc595,4个串联的。 写大字就行。方法只能用指
595是串行输入,并行输出,自动移位的一个芯片,级联的话,也是自动移位到下一块595内部的,,所以这样的发送方式,在使用指针进行的时候,相对简单一些的,,,不使用指针也是可以达到那个目的的,,只是程序相对复杂一点,,,建议学会使用指针,,很多程序都是使用指针很简单,,不然程序就很复杂。。
⑺ 用单片机实现16*16点阵显示,要用C语言编写程序+注释,顺便还要原理图,能帮帮忙么
问题:
1.字符串没加结束标志'\0'
2. else if(ns>=n&&nt<n)
for(i=0;i<n;i++)
{m1[i]=s[i];
strcat(m1,t);
strcpy(s,m1);
}
这段错误
#include"iostream.h"
#include"string.h"
#include"stdio.h"
void mystrcat(char s[],char t[],int n)
{
char m1[100],m2[100];
int i,ns,nt;
ns=strlen(s);
nt=strlen(t);
if(ns>=n&&nt>=n)
{
for(i=0;i<n;i++)
{
m1[i]=s[i];
m2[i]=t[i];
}
m1[i]='\0';
m2[i]='\0';
strcat(m1,m2);
strcpy(s,m1);
}
else if(ns<n&&nt>=n)
{
for(i=0;i<n;i++)
m2[i]=t[i];
m2[i]='\0';
strcat(s,m2);
}
else if(ns>=n&&nt<n)
{for(i=0;i<n;i++)
{m1[i]=s[i];
}
m1[i]='\0';
strcat(m1,t);
strcpy(s,m1);
}
else
strcat(s,t);
}
void main()
{
char s[100],t[100];
gets(s);
gets(t);
int n;
cin>>n;
mystrcat(s,t,n);
puts(s);
}
我可以帮助你,你先设置我最佳答案后,我网络Hii教你。
⑻ 基于atmega16的16 16点阵单片机程序
找出你要的问题就行了!
⑼ 能不能给一个单片机控制16*16点阵的C程序 行是用154控制,列是用595控制 急需
http://hi..com/zjc13260566870/ihome/myblog
我空间有我前一段时间刚写的程序
要原理图,还有取字模就加我
P3.0=A
P3.1=B
P3.2=C
P3.3=D
我只是将两个138扩展成16位,和154逻辑一样