16×16点阵模块仿真-按键暂停版仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
取模方式:
单片机源程序如下:
- #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)
|