仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /*-----------------------------------------------
- 名称:595控制4汉字点阵屏
- 51单片机
- 内容:屏+5V、GND连接电源5V
- P0.0-P0.3分别连接A、B、C、D,用于控制16行,通过2路HC138控制
- SCK时钟连接P2.5
- LATCH锁存连接P2.6
- R1红色数据信号连接至P2.4
- G1绿色数据信号连接至P0.4,如果使用单红色屏此信号无需连接
- OE使能端一般接GND,可以用IO引脚PWM控制亮度
- 或者使用此引脚控制拖尾现象。
- 现象:使用普通速度51系列单片机。
- K1按下屏幕出现实体心型
- K2按下屏幕出现笑脸图标
- K3按下屏幕出现A8图标
- K4按下屏幕出现陈文蓉 邱莉杰
- ------------------------------------------------*/
- #include<reg52.h>
- sbit T_STR = P2^6; //锁存引脚,屏上标识位STR
- sbit R1 = P2^4; //数据引脚,屏上标识R1
- sbit G1 = P0^4; //数据引脚,屏上标识G1
- sbit T_CLK = P2^5; //时钟引脚,屏上标识位CLK
- sbit OE = P2^1; //
- sbit K1 = P3^2; //
- sbit K2 = P3^3; //
- sbit K3 = P3^4; //
- sbit K4 = P3^5; //
- unsigned char tab[8];
- unsigned char DIS[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//行数据
- int oo=0;
- static unsigned char count,j,kk;
- /*-----------------------------------------------
- 16x16汉字取模数据
- ------------------------------------------------*/
- unsigned char code hztest[][32]= //二维数组,目的是减少运算,可以用最基本的一维数组,每个汉字有32个字节数据
- {
- /*-- 文字: 学 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x44,0x10,0x88,0x10,0x88,0x08,0x00,0x04,0xFE,0x7F,0x02,0x40,0x01,0x20,0xF8,0x07,
- 0x00,0x02,0x80,0x21,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,
- };
- unsigned char code hztest1[][32]= //二维数组,目的是减少运算,可以用最基本的一维数组,每个汉字有32个字节数据
- {
- /*-- 文字: 文 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x40,0x00,0x80,0x00,0x80,0x20,0xFF,0x7F,0x08,0x08,0x10,0x08,0x10,0x04,0x20,0x04,
- 0x20,0x02,0x40,0x01,0x80,0x00,0x40,0x01,0x20,0x06,0x10,0x08,0x0C,0x70,0x03,0x20,
- /*-- 文字: 经 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x08,0x00,0xC8,0x3F,0x04,0x10,0x04,0x08,0x22,0x0C,0x3F,0x12,0x10,0x61,0xC8,0x40,
- 0x04,0x00,0x82,0x3F,0x3F,0x04,0x00,0x04,0x38,0x04,0x07,0x24,0xE2,0x7F,0x00,0x00,
- /*-- 文字: 学 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x44,0x10,0x88,0x10,0x88,0x08,0x00,0x04,0xFE,0x7F,0x02,0x40,0x01,0x20,0xF8,0x07,
- 0x00,0x02,0x80,0x21,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,
- /*-- 文字: 院 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x01,0x1E,0x02,0xF2,0x7F,0x2A,0x40,0x1A,0x28,0xC6,0x1F,0x0A,0x00,0x12,0x10,
- 0xF2,0x3F,0x12,0x05,0x16,0x05,0x0A,0x05,0x82,0x44,0x82,0x44,0x42,0x78,0x32,0x00,
-
- /*-- 文字: 一 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- /*-- 文字: 尚 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x80,0x00,0x84,0x10,0x98,0x18,0x90,0x04,0x80,0x20,0xFE,0x7F,0x02,0x20,0x02,0x24,
- 0xF2,0x2F,0x12,0x24,0x12,0x24,0x12,0x24,0xF2,0x27,0x12,0x24,0x02,0x28,0x02,0x10,
- /*-- 文字: 衍 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x08,0x10,0x28,0x3E,0xC4,0x00,0x82,0x00,0x01,0x00,0x28,0x20,0xC4,0x7E,0x86,0x10,
- 0x05,0x10,0x84,0x10,0x44,0x10,0x74,0x10,0x44,0x10,0x44,0x10,0x44,0x14,0x44,0x08,
- /*-- 文字: 旭 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x08,0x00,0x08,0x10,0x08,0x3F,0x08,0x11,0x7F,0x11,0x48,0x11,0x48,0x11,0x48,0x1F,
- 0x48,0x11,0x48,0x11,0x48,0x11,0x48,0x11,0x44,0x5F,0x44,0x40,0x82,0x7F,0x01,0x00,
- };
- unsigned char code hztest2[][32]= //二维数组,目的是减少运算,可以用最基本的一维数组,每个汉字有32个字节数据
- {
- /*-- 文字: 欢 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x01,0x00,0x01,0x3F,0x01,0x20,0x3F,0xA2,0x20,0x62,0x12,0x14,0x02,0x14,0x02,
- 0x08,0x02,0x14,0x02,0x24,0x05,0x22,0x05,0x81,0x08,0x80,0x10,0x40,0x70,0x30,0x20,
- /*-- 文字: 迎 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x00,0x82,0x21,0x64,0x7E,0x28,0x22,0x20,0x22,0x20,0x22,0x2F,0x22,0x28,0x23,
- 0xA8,0x22,0x68,0x2A,0x28,0x12,0x08,0x02,0x08,0x02,0x14,0x62,0xE2,0x3F,0x00,0x00,
- /*-- 文字: 您 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x90,0x00,0x90,0x00,0xC8,0x3F,0x48,0x20,0x2C,0x12,0x9A,0x02,0x89,0x0A,0x48,0x32,
- 0x28,0x22,0x88,0x02,0x08,0x01,0x40,0x00,0x8A,0x21,0x0A,0x49,0x09,0x48,0xF0,0x0F
- };
- /*-----------------------------------------------
- 向595写入一个字节 单红色
- ------------------------------------------------*/
- void InputByte( unsigned char DataR1) //写一个字节
- {
- unsigned char i;
- for(i=8; i>0; i--)
- {
- R1 = !(DataR1&0x01);
- T_CLK = 0;
- T_CLK = 1;
- DataR1 = DataR1 >> 1;
- }
- }
- /*-----------------------------------------------
- 向595写入两个字节 双色
- ------------------------------------------------*/
- void Input2Byte( unsigned char DataR1,unsigned char DataG1) //写一个字节
- {
- unsigned char 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 Init_Timer1(void)
- {
- TMOD |= 0x10;
- EA=1; //总中断使能
- ET1=1; //定时中断使能
- TR1=1; //打开定时器开关
- }
- /*-----------------------------------------------
- 主程序
- ------------------------------------------------*/
- main()
- {
- unsigned char l=0;
- Init_Timer1(); //初始化定时器
- while(1)
- {
- //可以加入其它的控制程序
- if(K1==0) oo=0;
- if(K2==0) oo=1,kk=0;
- if(K3==0) oo=2,j=0;
- l++;
- if(l==250) j++,l=0,kk+=2; //l 速度控制
- if(j==9) j=0;
- if(kk==255) kk=0;
- }
- }
- /*-----------------------------------------------
- 定时器执行动态扫描
- ------------------------------------------------*/
- void Timer1_isr(void) interrupt 3
- {
- unsigned char i;
- TH1=0xff; //重装初值
- TL1=0;
- T_STR=0; //锁存释放
- switch(oo)
- {
- case 0: {
- InputByte(hztest[0][i]);
- InputByte(hztest[0][i+1]);
- }
- break;
- case 1: {
- InputByte(hztest1[0][i+kk]);
- InputByte(hztest1[0][i+kk+1]);
- }
- break;
- case 2: {
- InputByte(hztest2[j/3][i]);
- InputByte(hztest2[j/3][i+1]);
- }
- break;
- }
- OE=1; //暂时关闭屏幕,防止出现鬼影,如果没有使用该引脚控制则会出现拖影现象。
- T_STR=1; //锁存有效,此时一行的数据显示到屏上
- P0=DIS[count]|0xf0;//用P0口的前4位控制16行,屏内部通过4-16译码器工作,循环扫描其他15行
- OE=0;//使能
- count++;
- i+=2; //累加调用下一行数据
- if(count==16)
- count=0;
- if(i==32)
- i=0;
- }
复制代码
所有资料51hei提供下载:
单片机原理与应用51hei设计.zip
(1009.6 KB, 下载次数: 131)
|