16×16點陣模塊仿真-按鍵暫停版仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (26.75 KB, 下載次數: 26)
下載附件
2019-1-12 03:33 上傳
0.png (18.41 KB, 下載次數: 16)
下載附件
2019-1-12 03:36 上傳
取模方式:
0.jpg (43.41 KB, 下載次數: 20)
下載附件
2019-1-12 03:33 上傳
單片機源程序如下:
- #include "main.h"
- #include <intrins.h>
- #define Display_Num_Word 1 //液晶能顯示的漢字個數
- unsigned char Display_Buffer[2];
- unsigned char Display_Swap_Buffer[Display_Num_Word][32]={0}; //顯示緩沖區
- bit Shift_Bit = 0;
- bit Flag_Shift = 0;
- #define Shift_Speed 5 //移動速度
- unsigned char Timer0_Count = 0;
- unsigned char temp = 0x80;
- unsigned char Shift_Count = 0;
- unsigned char Display_Word_Count = 0;
- sbit Pause=P3^7;
- #define Num_Of_Word 8
- unsigned char code Word[Num_Of_Word][32] =
- {
- 0xDF,0xEC,0xED,0x05,0xF5,0xED,0xEC,0xC7,0xAB,0x6B,0xEF,0xEE,0xEE,0xED,0xEB,0xE7,
- 0xFF,0x03,0xFB,0xFB,0xFB,0xFB,0x03,0x6F,0x6F,0x6F,0x6F,0xED,0xED,0xED,0xF1,0xFF,/*"祝",0*/
- 0xFD,0xFD,0xC0,0xFD,0xFD,0x00,0xFE,0xFD,0xF3,0xE7,0xD0,0xB7,0x77,0xF7,0xF8,0xFF,
- 0xFF,0xF7,0x2F,0xDF,0xBF,0x01,0xFF,0xFF,0xEF,0x1F,0xFF,0xF7,0xF7,0xF7,0x07,0xFF,/*"老",1*/
- 0xF7,0xF4,0xB7,0xB7,0xB7,0xB6,0xB6,0xB6,0xB6,0xB6,0xB6,0xF6,0xEE,0xEF,0xDF,0xBF,
- 0xFF,0x01,0xDF,0xDF,0xDF,0x03,0xDB,0xDB,0xDB,0xDB,0xDB,0xCB,0xD7,0xDF,0xDF,0xDF,/*"師",2*/
- 0xEF,0xF7,0x80,0xFF,0xDD,0xEB,0x00,0xF7,0xF7,0x80,0xF7,0xD5,0xB6,0x77,0xD7,0xEE,
- 0xFF,0xFB,0x87,0xBF,0xBF,0xBF,0x81,0xB7,0xB7,0xB7,0xB7,0xB7,0xB7,0x77,0x77,0xF7,/*"新",3*/
- 0xEF,0xEF,0xE0,0xDF,0xDF,0xBF,0xE0,0xEF,0xEF,0xEF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0x03,0x7F,0x7F,0x7F,0x07,0x7F,0x7F,0x7F,0x01,0x7F,0x7F,0x7F,0x7F,0x7F,/*"年",4*/
- 0xEF,0xEF,0xEF,0xEC,0xE7,0xAB,0xAF,0xAF,0x68,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xEB,
- 0xBF,0xBF,0xBF,0x07,0xB7,0xB7,0xB7,0xB7,0x01,0xBF,0x5F,0x5F,0xEF,0xEF,0xF7,0xF9,/*"快",5*/
- 0xFF,0xFF,0xE0,0xEF,0xEE,0xDE,0xDE,0xC0,0xFE,0xF6,0xF6,0xEE,0xDE,0xBE,0xFA,0xFD,
- 0xDF,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xFF,0xDF,0xEF,0xF7,0xFB,0xFB,0xFF,0xFF,/*"樂",6*/
- 0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"!",7*/
- };
- //************************************************************
- //主函數
- //************************************************************
- void delay(unsigned int z)
- {
- unsigned int i,j;
- for(i=0; i<z; i++)
- for(j = 0; j < 110; j++);
- }
-
-
-
- void main()
- {
- Init_Timer0();
- Clear_Display();
- while(1)
- {
- if(Pause==0) //暫停鍵
- {
- delay(10);
- if(Pause==0)
- {
- TR0=~TR0;
- }while(Pause==0);
- }
- Display(Display_Swap_Buffer);
- if(Flag_Shift == 1)
- {
- Flag_Shift = 0;
- Display_Word_Count = Shift_Count/16; //計算當前顯示第幾個字
- Calc_Shift();
-
- Shift_Count++;
-
- if(Shift_Count == (Num_Of_Word+1)*16 ) //移動次數
- {
- Shift_Count = 0;
- }
- }
- }
- }
- //****************************************************
- //初始化定時器0
- //****************************************************
- void Init_Timer0()
- {
- TMOD = 0X01; //T0, 工作模式1
- TH0 = (65536 - 50000)/256;
- TL0 = (65536 - 50000)%256;
- TR0 = 1; //開啟定時器
- ET0 = 1; //開啟定時器中斷
- EA = 1; //開啟總中斷
- }
- //****************************************************
- //中斷函數
- //****************************************************
- void Timer0() interrupt 1
- {
- TH0 = (65536 - 50000)/256;
- TL0 = (65536 - 50000)%256;
-
- TF0 = 0;
- Timer0_Count++;
- if(Timer0_Count >= Shift_Speed)
- {
- Timer0_Count = 0;
- Flag_Shift = 1;
- }
- }
- //************************************************************
- //計算移動數據,存在在緩沖器
- //************************************************************
- void Calc_Shift()
- {
- unsigned char i;
- for(i = 0;i < 16;i++)
- {
- if((Display_Swap_Buffer[0][16+i]&0x80) == 0) //前8位 移位
- {
- Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)&0xfe; //最低位清零
- }
- else
- {
- Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)|0x01; //最低位置一
- }
- if(Shift_Count%16 < 8 && Display_Word_Count < Num_Of_Word)
- {
- Shift_Bit = Word[Display_Word_Count][i]&temp;
- }
- else if(Shift_Count%16 < 16 && Display_Word_Count < Num_Of_Word)
- {
- Shift_Bit = Word[Display_Word_Count][16+i]&temp;
- }
- else
- {
- Shift_Bit = 1; //把字移出緩沖區
- }
- if( Shift_Bit == 0) //后8位移位
- {
- Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)&0xfe; //最低位清零
- }
- else
- {
- Shift_Bit = 1;
- Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)|0x01; //最低位置一
- }
-
- }
- temp = (temp>>1)&0x7f;
- if(temp == 0x00)
- {
- temp = 0x80;
- }
- }
- //************************************************************
- //清空緩沖區
- //************************************************************
- void Clear_Display()
- {
- unsigned char i,j;
- for(j = 0 ; j < Display_Num_Word; j++)
- {
- for(i = 0 ; i < 32 ;i++)
- {
- Display_Swap_Buffer[j][i] = 0xff; //0=顯示 1=不顯示
- }
- }
- }
- //************************************************************
- //num為字數 dat[][32]為字模的名稱
- //*************************************************************
- void Display(unsigned char dat[][32])
- {
- unsigned char i,j;
- for( i = 0 ; i < 16 ; i++ )
- {
- LEDARRAY_G = 1; //更新數據時候關閉顯示。等更新完數據,打開138顯示行。防止重影。
- Display_Buffer[0] = dat[0][i];
- Display_Buffer[1] = dat[0][i+16];
- Send(Display_Buffer[1]);
- Send(Display_Buffer[0]);
- LEDARRAY_LAT = 1; //鎖存數據
- _nop_();
-
- LEDARRAY_LAT = 0;
- _nop_();
- Scan_Line(i); //選擇第i行
- LEDARRAY_G = 0;
-
- for( j = 0 ; j < 100 ; j++); //延時一段時間,讓LED亮起來。
- }
- }
- //****************************************************
- //掃描某一行
- //****************************************************
- void Scan_Line( unsigned char m)
- {
- switch(m)
- {
- case 0:
- LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 0;
- break;
- case 1:
- LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 1;
- break;
- case 2:
- LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 0;
- break;
- case 3:
- LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 1;
- break;
- case 4:
- LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 0;
- break;
- case 5:
- LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 1;
- break;
- case 6:
- LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 0;
- break;
- case 7:
- LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 1;
- break;
- case 8:
- LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 0;
- break;
- case 9:
- LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 1;
- break;
- case 10:
- LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 0;
- break;
- case 11:
- LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 1;
- break;
- case 12:
- LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 0;
- break;
- case 13:
- LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 1;
- break;
- case 14:
- LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 0;
- break;
- case 15:
- LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 1;
- break;
- default : break;
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
16×16點陣模塊仿真-按鍵暫停版.rar
(1.79 MB, 下載次數: 57)
2019-1-11 17:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|