// A B C D 对应P1.0; P1.1 ; P1.2; P1.3 //-------------------------------- #include "reg52.h" #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit CLK =P1^5 ; //74HC595移时钟 sbit STB =P1^4 ; // 74HC595锁存信号 sbit Red=P1^6 ; //红色数据输出引脚低电平有效 sbit Greed=P1^7; //全屏控制使能0,低电平有效 sbit OE = P0^0; //全屏使能 uchar SendData; //要发送的数据变量 uchar hang; //行扫描变量 (半屏只有16行,所以hang=0到15) uchar code zhong[]= { 0x00,0x00,0x01,0x80,0x20,0x86,0x3F,0xFE,0x60,0x1C,0x1F,0xF8,0x07,0x18,0x0D,0xB8,0x33,0xE0,0x06,0xF0,0x19,0xD0,0x63,0x58,0x0C,0x4E,0x3A,0xC4,0x41,0xC0,0x00,0x00 }; uchar code guo[]= { 0x00,0x00,0x01,0x80,0x01,0x80,0x3F,0xF8,0x3F,0xF8,0x31,0x98,0x3F,0xF8,0x3F,0xF8,0x31,0x98,0x31,0x98,0x3F,0xF8,0x01,0x80,0x01,0x87,0x01,0xFE,0x00,0xFC,0x00,0x00 }; uchar code ren[]= { 0x00,0x80,0x18,0xF0,0x18,0xD8,0x35,0x96,0x27,0xFE,0x6D,0xB0,0x7B,0xB4,0x5B,0xFE,0x11,0xB0,0x3F,0xB4,0x31,0xFE,0x07,0xB0,0x3D,0xB2,0x71,0xFF,0x01,0x80,0x01,0x00 }; uchar code min[]= { 0x08,0x40,0x1C,0xE0,0x18,0xC4,0x1C,0xFC,0x35,0x58,0x37,0x70,0x74,0x78,0x55,0xAF,0x17,0x70,0x14,0xF8,0x15,0xB8,0x16,0x6E,0x15,0xDC,0x13,0x70,0x17,0xC0,0x0C,0x00 }; uchar code zhu[]= { 0x00,0x00,0x0C,0x00,0x06,0xBE,0x7F,0xE6,0x33,0x24,0x1B,0x24,0x1A,0x2C,0x7F,0xEC,0x21,0x24,0x3F,0xA6,0x31,0x22,0x31,0x3E,0x3F,0x2E,0x31,0x20,0x31,0x20,0x00,0x20 }; //------------------------------------ //----------字发送子程序----------- void SendByte() { uchar m; for(m=0;m<8;m++) { CLK = 0; Red =(SendData & 0x80); //红屏显示 Greed =0;//(SendData & 0x80); //红屏显示 SendData =SendData<<1; CLK = 1; //移位时钟上升沿 } } //----------------------------------- //----------行扫描子程序------------- void RowsCan(void) { if (hang>=16) { hang =0x00; } P1 = P1 & 0xf0; P1 = P1 | hang; hang++; } //--------------------------------------- //----------初始化----------------- void initial(void) { OE = 1; Red = 1; Greed = 1; SendData = 0x00; hang = 0x00; } //;---------主程序循环-------------- void main() { int m,t=0; int k=0; initial(); while(1) { for(m=t;m<2+t;m++)/////////// { SendData=zhong[m]; SendByte(); } for(m=t;m<2+t;m++)////////////////////// { SendData=guo[m]; SendByte(); } for(m=t;m<2+t;m++)////////////////////////////////// { SendData=ren[m]; SendByte(); } for(m=t;m<2+t;m++)////////////////// { SendData=min[m]; SendByte(); } for(m=t;m<2+t;m++)///////////////////////// { SendData=zhu[m]; SendByte(); } OE = 1; RowsCan(); //行扫描 STB = 0; STB =1; //上升沿数据锁存 OE = 0; t=t+2; if(t==32) {t=0;} } } 这是静态显示的程序,可以帮我在这改吗?我真的看不懂 |
我上面的帖子中的横线是系统加上的。那些字也是有效的。 |
本帖最后由 山东人 于 2011-3-26 23:22 编辑 左移部分 void in_data(void) { char s; for(s=8;s>=0;s--) //h为向后先择字节计数器,zimuoo为向后先字计数器 { BUFF[2*s+1]=hanzi[zimuo+32*s+2*h]; //把第一个字模的第一个字节放入BUFF0中,第二个字模的第一个字节放入BUFF2中 BUFF[2*s]=hanzi[zimuo+1+32*s+2*h]; // 把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中 } } void rxd_data(void) //串行发送数据 { char s; uchar inc,tempyid,temp; if(yid<8) inc=0; else inc=1; for(s=0+inc;s<16+inc;s++) //发送8字节数据 { if(yid<8) tempyid=yid; else tempyid=yid-8; temp=(BUFF SBUF=temp;//把BUFF中的字节从大到小移位相或后发送输出。 再结合着蓝绿黄兄弟所说的道理想想就懂了。 |
拿笔在纸上推算推算,很快就会明白的 |
现在主要是移屏的问题了,我不会,谁帮帮我。。。。。。。。。 |
我不会C,个人认为产生鬼影可能和和程序有关。假设列扫描,送入数据后,廷时,关断,再送入数据,如此循环。个人推测的,请前辈指点。 |
还有就是现在闪得厉害,是不是字摸的问题,我看别人的都是用二维数组的,不过我不懂二维数组,不知道该怎么解决了。 |
OE = 1; RowsCan(); //行扫描 STB = 0; STB =1; //上升沿数据锁存 OE = 0; 这样改好多了,不过第一行还有一点点淡淡的亮 |
此处改下试试: while(1) { STB = 0; OE=1; //先关断再发送数据试试 |
左移的算法是: 同一行,以字节为单位(如16*64的屏,每一行就有8字节)。如果要实现左移N列,那么就是第1字节左移N位,第2字节右移(8-N)位。把得到两个结果进行或运算。把或运算的结果作为第1字节重新发送到屏幕进行显示。 不知道我这样有没有表达清楚~~~~ |
是字模问题 |
我的是静止的,没有移动 |
本帖最后由 lihongran 于 2011-3-23 16:47 编辑 回复 zhujianfeng 的帖子 那应该是移动太快所致,将移动速度降一些试试~~我的移动快了也是这样的 这跟行扫描的速度有关。 |
GMT+8, 2024-5-22 05:15 , Processed in 0.794143 second(s), 24 queries .
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.