如果是动态显示,那就定时把几个字的字库写入专门定义的显示缓存区,同时,在定时器中断程序中将显示缓存区输出到引脚,此方案驱动电路比较简单。这就是大概的思路,具体的电路,网上很多,可以参考。当然,如果是用专门的LED
pc=zi[i+1];在这你这程序是定死的。你加个变量,让它变动就可以移动了。这里的看看。我没有编译,不知道有没有问题。void main(){ uchar a,b,c=4;com_8255=0x80; //将8255三个口作为基本输出 temp=0xfe;//
while (1){ for (i=0; i<8; i++){ led >> 1;delay();} for(i=0; i<8; i++){ led << 1;delay();} }
MOV P1,#11111110B;点亮P1.0对应LED LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况 MOV P1,#11111110B LCALL DLY_500MS ;延时500ms 可以清晰看到每个LED的亮灭情况 MOV P1,#11111101B LCALL DLY_
在8X8点阵LED上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发
//--- //--- // //16*16点阵LED显示中文程序 //本程序逐个显示中文,从右至左流动显示 //使用横向,流动只有字节间操作 //字模数据:文字下侧存储为数组中奇数 //文字上侧存储为数组中偶
在8X8 LED 点阵上显示柱形,让其先从左到右平滑移动1次,其次从右到左 平滑移动1次,再次从上到下平滑移动1次,最后从下到上平滑移动次,如此循环下去。LED显示原理:显示某一个点时,列值设为1,行值设为0即可
单片机,如何让8X8LED点阵屏由下往上循环显示?
//显示0 w=0x01; //行变量为第一行 for(i=0;i<8;i++){ P1=w;//行数据送P1口 P0=led0[i];delayms(1);//列数据送P0口 w<<=1;//向下移动一行 } } } void delay1ms(unsigned int ms){ unsigned
1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,
0x22,0x1C},//3 {0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x08},//4 {0x3E,0x20,0x20,0x3E,0x02,0x02,0x22,0x1C},//5 {0x1C,0x22,0x20,
说明你的程序根本就不能控制8x8点阵LED,都不能点亮。再说了,显示一个汉字,至少要16x16的点阵,开发板上的8x8点阵只能显示一些图形,根本就不能显示汉字的。
static unsigned int tmr = 0; //1s软件定时器 static unsigned char index = 9; //图片刷新索引 TH0 = 0xFC; //重新加载初值 TL0 = 0x67;//以下代码完成LED点阵动态扫描刷新 P0 = 0xFF; //显示消隐
单片机汉字8x8点阵LED动态显示程序
然后 两个FOR循环 大循环0~7自增 内嵌一个 段码【0~7自增】 :这是8*8 单个的点阵了 你所说的 是要16*16才有能力显示汉字的吧 是这样的 你如果也像上面这样的话一个字就用了整个 48个端口了
行列扫描显示。。。找个原理图很简单啊,程序也不难。
第一步:先制作字库,少量汉字可以利用画笔工具,在画笔上写上16*16的汉字(最好是宋体),在放大功能下查看每个像素,黑色为1,白色为0,按照列或行依次读取。一个汉字的点阵用32个字节表示。第二步:将上述汉字点阵制成
在8X8点阵LED上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发
51单片机点阵显示一个汉字
LED点阵左移是指在LED点阵显示屏上,将所有的LED灯从左到右依次向左移动一位,并将最左边的一位移动到最右边。这种移动可以通过控制点阵中每一位的亮灭状态来实现。在硬件实现上,可以使用ShiftRegister来控制每一位的状态
如果点阵显示的是图形,是可以把点阵逆时针转90度,图形就从左向右显示了。但是,看你程序是显示字母,旋转的方法就不行了,那样,字母是横着显示了,这不符合习惯和题目要求。修改方法是,所显示的那些字母要重新取模了,
但是简单一点来说led点阵需要两排8位,一个负责行,一个负责列,比如0是选中的意思,那么行是01111111,列是1011111,那么第一行的第二列灯亮。原理说完,那么左移的话那就简单了,简单而言,行不变,列左移一位,比如
当实现循环左移时,将a[i+1]的值赋给a[i];将a[0]赋给a[7];当然说的不大清楚 给你个例子:define LEDPORT P1 unsigned char a[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};unsigned char i =
你用取模软件先点个心形,然后用字节左右移来实现就可以了我有16*16点阵的各种动态效果程序给你看下总共有12种动态效果,你改成8*8就可以了/***呈现各种显示效果的函数集***/void flash_bai(uchar *flash_word,uchar flash_heard,
//定义一个无符号字符型局部变量 i 取值范围 0~255 Delay(50000); P1=0xfe; //赋初始值 for(i=0;i8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次
单片机led点阵显示屏8*8左移怎么调
//显示0 w=0x01; //行变量为第一行 for(i=0;i<8;i++){ P1=w;//行数据送P1口 P0=led0[i];delayms(1);//列数据送P0口 w<<=1;//向下移动一行 } } } void delay1ms(unsigned int ms){ unsigned
1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,
0x22,0x1C},//3 {0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x08},//4 {0x3E,0x20,0x20,0x3E,0x02,0x02,0x22,0x1C},//5 {0x1C,0x22,0x20,
说明你的程序根本就不能控制8x8点阵LED,都不能点亮。再说了,显示一个汉字,至少要16x16的点阵,开发板上的8x8点阵只能显示一些图形,根本就不能显示汉字的。
static unsigned int tmr = 0; //1s软件定时器 static unsigned char index = 9; //图片刷新索引 TH0 = 0xFC; //重新加载初值 TL0 = 0x67;//以下代码完成LED点阵动态扫描刷新 P0 = 0xFF; //显示消隐
单片机汉字8x8点阵LED动态显示程序
1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,
0x22,0x1C},//3 {0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x08},//4 {0x3E,0x20,0x20,0x3E,0x02,0x02,0x22,0x1C},//5 {0x1C,0x22,0x20,
说明你的程序根本就不能控制8x8点阵LED,都不能点亮。再说了,显示一个汉字,至少要16x16的点阵,开发板上的8x8点阵只能显示一些图形,根本就不能显示汉字的。
static unsigned int tmr = 0; //1s软件定时器 static unsigned char index = 9; //图片刷新索引 TH0 = 0xFC; //重新加载初值 TL0 = 0x67;//以下代码完成LED点阵动态扫描刷新 P0 = 0xFF; //显示消隐
单片机汉字8x8点阵LED动态显示程序
#include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char code image[11][8] = { {0xC3, 0x81, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3}, //数字0 {0xEF, 0xE7, 0xE3, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3}, //数字1 {0xC3, 0x81, 0x9D, 0x87, 0xC3, 0xF9, 0xC1, 0x81}, //数字2 {0xC3, 0x81, 0x9D, 0xC7, 0xC7, 0x9D, 0x81, 0xC3}, //数字3 {0xCF, 0xC7, 0xC3, 0xC9, 0xC9, 0x81, 0xCF, 0xCF}, //数字4 {0x81, 0xC1, 0xF9, 0xC3, 0x87, 0x9D, 0x81, 0xC3}, //数字5 {0xC3, 0x81, 0xF9, 0xC1, 0x81, 0x99, 0x81, 0xC3}, //数字6 {0x81, 0x81, 0x9F, 0xCF, 0xCF, 0xE7, 0xE7, 0xE7}, //数字7 {0xC3, 0x81, 0x99, 0xC3, 0xC3, 0x99, 0x81, 0xC3}, //数字8 {0xC3, 0x81, 0x99, 0x81, 0x83, 0x9F, 0x83, 0xC1}, //数字9 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //全亮 }; void main() { EA = 1; //使能总中断 ENLED = 0; //使能U4,选择LED点阵 ADDR3 = 0; TMOD = 0x01; //设置T0为模式1 TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms TL0 = 0x67; ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 while (1); } /* 定时器0中断服务函数 */ void InterruptTimer0() interrupt 1 { static unsigned char i = 0; //动态扫描的索引 static unsigned int tmr = 0; //1s软件定时器 static unsigned char index = 9; //图片刷新索引 TH0 = 0xFC; //重新加载初值 TL0 = 0x67; //以下代码完成LED点阵动态扫描刷新 P0 = 0xFF; //显示消隐 switch (i) { case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index][0]; break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index][1]; break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index][2]; break; case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index][3]; break; case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index][4]; break; case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index][5]; break; case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index][6]; break; case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index][7]; break; default: break; } //以下代码完成每秒改变一帧图像 tmr++; if (tmr >= 1000) //达到1000ms时改变一次图片索引 { tmr = 0; if (index == 0) //图片索引10~0循环 index = 10; else index--; } }这个程序验证过,你可以参考试试://-------------------------------------------//8*8矩阵循环显示字符和数字//显示字符串在数组disstr[]中申明//-------------------------------------------#include#include#define uchar unsigned char#define uint unsigned int//--------------------------------------------uchar code Table_of_Digits[40][8]={ {0x1C,0x22,0x22,0x22,0x22,0x22,0x22,0x1C},//0 {0x08,0x18,0x08,0x08,0x08,0x08,0x08,0x1C},//1 {0x1C,0x22,0x02,0x02,0x1C,0x20,0x20,0x3E},//2 {0x1C,0x22,0x02,0x1C,0x02,0x02,0x22,0x1C},//3 {0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x08},//4 {0x3E,0x20,0x20,0x3E,0x02,0x02,0x22,0x1C},//5 {0x1C,0x22,0x20,0x3C,0x22,0x22,0x22,0x1C},//6 {0x3E,0x02,0x04,0x08,0x10,0x10,0x10,0x10},//7 {0x1C,0x22,0x22,0x1C,0x22,0x22,0x22,0x1C},//8 {0x1C,0x22,0x22,0x22,0x1E,0x02,0x22,0x1C},//9 {0x00,0x1C,0x22,0x22,0x22,0x3E,0x22,0x22},//A {0x00,0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C},//B {0x00,0x1C,0x22,0x20,0x20,0x20,0x22,0x1C},//C {0x00,0x3C,0x22,0x22,0x22,0x22,0x22,0x3C},//D {0x00,0x3E,0x20,0x20,0x3E,0x20,0x20,0x3E},//E {0x00,0x3E,0x20,0x20,0x3E,0x20,0x20,0x20},//F {0x00,0x1C,0x22,0x20,0x3E,0x22,0x22,0x1C},//G {0x00,0x22,0x22,0x22,0x3E,0x22,0x22,0x22},//H {0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x1C},//I {0x00,0x3E,0x08,0x08,0x08,0x08,0x28,0x18},//J {0x00,0x20,0x2C,0x30,0x20,0x30,0x2C,0x20},//K {0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3E},//L {0x00,0x42,0x66,0x5A,0x42,0x42,0x42,0x42},//M {0x00,0x00,0x2C,0x32,0x22,0x22,0x22,0x22},//n {0x00,0x1C,0x22,0x22,0x22,0x22,0x22,0x1C},//O {0x00,0x3C,0x22,0x22,0x3C,0x20,0x20,0x20},//P {0x00,0x1C,0x22,0x22,0x22,0x2A,0x26,0x1F},//Q {0x00,0x38,0x24,0x24,0x38,0x30,0x28,0x24},//R {0x00,0x1C,0x22,0x20,0x1C,0x02,0x22,0x1C},//S {0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08},//T {0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//U {0x00,0x22,0x22,0x22,0x14,0x14,0x08,0x00},//V {0x00,0x41,0x41,0x49,0x55,0x55,0x63,0x41},//W {0x00,0x00,0x42,0x24,0x18,0x18,0x24,0x42},//X {0x00,0x22,0x22,0x14,0x08,0x10,0x20,0x00},//Y {0x00,0x3E,0x02,0x04,0x08,0x10,0x20,0x3E},//Z};//---------------------------------------uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//---------------------------------------uchar i=0;uchar j=0;uchar t=0;uchar Num_Index,disnum;uchar key;uchar xi;uchar yi;//---------------------------------------uchar code disstr[]="C201600102020";//---------------------------------------sbit we1=P1^1;sbit we2=P1^3;//---------------------------------------//主程序//---------------------------------------void main(){//P1=0x80;Num_Index=0; //从0 开始显示TMOD=0x01; //T0 方式0TH0=(65536-2000)/256; //2ms 定时TL0=(65536-2000)%256;IE=0x82;key=0;xi=0;yi=0;EX0=1;IT0=1;TR0=1; //启动T0while(1);}//---------------------------------------//外部中断0 中断函数//按键处理//---------------------------------------void ext_int0() interrupt 0{ key++; key&=0x03;}//---------------------------------------//定时器0 中断函数//显示控制//---------------------------------------void LED_Screen_Display() interrupt 1{TH0=(65536-2000)/256; //2ms 定时TL0=(65536-2000)%256;switch(key){//显示点阵图形case 0: P0=0xff; if(Num_Index==0)disnum=disstr[Num_Index]-'A'+10; else disnum=disstr[Num_Index]-'0'; we1=1; P0=~Table_of_Digits[disnum][i]; we1=0; P0=0xff; //输出位码和段码 we2=1; P0=ydat[i]; we2=0; if(++i==8) i=0; //每屏一个数字由8 个字节构成 if(++t==250) //每个数字刷新显示一段时间 { t=0; if(++Num_Index==13) Num_Index=0; //显示下一个数字 } break;//流水灯“点”模式case 1: we1=1; P0=~xdat[xi]; we1=0; we2=1; P0=ydat[yi]; we2=0; if(++t==250) //每个数字刷新显示一段时间 { t=0; yi++; if(yi>7){yi=0;xi++;} if(xi>7)xi=0; } break;//流水灯“行列”模式case 2: we1=1; P0=0x00; we1=0; P0=0xff; //输出位码和段码 we2=1; P0=xdat[i]; we2=0; if(++t==250) //每个数字刷新显示一段时间 { if(++i==8) i=0; //每屏一个数字由8 个字节构成 t=0; } break;default: key=0; i=0; j=0; t=0; xi=0; yi=0; Num_Index=0; we1=1; P0=0xff; we1=0; we2=1; P1=0x80; we2=0; break;}}
行列扫描显示。。。找个原理图很简单啊,程序也不难。
小伙而,不是说随便找个HEX文件都能去点亮你连的电阵,这个是肯定的,如果你是毕业设计,主要就是叫你写程序,如果只是你玩的我可以给你仿真文件和HEX文件,你拿去直接点机运行就可以了。
#include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char code image[11][8] = { {0xC3, 0x81, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3}, //数字0 {0xEF, 0xE7, 0xE3, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3}, //数字1 {0xC3, 0x81, 0x9D, 0x87, 0xC3, 0xF9, 0xC1, 0x81}, //数字2 {0xC3, 0x81, 0x9D, 0xC7, 0xC7, 0x9D, 0x81, 0xC3}, //数字3 {0xCF, 0xC7, 0xC3, 0xC9, 0xC9, 0x81, 0xCF, 0xCF}, //数字4 {0x81, 0xC1, 0xF9, 0xC3, 0x87, 0x9D, 0x81, 0xC3}, //数字5 {0xC3, 0x81, 0xF9, 0xC1, 0x81, 0x99, 0x81, 0xC3}, //数字6 {0x81, 0x81, 0x9F, 0xCF, 0xCF, 0xE7, 0xE7, 0xE7}, //数字7 {0xC3, 0x81, 0x99, 0xC3, 0xC3, 0x99, 0x81, 0xC3}, //数字8 {0xC3, 0x81, 0x99, 0x81, 0x83, 0x9F, 0x83, 0xC1}, //数字9 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //全亮 }; void main() { EA = 1; //使能总中断 ENLED = 0; //使能U4,选择LED点阵 ADDR3 = 0; TMOD = 0x01; //设置T0为模式1 TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms TL0 = 0x67; ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 while (1); } /* 定时器0中断服务函数 */ void InterruptTimer0() interrupt 1 { static unsigned char i = 0; //动态扫描的索引 static unsigned int tmr = 0; //1s软件定时器 static unsigned char index = 9; //图片刷新索引 TH0 = 0xFC; //重新加载初值 TL0 = 0x67; //以下代码完成LED点阵动态扫描刷新 P0 = 0xFF; //显示消隐 switch (i) { case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index][0]; break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index][1]; break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index][2]; break; case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index][3]; break; case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index][4]; break; case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index][5]; break; case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index][6]; break; case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index][7]; break; default: break; } //以下代码完成每秒改变一帧图像 tmr++; if (tmr >= 1000) //达到1000ms时改变一次图片索引 { tmr = 0; if (index == 0) //图片索引10~0循环 index = 10; else index--; } }
说明你的程序根本就不能控制8x8点阵LED,都不能点亮。 再说了,显示一个汉字,至少要16x16的点阵,开发板上的8x8点阵只能显示一些图形,根本就不能显示汉字的。
include #include #include #include #include #define SPEED 2000 #define TIME 1800 #define uint unsigned int #define uchar unsigned char #define BLKN 2 //用于点阵列扫描的595的个数 #define TOTAL 26 //待显示的字数 #define CONIO P1 uchar number;//d=0, uchar control=0,choose,send; uchar receive_number=3,send_number=0; bit BUSY; bit SMB_RW; uchar hou=0; uchar min=0; uchar sec=0; uchar sg;//时高位 uchar sd;//时低位 uchar fg;//分高位 uchar fd;//分低位 uchar mg;//秒高位 uchar md;//秒低位 sbit CLK=P1^7; //输出脉冲 sbit scyx=P1^6; //复位 sbit led=P0^7; sbit pcf8563_scl=P0^5;//时钟频率 sbit pcf8563_sda=P0^4;//串行数据传输脚 uchar idata dispram[(BLKN/2)*32]={0}; uchar receive1[3]={0x00,0x00,0x00};//时、分、秒 uchar send1[4]={0x02,0x33,0x25,0x03};//时、分、秒、器件地址 /*********************************字模表***************************************/ uchar code Bmp[][32]={ {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x1C,0x18,0x38,0x1C,0x38,0x0E,0x38,0x0E, 0x78,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1C,0x1C,0x18,0x07,0xF0,0x00,0x00,0x00,0x00}, /***数字0***/ {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x0F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0, 0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x0F,0xFC,0x00,0x00,0x00,0x00}, /***数字1***/ {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x18,0x1C,0x38,0x1C,0x18,0x1C,0x00,0x38, 0x00,0x70,0x01,0xC0,0x07,0x00,0x0C,0x06,0x3F,0xFC,0x3F,0xFC,0x00,0x00,0x00,0x00}, /***数字2***/ {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x38,0x38,0x38,0x1C,0x00,0x38,0x03,0xF0, 0x03,0xF0,0x00,0x1C,0x00,0x0E,0x38,0x1C,0x38,0x1C,0x0F,0xF0,0x00,0x00,0x00,0x00}, /***数字3***/ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0xF0,0x01,0xF0,0x03,0x70,0x0C,0x70, 0x18,0x70,0x30,0x70,0x3F,0xFE,0x00,0x70,0x00,0x70,0x03,0xFE,0x00,0x00,0x00,0x00}, /***数字4***/ {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFC,0x18,0x00,0x18,0x00,0x18,0xC0,0x1F,0xF8, 0x18,0x1C,0x00,0x1E,0x10,0x0E,0x38,0x1C,0x38,0x18,0x0F,0xF0,0x00,0x00,0x00,0x00}, /***数字5***/ {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF8,0x0C,0x3C,0x18,0x08,0x38,0x00,0x3F,0xF8, 0x7C,0x1C,0x78,0x0E,0x38,0x0E,0x38,0x0E,0x1C,0x1C,0x07,0xF0,0x00,0x00,0x00,0x00}, /***数字6***/ {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFE,0x3C,0x0C,0x30,0x18,0x00,0x30,0x00,0x60, 0x00,0xC0,0x01,0xC0,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00}, /***数字7***/ {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x38,0x0C,0x30,0x0E,0x3C,0x0C,0x1F,0xF8, 0x0F,0xF0,0x38,0x3C,0x30,0x0E,0x70,0x0E,0x38,0x0C,0x0F,0xF0,0x00,0x00,0x00,0x00}, /***数字8***/ {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x38,0x18,0x30,0x0C,0x70,0x0E,0x30,0x0E, 0x38,0x3E,0x1F,0xEE,0x00,0x1C,0x18,0x18,0x3C,0x30,0x1F,0xE0,0x00,0x00,0x00,0x00}, /***数字9***/ {0x00,0x40,0x40,0x40,0x30,0x40,0x10,0x40,0x00,0x48,0x00,0x7C,0xF0,0x40,0x10,0x40, 0x10,0x40,0x10,0x40,0x10,0x40,0x12,0x40,0x14,0x40,0x18,0x44,0x17,0xFE,0x00,0x00},//让 {0x00,0x08,0x3F,0xFC,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08, 0x21,0x08,0x3F,0xF8,0x20,0x08,0x02,0x00,0x51,0x88,0x50,0x96,0x90,0x12,0x0F,0xF0},//思 {0x10,0x80,0x10,0xA0,0x20,0x94,0x21,0xFE,0x49,0x10,0xFB,0x10,0x15,0xFC,0x21,0x10, 0x41,0x10,0xFD,0xFC,0x01,0x10,0x01,0x10,0x1D,0x14,0xE1,0xFE,0x41,0x00,0x01,0x00},//维 {0x01,0x20,0x41,0x24,0x2F,0xFE,0x21,0x24,0x01,0x24,0x8F,0xFC,0x49,0x24,0x09,0x20, 0x1F,0xFE,0x29,0x22,0xE1,0x22,0x21,0x2A,0x22,0x24,0x22,0x20,0x24,0x20,0x28,0x20},//沸 {0x00,0x40,0x7A,0x48,0x49,0x50,0x4B,0xFC,0x48,0x80,0x7F,0xFE,0x49,0x10,0x4A,0x0E, 0x4D,0xF4,0x78,0x10,0x49,0x14,0x49,0xFE,0x48,0x04,0x4F,0xE4,0x88,0x14,0x18,0x08},//腾 {0x08,0x00,0x08,0x08,0x08,0xFC,0x7E,0x08,0x08,0x08,0x08,0x08,0xFE,0xF8,0x08,0x88, 0x28,0x80,0x2E,0x84,0x28,0x84,0x28,0x7C,0x28,0x00,0x58,0x06,0x8F,0xFC,0x00,0x00},//起 {0x01,0x00,0x01,0x00,0x01,0x08,0x7F,0xFC,0x01,0x00,0x21,0x10,0x19,0x30,0x09,0x44, 0xFF,0xFE,0x03,0x80,0x05,0x40,0x09,0x30,0x31,0x1E,0xC1,0x04,0x01,0x00,0x01,0x00},//来 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0C,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x00,0x00},//, {0x00,0x40,0x40,0x40,0x30,0x40,0x10,0x40,0x00,0x48,0x00,0x7C,0xF0,0x40,0x10,0x40, 0x10,0x40,0x10,0x40,0x10,0x40,0x12,0x40,0x14,0x40,0x18,0x44,0x17,0xFE,0x00,0x00},//让 {0x20,0x00,0x22,0x04,0x3F,0x7E,0x48,0x44,0x08,0x44,0xFF,0xC4,0x10,0x44,0x14,0x7C, 0x22,0x44,0x42,0x10,0x9F,0xF8,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10},//智 {0x08,0x20,0x7E,0xFC,0x08,0x20,0x3E,0xF8,0x08,0x20,0x7E,0xFC,0x08,0x20,0x3F,0xF8, 0x00,0x08,0xFF,0xFE,0x00,0x08,0x3F,0xF8,0x09,0x00,0x28,0xA8,0x48,0x24,0x07,0xE0},//慧 {0x08,0x08,0x0B,0xFC,0x10,0x00,0x20,0x00,0x40,0x00,0x08,0x04,0x17,0xFE,0x30,0x10, 0x50,0x10,0x90,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x50,0x10,0x20},//行 {0x00,0x40,0x08,0x40,0x7C,0x40,0x00,0x44,0x05,0xFE,0xFE,0x44,0x10,0x44,0x10,0x44, 0x20,0x44,0x24,0x44,0x42,0x84,0xFE,0x84,0x41,0x04,0x01,0x04,0x02,0x28,0x04,0x10},//动 {0x08,0x00,0x08,0x08,0x08,0xFC,0x7E,0x08,0x08,0x08,0x08,0x08,0xFE,0xF8,0x08,0x88, 0x28,0x80,0x2E,0x84,0x28,0x84,0x28,0x7C,0x28,0x00,0x58,0x06,0x8F,0xFC,0x00,0x00},//起 {0x01,0x00,0x01,0x00,0x01,0x08,0x7F,0xFC,0x01,0x00,0x21,0x10,0x19,0x30,0x09,0x44, 0xFF,0xFE,0x03,0x80,0x05,0x40,0x09,0x30,0x31,0x1E,0xC1,0x04,0x01,0x00,0x01,0x00},//来 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x3C,0x00,0x00,0x00},//.}; uchar code Bmp1[][32]={ {0x01,0x00,0x11,0x00,0x11,0x00,0x11,0x08,0x3F,0xFC,0x21,0x00,0x41,0x00,0x41,0x00, 0x81,0x10,0x3F,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x00,0x00}, {0x00,0x10,0x1F,0xF8,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0, 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x00,0x00}, {0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x88,0x5B,0xFC,0x54,0x88,0x50,0x88,0x90,0x88, 0x10,0x88,0x1F,0xFE,0x10,0x80,0x11,0x40,0x11,0x20,0x12,0x10,0x14,0x0E,0x18,0x04}, {0x00,0x20,0x00,0xF0,0x1F,0x00,0x10,0x00,0x11,0x00,0x11,0x00,0x21,0x04,0x7F,0xFE, 0x01,0x00,0x01,0x00,0x09,0x20,0x09,0x10,0x11,0x08,0x21,0x0C,0x45,0x04,0x02,0x00}, {0x00,0x00,0x38,0x1C,0x44,0x22,0x54,0x2A,0x44,0x22,0x37,0xEC,0x08,0x10,0x10,0x08, 0x2E,0x74,0x20,0x04,0x21,0x84,0x24,0x24,0x13,0xC8,0x08,0x10,0x07,0xE0,0x00,0x00} }; /*********************************字模表***************************************/ /************系统函数的配置***********/ void sysclk_int(void) //内部晶振 { OSCICL=0x83; OSCICN=0xc3; //不分频 CLKSEL=0x00; } /* void delay1(uchar n) //延时程序 { uchar j; for(j=0;j<n;j++) { _nop_(); _nop_(); _nop_(); _nop_(); } } */ void delay(uint i) //毫秒延时 { register uchar j;// for(;i;i--) for(j=0;j<255;j++); } void SPI_INT(void) //SPI初始化 { SPI0CFG=0x40; SPI0CN=0x01; //0000 0001最后一位是SPI使能位 SPI工作在三线主方式 SPI0CKR=0x0f; //SPI 时钟频率设置为100kHz 0x63 IE &= 0xbf; //关闭SPI中断 } void SMB_INT(void) //SMB初始化 { SMB0CF=0x5f; //使能SMB 允许时间扩充 定时器2低字节溢出时钟源 SMB0CF|=0x80; } void TIME01_INT(void) //定时器初始化 { TCON=0x10; //定时器0允许 TMOD=0x01; //定时器0在16位工作方式 CKCON &= 0xf8; CKCON |= 0x01; //定时器0使用系统4分频 TL0=0x03; TH0=0x03; IE|=0x02; } void TIME2_INT(void) //定时器2用于配置SMB的时钟频率 { TMR2CN=0x00; CKCON |= 0x00; TMR2RLL = 0xef; TMR2RLH = 0xff; TMR2L = 0xef; TMR2H = 0xff; TMR2CN |= 0x0c; } void TIME3_INT(void)//用于I2C的超时检测 { TMR3CN = 0x00; //定时器3为16位自动重载 CKCON &= ~0x40; TMR3RLL = 0xaf; TMR3RLH = 0x57; TMR3L = 0xaf; TMR3H = 0x57; EIE1|=0x00; TMR3CN |= 0x04; } void pio_int(void) // 端口配置 { XBR0=0x06; XBR1=0x40; P0MDIN=0xff; //禁止模拟输入,0为模拟,1为数字 P0MDOUT=0x0d; //0为开漏,1为推挽(ff) P0SKIP=0x08; P1MDIN=0xff; P1MDOUT=0xff; //低四位用于138 P1SKIP=0x00; P0=0xff; P1=0xff; } /*************呈现各种显示效果的函数集****************/ //void Jump_Word(uchar a) 立即跳显示一个字或一张图案 //void M_Word(uchar a) 卷帘出显示一个字或一张图案 //void M_Words(number) 显示几个交换的字 //void UP_Run(number) 向上滚屏n个字 //void L_Removeout(number) 右入左出n个字 //void M_Black(void) 黑屏 //void R_Removeout(number) 左入右出n个字 /*****************************************************/ /****************立即跳显示一个字或一张图案***************/ void Jump_Word(uchar a) {register uchar i,q; for(i=0;i<32;i++) { for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=Bmp[a][i];} //if(i%2)delay(SPEED); } } /****************卷帘出显示一个字或一张图案***************/ void M_Word(uchar a) {register uchar i,q; for(i=0;i<32;i++) { for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=Bmp1[a][i];} if(i%2)delay(SPEED); } } /****************卷帘出显示number个字***************/ void M_Words(number) {register uchar i,q,w; for(w=0;w<number*2/BLKN;w++) { for(i=0;i<32;i++) { for(q=0;q<BLKN/2;q++){dispram[i+q*32]=Bmp[q+w*BLKN/2][i];} if(i%2)delay(SPEED); } delay(TIME); } } /****************向上滚屏number个字***************/ void UP_Run(number) {register uchar i,j,k,q; for(i=0;i<number*2/BLKN;i++) { for(j=0;j<16;j++) { for(k=0;k<15;k++) { for(q=0;q<BLKN/2;q++) { dispram[k*2+q*32]=dispram[(k+1)*2+q*32]; dispram[k*2+1+q*32]=dispram[(k+1)*2+1+q*32]; } } for(q=0;q<BLKN/2;q++) { dispram[30+q*32]=Bmp[q+i*BLKN/2][j*2]; dispram[31+q*32]=Bmp[q+i*BLKN/2][j*2+1]; } delay(2*SPEED); } delay(2*TIME); } } /****************左移出显示number个字*******************/ void L_Removeout(number) {register uchar i,j,k,l,q; for(i=0;i<number;i++) { for(j=0;j<2;j++) for(k=0;k<8;k++) { for(l=0;l<16;l++) { for(q=0;q<BLKN/2;q++) { dispram[l*2+q*32]=dispram[l*2+q*32]>7; if(q==BLKN/2-1) dispram[l*2+1+q*32]=dispram[l*2+1+q*32]>(7-k); else dispram[l*2+1+q*32]=dispram[l*2+1+q*32]>7; } } delay(2*SPEED); } } } /****************卷帘出黑屏***************/ void M_Black(void) {register uchar i,q; for(i=0;i<32;i++) { for(q=0;q<BLKN/2;q++) {dispram[i+q*32]=0x00;} if(i%2)delay(SPEED); } } /****************右移出显示number个字*******************/ void R_Removeout(number) {register uchar i,j,k,l,q; for(i=0;i<number;i++) { for(j=2;j>0;j--) for(k=0;k<8;k++) { for(l=0;l<16;l++) { for(q=0;q<BLKN/2;q++) { dispram[l*2+1+q*32]=dispram[l*2+1+q*32]>>1|dispram[l*2+q*32]<<7; if(q==0) dispram[l*2+q*32]=dispram[l*2+q*32]>>1|Bmp[i][l*2+j-1]<<(7-k); else dispram[l*2+q*32]=dispram[l*2+q*32]>>1|dispram[l*2+1+(q-1)*32]<<7; } } delay(2*SPEED); } } } /*************用于时钟芯片操作的函数集****************/ //void write_pcf8563(void)写时钟芯片 //void read_pcf8563(void)读时钟芯片 /*****************************************************/ void write_pcf8563(void) { SPI0CN &=~0x01; //暂时关掉SPI通讯 send =0xa2; //送子器件地址 while(BUSY); BUSY=1; SMB_RW=0;control=5; STA=1; //开始传送 while(BUSY); SPI0CN |=0x01; //重新开启SPI } void read_pcf8563(void) //读当时的时,分,钞 { SPI0CN &=~0x01; send =0xa2; //送子器件地址 while(BUSY); BUSY=1; SMB_RW=0; STA=1; send=0x02; while(!SI); BUSY=1; send=0xa2; while(BUSY); BUSY=1; SMB_RW=1; STA=1; while(BUSY); BUSY=1; sec=receive1[2]&0x7f;//读秒 min=receive1[1]&0x7f;//读分 hou=receive1[0]&0x3f;//读时 SPI0CN |=0x01; } void spit_time(void)//分别计算时、分、秒的各位数字 { sg=(int)hou/16; sd=(int)hou%16; fg=(int)min/16; fd=(int)min%16; mg=(int)sec/16; md=(int)sec%16; } void dat_int(void) //数据初始化 { scyx=1; CLK=0; } void sysclk_int(void); void delay(unsigned n); void pio_int(void); void SPI_INT(void); void SMB_INT(void); void dat_int(void); void TIME01_INT(void); void TIME2_INT(void); void TIME3_INT(void); void write_pcf8563(void); void read_pcf8563(void); void spit_time(void); /**************主函数**************/ void main(void) //主程序 { register uchar i; PCA0MD &= ~0x40;// 关闭看门狗 sysclk_int(); OSCICN |= 0x02; /****************初始化检测pcf8563****************/ while(!pcf8563_sda) { XBR1 = 0x40; pcf8563_scl = 0; for(i = 0; i < 255; i++); pcf8563_scl = 1; while(!pcf8563_scl); for(i = 0; i < 10; i++); XBR1 = 0x00; } /****************初始化检测pcf8563****************/ pio_int(); TIME01_INT(); TIME2_INT(); TIME3_INT(); SPI_INT(); //SPI0DAT是SPI的数据寄存 SMB_INT(); spit_time(); EIE1|=0x01; EA=1; dat_int(); led=0; TR0=0; delay(1000); write_pcf8563(); while(1) { TR0=0; BUSY=0; read_pcf8563(); spit_time(); TR0=1; //Jump_Word(sg); //Jump_Word(sd); //Jump_Word(fg); //Jump_Word(fd); //Jump_Word(md); //M_Word(md); M_Word(4); delay(10*TIME); M_Words(TOTAL); UP_Run(TOTAL); M_Black(); delay(10*TIME); L_Removeout(TOTAL); delay(3*TIME); M_Black(); delay(10*TIME); R_Removeout(TOTAL); delay(3*TIME); }//总while循环的结束 }//main函数的结束 void t0(void) interrupt 1 //定时器0的中断服务程序 { register uchar m,n=BLKN; TH0 = 0xfc; TL0 = 0x18; m = CONIO; m = (++m)&0x0f; for(n=0;n<BLKN;n++) { SPI0DAT = dispram[30-m*2+n];//dispram[((BLKN-)n/2+1)*30-m*2-(n/2)*30+n] while(!SPIF); SPIF=0; } CONIO &= 0xf0; CLK = 1; CONIO |= m; CLK = 0; scyx=1; } void SMBus_ISR (void) interrupt 7 { bit FAIL = 0; if (ARBLOST == 0) //如果赢得总线 { switch (SMB0CN & 0xF0) //确定中断来源 { case 0xe0: //主发送方式下产生开始条件 SMB0DAT = send; SMB0DAT &= 0xFE; SMB0DAT |= SMB_RW; //对发送的数据进行处理 STA = 0; break; case 0xc0: //主方式下发送 if (ACK) { if (SMB_RW == 0) { if(send_number<=3) { if(control==0) { SMB0DAT = send; send_number+=5; } else { SMB0DAT = send1[send_number]; send_number++; } } else { send_number=0;control=0; STO = 1; BUSY = 0; } } else {;} //BUSY=0 } else { STO = 1; STA = 1; } break; case 0x80: //主方式下接收 if (receive_number-1>0) //控制接收3个数据就结束 { receive1[receive_number-1] = SMB0DAT; ACK = 1; receive_number--; } else { receive1[receive_number-1] = SMB0DAT; receive_number=3; BUSY = 0; ACK = 0; STO = 1; } break; default: FAIL = 1; break; } } else //输掉总线 { FAIL = 1; } if (FAIL) //SMBUS通讯失败后的处理 { SMB0CF &= ~0x80; SMB0CF |= 0x80; STA = 0; STO = 0; ACK = 0; BUSY = 0; FAIL = 0; } SI = 0; } void T3_ISR() interrupt 14 //定时器3中断服务程序 用于检测SMBus是否超时 { SMB0CF &= ~0x80; SMB0CF |= 0x80; TMR3CN &=~0x80; STA = 0; BUSY = 0; pcf8563_scl=1; } 怕有些地方你不知道是怎么来的,所有我就把完整的程序都给你了。你自己取出你所需要的就好了。因为不同的显示效果还是得靠住函数来实现的。 如果住函数没有写好,那么你的移动方式的函数就很难写了的。希望能给楼主一点灵感。呵呵~ 我还有几种效果的,但是所有的效果都必须基于我的那种显示方式。你仔细看下,和你的是不是一样的,显示缓存,各种动画效果就是移动的控制方式了 给你借鉴一下,具体的呢还得根据你的硬件来了。
这个很简单,但说起来有点麻烦,LED点阵它是行列共用的,有两种方式扫描显示,分别是行扫和列扫,假如是行扫,那么列上输出的就是数据要采用横向取模,反之则纵向取模。也就是当行扫的时候在同一时间只有一行是亮的,此时数据输出的是这一行的信息,等下一行亮时列中输出的是下一行的数据,所以要横向取模 不知道这么说够不够明白