本帖最后由 雷影少年 于 2012-8-24 10:09 编辑
不过旧问题刚解决就出新问题了,数组里的字是6个的时候完全没问题,但是当我把字改为22个并将数组设为xdata时问题出现了,左移前8个字的时候点阵每次移动都有闪烁现象,8个字移完后点阵全亮。
(注:经测试,当数组里的字模书达到22个时,全部左移一位需80ms左右)
程序的作用是在16x16的点阵上左移循环显示汉字“武汉电力职业技术学院信息工程系***"
为方便dx了解程序,下面是源码
- #include<reg51.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- #define _TR0 10000 //定义定时器初始值10ms
- #define LINE P1
- sbit R=P2^0;
- sbit CLK=P2^1;
- sbit STB=P2^2;
- u8 flag_10ms;
- /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- /*-- 文字: 武 --*/
- u8 xdata seg[22][32]={{0x40,0x00,0x50,0x00,0x48,0x3F,0x48,0x00,0x40,0x00,0xFE,0xFF,0x40,0x00,0x40,0x04,
- 0x40,0x04,0x40,0x27,0x20,0x24,0x22,0x24,0x12,0x24,0x8A,0x27,0x06,0xF8,0x02,0x40},
- {....}};
- void zuoyi()
- {
- u8 i,j;
- bit Bit,BIT; //定义两个位,保存移位时CY的数据
- for (i=0;i<16;i++)
- {
- Bit=BIT=0;
- for(j=22;j>0;j--)
- {
- seg[j-1][2*i]=seg[j-1][2*i]<<1; //左移将最高位移入CY
- Bit=CY; //保存CY,
- seg[j-1][2*i]=seg[j-1][2*i]|BIT; //将上次移出的最高位移放到最低位
- seg[j-1][2*i+1]=seg[j-1][2*i+1]<<1; //左移将最高位移入CY
- BIT=CY; //保存CY
- seg[j-1][2*i+1]=seg[j-1][2*i+1]|Bit; //将上次移出的最高位移放到最低位
- }
- seg[21][2*i]=seg[21][2*i]|BIT; //在循环结束后将最后一次移位时的CY做第一次移位的最低位
- //完成一行字模的一次移位
- }
- }
- void write(u8 dat) //写入一个字节
- {
- u8 i;
- for (i=0;i<8;i++)
- {
- dat=dat>>1;
- R=CY;
- CLK=0;
- CLK=1;
- }
- }
- void main()
- {
- EA =1; //开中断
- ET0 =1;
- TMOD =0x01;
- TH0 =-(_TR0/256);
- TL0 =-(_TR0%256);
- TR0 =1;
- while (1)
- {
- u8 i;
- if(flag_10ms<100) //控制移动速度
- {
- for (i=0;i<16;i++)
- {
- write(~seg[0][2*i]); //第i行字模写入595
- write(~seg[0][2*i+1]);
- LINE=i; //选择第i行
- STB=1;
- STB=0; //显示
- }
- }
- else
- {
- flag_10ms=0;
- zuoyi(); //移动一次(1列)
- }
- }
- }
- void time_10ms() interrupt 1 //每10ms中断一次
- {
- TH0=-(_TR0/256);
- TL0=-(_TR0%256);
- flag_10ms++;
- }
|