使用四塊8×8的點陣拼成16×16的點陣,用了兩個譯碼器,只設置了三個字(改字可以用字模轉換器)按鍵控制左移、右移、暫停、啟動。
電路原理圖如下:
51hei.png (49.31 KB, 下載次數: 41)
下載附件
2020-5-29 01:53 上傳
單片機源程序如下:
- /************************************************
- 16x16點陣漢字滾動顯示
- ************************************************/
- #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; //啟動或暫停按鍵
- sbit k2=P3^7; //改變方向按鍵
- bit fx=0; //滾動方向
- 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,
- };
- //===================函數聲明====================
- void T0_Init(); //定時器0初始化
- void delayus(uint us); //延時函數
- void keyscan(); //按鍵掃描函數
- //====================主程序=====================
- void main()
- {
- uchar i,j;
- T0_Init(); //定時器0初始化
- while(1)
- {
- keyscan(); //按鍵掃描
- for(i=0;i<16;i++) //點陣16列
- {
- LA=i&0x01; //用級聯138進行列選
- LB=i&0x02;
- LC=i&0x04;
- LD=i&0x08;
- j=index+i; //定位當前要顯示的列
- P0=hztab[j*2+1]; //發送點陣數據
- P2=hztab[j*2]; //共兩個字節
- delayus(100); //延時
- P0=P2=0x00; //消影
- }
- delayus(100); //延時
- }
- }
- //=================定時器0初始化=================
- void T0_Init()
- {
- TMOD=0x01; //定時器0,工作方式1
- TH0=(65536-10000)/256; //定數器初值
- TL0=(65536-10000)%256; //10ms定時
- ET0=1; //打開定時器0中斷允許
- EA=1; //打開總中斷允許
- TR0=0; //暫不啟動定時器0
- }
- //===============定時中斷0服務程序===============
- void timer0() interrupt 1
- {
- static uchar tick=0; //嘀嗒計時
- TH0=(65536-10000)/256; //重裝裝初值
- TL0=(65536-10000)%256; //10ms定時
- tick++; //計數
- if(tick==5) //5次
- {
- tick=0; //清0
- if(fx==0)index=(index+1)%64; //若方向為左移,則掃描線加1
- else index=(index-1+64)%64; //否則掃描線減1
- }
- }
- //===================延時函數====================
- void delayus(uint us)
- {
- while(us--);
- }
- //=================按鍵掃描函數==================
- void keyscan()
- {
- if(k1==0) //檢測k1是否按下
- {
- delayus(100); //延時消抖
- if(k1==0) //確認k1被按下
- {
- TR0=~TR0; //定時器啟停反轉
- while(k1==0); //等待按鍵松開
- }
- }
- if(k2==0) //檢測k2是否按下
- {
- delayus(100); //延時消抖
- if(k2==0) //確認k2被按下
- {
- fx=~fx; //方向反轉
- while(k2==0); //等待按鍵松開
- }
- }
- }
復制代碼
所有資料51hei提供下載:
16×16點陣.zip
(22.41 KB, 下載次數: 59)
2020-5-28 02:30 上傳
點擊文件名下載附件
源碼+原理圖 下載積分: 黑幣 -5
|