使用四塊8×8的點(diǎn)陣拼成16×16的點(diǎn)陣,用了兩個(gè)譯碼器,只設(shè)置了三個(gè)字(改字可以用字模轉(zhuǎn)換器)按鍵控制左移、右移、暫停、啟動(dòng)。
電路原理圖如下:
51hei.png (49.31 KB, 下載次數(shù): 41)
下載附件
2020-5-29 01:53 上傳
單片機(jī)源程序如下:
- /************************************************
- 16x16點(diǎn)陣漢字滾動(dòng)顯示
- ************************************************/
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LA=P1^0; //138譯碼器地址選擇引腳
- sbit LB=P1^1;
- sbit LC=P1^2;
- sbit LD=P1^3;
- sbit k1=P3^6; //啟動(dòng)或暫停按鍵
- sbit k2=P3^7; //改變方向按鍵
- bit fx=0; //滾動(dòng)方向
- uint index=0; //列掃描索引
- uchar code hztab[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空格
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-
- 0x08,0x04,0x10,0x04,0x20,0x24,0x40,0x24,0xfc,0x24,0xa2,0x24,0x22,0xfd,0x22,0x26, //老
- 0x42,0x24,0x42,0x2c,0x42,0x14,0x82,0x24,0x1e,0x44,0x00,0x04,0x00,0x04,0x00,0x00,
-
- 0x00,0x00,0xe1,0x3f,0x02,0x00,0x0c,0x00,0xf0,0xff,0x00,0x00,0x00,0x40,0xf8,0x47, //師
- 0x00,0x44,0x00,0x44,0xff,0x7f,0x10,0x44,0x08,0x44,0xf0,0x47,0x00,0x40,0x00,0x00,
-
- 0x02,0x08,0x44,0x08,0xa8,0x0f,0x10,0xf8,0x68,0x08,0x86,0x0f,0x00,0x00,0x00,0x01, //好
- 0x02,0x41,0x01,0x41,0xfe,0x47,0x00,0x49,0x00,0x51,0x00,0x61,0x00,0x01,0x00,0x00,
-
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空格
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- //===================函數(shù)聲明====================
- void T0_Init(); //定時(shí)器0初始化
- void delayus(uint us); //延時(shí)函數(shù)
- void keyscan(); //按鍵掃描函數(shù)
- //====================主程序=====================
- void main()
- {
- uchar i,j;
- T0_Init(); //定時(shí)器0初始化
- while(1)
- {
- keyscan(); //按鍵掃描
- for(i=0;i<16;i++) //點(diǎn)陣16列
- {
- LA=i&0x01; //用級(jí)聯(lián)138進(jìn)行列選
- LB=i&0x02;
- LC=i&0x04;
- LD=i&0x08;
- j=index+i; //定位當(dāng)前要顯示的列
- P0=hztab[j*2+1]; //發(fā)送點(diǎn)陣數(shù)據(jù)
- P2=hztab[j*2]; //共兩個(gè)字節(jié)
- delayus(100); //延時(shí)
- P0=P2=0x00; //消影
- }
- delayus(100); //延時(shí)
- }
- }
- //=================定時(shí)器0初始化=================
- void T0_Init()
- {
- TMOD=0x01; //定時(shí)器0,工作方式1
- TH0=(65536-10000)/256; //定數(shù)器初值
- TL0=(65536-10000)%256; //10ms定時(shí)
- ET0=1; //打開定時(shí)器0中斷允許
- EA=1; //打開總中斷允許
- TR0=0; //暫不啟動(dòng)定時(shí)器0
- }
- //===============定時(shí)中斷0服務(wù)程序===============
- void timer0() interrupt 1
- {
- static uchar tick=0; //嘀嗒計(jì)時(shí)
- TH0=(65536-10000)/256; //重裝裝初值
- TL0=(65536-10000)%256; //10ms定時(shí)
- tick++; //計(jì)數(shù)
- if(tick==5) //5次
- {
- tick=0; //清0
- if(fx==0)index=(index+1)%64; //若方向?yàn)樽笠疲瑒t掃描線加1
- else index=(index-1+64)%64; //否則掃描線減1
- }
- }
- //===================延時(shí)函數(shù)====================
- void delayus(uint us)
- {
- while(us--);
- }
- //=================按鍵掃描函數(shù)==================
- void keyscan()
- {
- if(k1==0) //檢測(cè)k1是否按下
- {
- delayus(100); //延時(shí)消抖
- if(k1==0) //確認(rèn)k1被按下
- {
- TR0=~TR0; //定時(shí)器啟停反轉(zhuǎn)
- while(k1==0); //等待按鍵松開
- }
- }
- if(k2==0) //檢測(cè)k2是否按下
- {
- delayus(100); //延時(shí)消抖
- if(k2==0) //確認(rèn)k2被按下
- {
- fx=~fx; //方向反轉(zhuǎn)
- while(k2==0); //等待按鍵松開
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
16×16點(diǎn)陣.zip
(22.41 KB, 下載次數(shù): 59)
2020-5-28 02:30 上傳
點(diǎn)擊文件名下載附件
源碼+原理圖 下載積分: 黑幣 -5
|