⑴ 單片機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邏輯一樣