|
楼主 |
发表于 2009-11-2 10:02:31
|
显示全部楼层
z6912311,汇编只是刚学的时候看下,真正编程没有用汇编的。改变显示的汉字,你取不同汉字的模送到595就可以了啊,具体在程序里就是,改变数组table的值。程序已经注释,如果看不懂,那就再补下基础吧。论坛里面这种仿真很多的,,汉字取模软件也有下的,可以自己看看。
/*************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
/*************************************************/
sbit hc595_ds=P2^0;//控制位定义
sbit hc595_shcp=P2^1;
sbit hc595_stcp=P2^2;
sbit hc595_oe=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
uchar flag_left,flag_right,flag_up,flag_down;//上下左右标志位
uchar dispram[4];
uchar table[]={0x10,0x20,0x10,0x21,0x10,0x21,0x10,0x21,0x10,0x23,0x32,0x25,0x52,0x25,0x52,0x29,
0x11,0x29,0x10,0x21,0x10,0x21,0x08,0x21,0x08,0x21,0x04,0x21,0x04,0x21,0x02,0x20, //杭
0x08,0x01,0x08,0x02,0x08,0x02,0xDF,0x7F,0x08,0x00,0x0C,0x00,0x9C,0x0F,0xAC,0x08,
0x8A,0x08,0x8A,0x08,0x89,0x08,0x88,0x48,0x48,0x48,0x48,0x48,0x28,0x70,0x08,0x00}; //州
/*************************************************/
void hc595_write_data(uchar data_ds);
void hc595_display();
void delay(uint n);
void key_scan();
void shift_L();
void shift_R();
/*************************************************/
void main()
{
uchar i,j,k,num_l,num_r,n=0;
hc595_oe=0;
while(1)
{
for(i=0;i<16;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<16;k++)
{
key_scan();
dispram[0]=table[2*k+1];
dispram[1]=table[2*k];
dispram[2]=table[2*k+33];
dispram[3]=table[2*k+32];
if(flag_left==1)
{num_l=n;for(;num_l>0;num_l--)shift_L();} //左移,n为多少则移多少位
if(flag_right==1)
{num_r=n;for(;num_r>0;num_r--)shift_R();}//右移,n为多少则移多少位
hc595_write_data(dispram[0]);
hc595_write_data(dispram[1]);
hc595_write_data(dispram[2]);
hc595_write_data(dispram[3]);
if(flag_up==1) P1=(k-i)%16;//上下移动
else if(flag_down==1) P1=(k+i)%16;
else P1=k;
hc595_display();
delay(120);
}
}
n++;
if(n==32)n=0;//移了32位,则n清零,点阵左右是32点的。
}
}
}
/*************************************************/
void hc595_write_data(uchar data_ds)
{
uchar n_bit;
for(n_bit=0;n_bit<8;n_bit++)
{
hc595_shcp=0;
hc595_ds=data_ds&(1<<n_bit);
hc595_shcp=1;
}
}
/*************************************************/
void hc595_display()
{
hc595_stcp=0;
delay(1);
hc595_stcp=1;
}
/*************************************************/
void delay(uint n)
{
while(n--);
}
/*************************************************/
void key_scan()//按键扫描,当某一键按下,则相应标志位置一,同时其他标志位置零
{
if(P2_4==0)delay(10);
if(P2_4==0){flag_left=1;flag_right=0;flag_up=0;flag_down=0;}
if(P2_5==0)delay(10);
if(P2_5==0){flag_right=1;flag_left=0,flag_up=0;flag_down=0;}
if(P2_6==0)delay(10);
if(P2_6==0){flag_up=1;flag_left=0,flag_right=0;flag_down=0;}
if(P2_7==0)delay(10);
if(P2_7==0){flag_down=1;flag_left=0;flag_right=0;flag_up=0;}
}
/*************************************************/
void shift_L() //左移函数,调用一次移一位
{
bit hbit;
uchar i;
hbit=dispram[0]&0x80;
for(i=0;i<3;i++)
{
dispram=dispram<<1;
dispram+=dispram[i+1]>>7;
}
dispram[3]=dispram[3]<<1;
if(hbit)dispram[3]+=0x01;
}
/*************************************************/
void shift_R() //右移函数
{
bit lbit;
uchar i;
lbit=dispram[3]&0x01;
for(i=3;i>0;i--)
{
dispram=dispram>>1;
dispram+=dispram[i-1]<<7;
}
dispram[0]=dispram[0]>>1;
if(lbit)dispram[0]+=0x80;
}
/*************************************************/
显示效果:
(原文件名:杭州.gif) |
|