闲时就准备一些外设,编个程序练练C语言。春节是个大好时光。
买了16X32的点阵套件,动手焊了一块显示屏,配合一个单片机开发板,搭了一个显示系统。
这个系统关键是程序。买套件时有附了一些示范程序。感觉太复杂,自己动手编了一个。调试
成功,拿出来大家分享一下。视频
单片机源程序如下:
- /* 白居易 长恨歌
- 标准08接口点阵屏管脚定义
- GND A ABCD是行扫描信号
- GND B
- GND C
- OE D OE是屏的使能端 低有效
- R1 G1 上半屏绿色
- R2 G2 下半屏绿色 本板由于没有使用R2 G2,故把这两脚改接为VCC,方便大家接线。
- GND STR 锁存信号
- GND SCK 时钟信号
- */
- /*接口说明*/
- //A B C D 是138行扫描信号
- // SCK 是595的移位信号
- // STR 是595的锁存信号
- // OE 是屏的使能端 可以控制亮度
- // R 是红色信号线
- // G 是绿色信号线
- // 本板由于没有使用R2 G2,故把这两脚改接为VCC,方便大家接线。
- #include<reg52.h>
- #include<intrins.h>
- #include<stdio.h>
- #define u8 unsigned char
- #define u16 unsigned int
-
- /*****************************接口定义********************************/
- sbit sck=P0^1;//595的移位信号
- sbit str=P0^2;//是595的锁存信号
- sbit sda_r=P2^7;//红数据
- sbit sda_g=P0^4;//绿数据
- sbit OE=P0^5;//输出使能
- sbit sign=P0^7;//检测用LED
- sbit IA=P2^0;//行控制线A
- sbit IB=P2^1;//行控制线B
- sbit IC=P2^2;//行控制线C
- sbit ID=P2^3;//行控制线D
- /********************************************************************/
-
- #define scan0 {IA=0;IB=0;IC=0;ID=0;}
- #define scan1 {IA=1;IB=0;IC=0;ID=0;}
- #define scan2 {IA=0;IB=1;IC=0;ID=0;}
- #define scan3 {IA=1;IB=1;IC=0;ID=0;}
- #define scan4 {IA=0;IB=0;IC=1;ID=0;}
- #define scan5 {IA=1;IB=0;IC=1;ID=0;}
- #define scan6 {IA=0;IB=1;IC=1;ID=0;}
- #define scan7 {IA=1;IB=1;IC=1;ID=0;}
- #define scan8 {IA=0;IB=0;IC=0;ID=1;}
- #define scan9 {IA=1;IB=0;IC=0;ID=1;}
- #define scan10 {IA=0;IB=1;IC=0;ID=1;}
- #define scan11 {IA=1;IB=1;IC=0;ID=1;}
- #define scan12 {IA=0;IB=0;IC=1;ID=1;}
- #define scan13 {IA=1;IB=0;IC=1;ID=1;}
- #define scan14 {IA=0;IB=1;IC=1;ID=1;}
- #define scan15 {IA=1;IB=1;IC=1;ID=1;}
- u16 adj,kk;
- u8 x,y;//
- u8 line,k; //line变量被多个函数调用
- u8 code ziku[];
- u8 buff_all[16][6];//对字库里面的字重新排序缓存,
- u8 buff[4]; //行缓存
- u8 buff_1[6];//数据移位缓存
- /******************************************************/
- u16 zishu=977;// 输入目前字库中字的个数!!!!!!!!!!!!!!!!!!!!!!!!!
- /********************************************************/
- void rxd_data(); // 发送数据
- void load_data();
- void scan(u8 Value)
- {switch(Value)
- {case 0: scan0;break;
- case 1: scan1;break;
- case 2: scan2;break;
- case 3: scan3;break;
- case 4: scan4;break;
- case 5: scan5;break;
- case 6: scan6;break;
- case 7: scan7;break;
- case 8: scan8;break;
- case 9: scan9;break;
- case 10:scan10;break;
- case 11:scan11;break;
- case 12:scan12;break;
- case 13:scan13;break;
- case 14:scan14;break;
- case 15:scan15;break;
- default:break;
- }
- }
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /****************字库字按显示顺序调序放入2维数组缓存中,便于显示时调取 */
- void adj_ziku()
- {
- u8 w,v;
- v=zishu*2;
- for(y=0;y<16;y++)
- {
- for(x=0;x<6;x++) //zhuang 3 ge zi
- {
- w=x/2;//除2取整
- buff_all[y][x]=ziku[adj*32+2*y+32*w+x%2];
- }
- }
-
- } //ok
-
- /*主函数*/
- void main()
- {
- u8 del;
- u16 count ;//字库输入后要更改,循环次数=(zishu/2-1 )*16
-
- while(1)
- {
- adj=0;//这个很重要,否则不会从0开始??原因不明
- count=zishu*16+1-32 ;
- delay(50000);
- delay(50000);
- for(kk=0;kk<zishu-2;kk++)
- {
- for(k=0;k<16;k++) //走完一个字
- {
- for(del=0;del<1;del++) //一帧停留时间控制
- {
- adj_ziku();
- for(line=0;line<16;line++)
- {
- load_data();
- rxd_data();
- scan(line);
- str=1; //595锁存
- str=0;
- OE=0; //各相应位输出
- delay(15); //数值大,亮度高,但会闪烁
- OE=1;//关闭595输出(都为HIGH)
- }
- }
- // delay(501);
- }
- adj++;
- }
- adj=0;
- }
- }
- /**********************************************************/
- void load_data(void) //装每行的4个字节到缓存buff中
- { u8 q1,q3,q4,n;
- q3=k/8; q4=k%8;
- for(q1=0;q1<6;q1++) //预装3个字
- {
- buff_1[q1]=buff_all[line][q3+q1];
- }
- if(q4==0)
- {
- for(n=0;n<4;n++)
- {buff[n]=buff_1[n]; }
- }
- else
- {
- for(n=0;n<4;n++)
- {
- buff[n]=(buff_1[n]<<q4)|(buff_1[n+1]>>(8-q4));
- }
- }
- }
- /***********************发送数据****************************/
- void rxd_data(void) //串行发送数据
- {
- u8 s;
- u8 temp,k;
-
- for(s=0;s<4;s++) //发送4字节数据
- {
- temp=buff[s];
- temp=~temp;//取反才能字亮背景暗
- for(k=0;k<8;k++)//一个字节8位 发送给595
- {
- sck=0; //上升沿移位595
- sda_g=temp>>7; //先送最高位,
- temp<<=1;
- sck=1;
- }
- }
- }
- //字库
- u8 code ziku[]={
- /*-- 文字: 《 --*/
- /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x00,0x10,0x00,0x24,0x00,0x48,0x00,0x90,0x01,0x20,0x02,0x40,0x04,0x80,0x09,0x00,
- 0x04,0x80,0x02,0x40,0x01,0x20,0x00,0x90,0x00,0x48,0x00,0x24,0x00,0x10,0x00,0x00,
- /*-- 文字: 长 --*/
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有程序51hei提供下载:
多字左移测试.rar
(19.4 KB, 下载次数: 20)
|