各位大神些,本人小白一个,请教一个问题。我买了一块16*16的点阵,用的是4个595和2个138驱动。现在的程序能正确显示图形。但我想让它闪烁隔一秒显示一下。要怎么才能闪烁呢?
- /*-----------------------------------------------
- 名称:595控制4汉字点阵屏
- 内容:屏+5V、GND连接电源5V
- P0.0-P0.3分别连接A、B、C、D,用于控制16行,通过2路HC138控制
- SCK时钟连接P2.5
- LATCH锁存连接P2.6
- R1红色数据信号连接至P0.4
- G1绿色数据信号连接至P2.4,如果使用单红色屏此信号无需连接
- OE使能端一般接GND,可以用IO引脚PWM控制亮度
- 或者使用此引脚控制拖尾现象。
- 现象:使用普通速度51系列单片机。屏幕出现笑脸图标
- ------------------------------------------------*/
- #include<reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Key1=P1^0; //定义单片机P1口的第0位(即P1.0)为输入
- sbit Key2=P1^1; //定义单片机P1口的第0位(即P1.1)为输入
- sbit Key3=P1^2; //定义单片机P1口的第0位(即P1.2)为输入
- sbit T_STR = P2^6; //锁存引脚,屏上标识位STR
- sbit R1 = P0^4; //数据引脚,屏上标识R1
- sbit G1 = P2^4; //数据引脚,屏上标识G1
- sbit T_CLK = P2^5; //时钟引脚,屏上标识位CLK
- sbit OE = P2^1; //使能引脚,屏上标识EN/OE
- unsigned char tab[8];
- unsigned char DIS[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//行数据
- /*-----------------------------------------------
- 16x16汉字取模数据
- ------------------------------------------------*/
- unsigned char code hztest[][32]= //二维数组,目的是减少运算,可以用最基本的一维数组,每个汉字有32个字节数据
- {
- /*-- 调入了一幅图像:K:\C51\汉字 取模程序\前行16.bmp --*/
- /*-- 宽度x高度=16x16 --*/
- 0x80,0x01,0xC0,0x03,0xE0,0x07,0xF0,0x0F,0xF8,0x1F,0xFC,0x3F,0xDE,0x7B,0xCF,0xF3,
- 0xC7,0xE3,0xC3,0xC3,0xC1,0x83,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,
- /*-- 调入了一幅图像:K:\C51\汉字 取模程序\左转16.bmp --*/
- /*-- 宽度x高度=16x16 --*/
- 0x80,0x07,0xC0,0x03,0xE0,0x01,0xF0,0x00,0x78,0x00,0x3C,0x00,0xFE,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFE,0xFF,0x3C,0x00,0x78,0x00,0xF0,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,
- /*-- 调入了一幅图像:K:\C51\汉字 取模程序\右转16.bmp --*/
- /*-- 宽度x高度=16x16 --*/
- 0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0F,0x00,0x1E,0x00,0x3C,0xFF,0x7F,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0x7F,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x80,0x07,0xC0,0x03,0xE0,0x01,
- };
- /*-----------------------------------------------
- 向595写入一个字节 单红色
- ------------------------------------------------*/
- void InputByte( uchar DataR1) //写一个字节
- {
- uchar i;
- for(i=8; i>0; i--)
- {
- R1 = !(DataR1&0x01);
- T_CLK = 0;
- T_CLK = 1;
- DataR1 = DataR1 >> 1;
- }
- }
- /*-----------------------------------------------
- 向595写入两个字节 双色
- ------------------------------------------------*/
- void Input2Byte( uchar DataR1,uchar DataG1) //写一个字节
- {
- uchar i;
- for(i=8; i>0; i--)
- {
- R1 = !(DataR1&0x01);
- G1 = !(DataG1&0x01);
- T_CLK = 0;
- T_CLK = 1;
- DataR1 = DataR1 >> 1;
- DataG1 = DataG1 >> 1;
- }
- }
- void Write_A(uint k) //写一个字符
- {
- static uchar count,j;
- uchar i;
- T_STR=0; //锁存释放
-
- for(j=0;j<1;j++) //取每个汉字的前2个字节,数据传输完成后锁存输出即可 j表示汉字个数,如果是3个汉字屏就可以修改成3
- {
- InputByte(hztest[j][k]);
- InputByte(hztest[j][k+1]);
- }
- OE=1; //暂时关闭屏幕,防止出现鬼影,如果没有使用该引脚控制则会出现拖影现象。
- T_STR=1; //锁存有效,此时一行的数据显示到屏上
- P0=DIS[15-count]|0xf0;//用P0口的前4位控制16行,屏内部通过4-16译码器工作,循环扫描其他15行
- OE=0;//使能
- count++;
- i+=2; //累加调用下一行数据
- if(count==16)
- count=0;
- if(i==32)
- i=0;
- }
- //--------------------------------------------
- /*n毫秒的延时程序*/
- void Delay_xms(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- /*-----------------------------------------------
- 主程序
- ------------------------------------------------*/
- main()
- {
-
- while(1)
- {
- Write_A(1);
- Delay_xms(2000);//这名出错,一加上就不能正确显示;
- }
- }
复制代码
|