|
- #include<reg52.h>
- #define uint unsigned int
- #define u16 unsigned int
- #define uchar unsigned char
- #define u8 unsigned char
- sbit H_stcp = P2^6; //輸出時(shí)鐘線
- sbit H_shcp = P2^7; //HC595芯片輸入時(shí)鐘線
- sbit H_ds = P2^5; //數(shù)據(jù)線
- sbit HC138_A0 = P2^0; //
- sbit HC138_A1 = P2^1; //
- sbit HC138_A2 = P2^2; //
- sbit HC138_A3 = P2^3; //
- u16 volatile W_BCNT; //顯示字標(biāo)志
- u8 volatile W_LCNT; //顯示位移標(biāo)志
- u8 speed=5; //移動(dòng)速度
- #define WORDNUM 8
- unsigned char code Word[WORDNUM][32] = {
- {0x00,0x00,0x31,0x2A,0x24,0x20,0x2F,0x20,0xE6,0x11,0x08,0xC4,0x3F,0x10,0x08,0x04,
- 0x00,0x06,0x88,0x00,0x07,0x01,0xC1,0x21,0x4D,0x11,0x81,0x01,0xEE,0x00,0x0C,0x02},/*"您",3*/
- {0x00,0x02,0x02,0x22,0x22,0x2A,0x26,0x22,0x63,0xA2,0x26,0x2A,0x22,0x22,0x02,0x02,
- 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x00},/*"辛",4*/
- {0x00,0x21,0x21,0x21,0x21,0xF9,0x21,0x21,0x2F,0x21,0x21,0xF9,0x21,0x21,0x21,0x21,
- 0x00,0x00,0x00,0x00,0x3F,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x3F,0x00,0x00,0x00},/*"苦",5*/
- {0x00,0x00,0x00,0x40,0x60,0x50,0x48,0x44,0x47,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0x02,0x00,0x00,0x00,0x00,0x00},/*"了",6*/
- /*-- 文字: 軍 --*/
- /*-- 宋體12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
- {0x00,0x00,0x78,0x44,0x4B,0x70,0x49,0x44,0x00,0x07,0x34,0x2F,0xE4,0x37,0x08,0x04,
- 0x00,0x10,0x90,0x90,0xFF,0x90,0x90,0x50,0x00,0xFF,0x91,0xFC,0x90,0xF8,0x06,0x01},
- /*-- 文字: 放 --*/
- /*-- 宋體12; 此字體下對(duì)應(yīng)的點(diǎn)陣為:寬x高=16x16 --*/
- {0x00,0x08,0x08,0x0F,0x08,0x08,0xE8,0x1B,0x04,0x12,0x13,0x12,0x52,0x9F,0x10,0x10,
- 0x00,0x01,0x02,0x84,0x68,0x10,0x68,0x84,0x02,0x01,0xFC,0x02,0x04,0xF0,0x0C,0x02},
- {0x00,0x60,0x50,0x44,0x44,0x44,0x44,0x44,0x45,0x5C,0x46,0x45,0x44,0x44,0x60,0x10,
- 0x00,0x08,0x08,0x48,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0xC8,0x48,0x08,0x08},
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0x00,0x00,0x00},/*"!",7*/
- };
- unsigned char WordTemp[32] = {
- 0x01,0x01,0x61,0x71,0x19,0x0D,0x05,0xFF,0xFF,0x01,0x7D,0x7C,0x44,0x47,0x47,0x40,
- 0x02,0x06,0x0C,0x18,0x70,0xE4,0x86,0xFF,0xFF,0x00,0x7C,0x7E,0x43,0xC3,0xC2,0x00,
- };
- /*************************/
- //延時(shí)函數(shù)
- /*************************/
- void delay_ms(uint xms)
- {
- uint i, j;
- for(i = xms; i > 0; i--)
- for(j = 118; j > 0; j--);
- }
- #define HC595_QA 0x80
- #define HC595_QB 0x20
- #define HC595_QC 0x04
- #define HC595_QD 0x01
- #define HC595_QE 0x10
- #define HC595_QF 0x40
- #define HC595_QG 0x02
- #define HC595_QH 0x08
- void sendbyte_All(u8 group1,u8 group2) //利用HC595輸出
- {
- u8 z;
- for(z = 0; z < 8; z++) //循環(huán)8次移入數(shù)據(jù)
- {
- H_shcp = 0;
- switch(z)
- {
- case 0:H_ds = group2 & HC595_QH;break;
- case 1:H_ds = group2 & HC595_QG;break;
- case 2:H_ds = group2 & HC595_QF;break;
- case 3:H_ds = group2 & HC595_QE;break;
- case 4:H_ds = group2 & HC595_QD;break;
- case 5:H_ds = group2 & HC595_QC;break;
- case 6:H_ds = group2 & HC595_QB;break;
- case 7:H_ds = group2 & HC595_QA;break;
- }
- H_shcp = 1; //上升沿輸入數(shù)據(jù)
- }
- for(z = 0; z < 8; z++) //循環(huán)8次移入數(shù)據(jù)
- {
- H_shcp = 0;
- switch(z)
- {
- case 0:H_ds = group1 & HC595_QH;break;
- case 1:H_ds = group1 & HC595_QG;break;
- case 2:H_ds = group1 & HC595_QF;break;
- case 3:H_ds = group1 & HC595_QE;break;
- case 4:H_ds = group1 & HC595_QD;break;
- case 5:H_ds = group1 & HC595_QC;break;
- case 6:H_ds = group1 & HC595_QB;break;
- case 7:H_ds = group1 & HC595_QA;break;
- }
- H_shcp = 1; //上升沿輸入數(shù)據(jù)
- }
- H_stcp = 0;
- H_stcp = 1; //上升沿使數(shù)據(jù)并行輸出
- }
- void HC138Out(u8 i,u8 l)
- {
- u8 j;
- switch(i)
- {
- case 7:j=5;break;
- case 6:j=2;break;
- case 5:j=1;break;
- case 4:j=7;break;
- case 3:j=0;break;
- case 2:j=6;break;
- case 1:j=4;break;
- case 0:j=3;break;
- }
- HC138_A0 = j&0x01;
- HC138_A1 = j&0x02;
- HC138_A2 = j&0x04;
- if(l)
- HC138_A3=0;
- else
- HC138_A3=1;
- }
- void WordDisplay(u8 *word)
- {
- uchar i;
- for(i = 0; i < 8; i++)
- {
- sendbyte_All(0,0); //消影
- HC138Out(i,0);
- sendbyte_All(*(word+i),*(word+i+8)); //輸出信息
- }
- for(i = 0; i < 8; i++)
- {
- sendbyte_All(0,0); //消影
- HC138Out(i,1);
- sendbyte_All(*(word+i+16),*(word+i+24)); //輸出信息
- }
- }
- /*********************定時(shí)器0、定時(shí)器1初始化******************/
- void time0_init()
- {
- TMOD = 0x01; //設(shè)置定時(shí)器0為工作模式1 (16-bit)
- TL0 = 15536; //給定時(shí)器低位賦初始值 65536-15536=50000us=50ms,即50ms一個(gè)中斷
- TH0 = 15536 >> 8; //給定時(shí)器高位賦初始值
- TR0 = 1; //開(kāi)啟定時(shí)器0
- ET0 = 1; //允許定時(shí)器0中斷
- EA = 1; //開(kāi)啟全局中斷
- }
- //按鍵
- sbit Key1=P1^3; //設(shè)置鍵
- sbit Key2=P1^4; //加按鍵
- sbit Key3=P3^2; //減按鍵
- sbit Key4=P3^3; //交通管制鍵
- //========================================================================
- // 函數(shù): u8 Key_Scan()
- // 應(yīng)用: temp=u8 Key_Scan();
- // 描述: 按鍵掃描并返回按下的鍵值
- // 參數(shù): NONE
- // 返回: 按下的鍵值
- // 版本: VER1.0
- // 日期: 2015-05-29
- // 備注: 該函數(shù)帶松手檢測(cè),按下鍵返回一次鍵值后返回0,直至第二次按鍵按下
- //========================================================================
- u8 Key_Scan()
- {
- static u8 key_up=1;//按鍵按松開(kāi)標(biāo)志
- if(key_up&&(Key1==0||Key2==0||Key3==0||Key4==0))
- {
- delay_ms(10);//去抖動(dòng)
- key_up=0;
- if(Key1==0) return 1;
- else if(Key2==0)return 2;
- else if(Key3==0)return 3;
- else if(Key4==0)return 4;
- }
- else if(Key1==1&&Key2==1&&Key3==1&&Key4==1)
- key_up=1;
- return 0;// 無(wú)按鍵按下
- }
- void main()
- {
- uchar key_can; //按鍵值
- uchar mode=0; //模式
- uchar modej=0; //模式
- uchar i;
- time0_init();
- while(1)
- {
- key_can=Key_Scan();
- if(1==key_can)
- {
- TR0 = 1; //開(kāi)啟定時(shí)器0
- if(modej) //判斷暫停標(biāo)志,此處處理是為了防止暫停再啟動(dòng)方向會(huì)變
- {
- modej=0;
- mode++;
- if(mode>=2)
- {
- mode=0;
- }
- }
- mode++;
- if(mode>=2)
- {
- mode=0;
- }
- }
- if(2==key_can)
- {
- TR0 = 0; //關(guān)閉定時(shí)器0,暫停
- modej=1; //暫停標(biāo)志
- }
- if(4==key_can)
- {
- speed+=1; //速度加1
- }
- if(3==key_can)
- {
- speed-=1; //速度減1
- if(speed==0)
- speed=1;
- }
- if(1==mode)//往右移
- {
- for(i = 0; i < 16-W_LCNT; i++)
- {
- WordTemp[i]=Word[W_BCNT][i+W_LCNT];
- };
- for(i = 0; i <W_LCNT ; i++)
- {
- WordTemp[i+16-W_LCNT]=Word[W_BCNT+1][i];
- };
- for(i = 16; i < 32-W_LCNT; i++)
- {
- WordTemp[i]=Word[W_BCNT][i+W_LCNT];
- };
- for(i = 16; i <16+W_LCNT ; i++)
- {
- WordTemp[i+16-W_LCNT]=Word[W_BCNT+1][i];
- };
- }
-
- if(0==mode)//往左移
- {
- for(i = 0; i < 16-W_LCNT; i++)
- {
- WordTemp[i+W_LCNT]=Word[W_BCNT][i];
- };
- for(i = 0; i < W_LCNT ; i++)
- {
- WordTemp[i]=Word[W_BCNT+1][16-W_LCNT+i];
- };
- for(i = 16; i < 32-W_LCNT; i++)
- {
- WordTemp[i+W_LCNT]=Word[W_BCNT][i];
- };
- for(i = 16; i <16+W_LCNT ; i++)
- {
- WordTemp[i]=Word[W_BCNT+1][16-W_LCNT+i];
- };
- }
- WordDisplay(WordTemp);
- }
- }
- /*********************定時(shí)器0中斷服務(wù)程序************************/
- void time0_int() interrupt 1
- {
- static uchar volatile value; //定時(shí)10ms中斷一次
- TL0 = 15536; //給定時(shí)器低位重裝初始值 65536-15536=50000us=50ms,即50ms一個(gè)中斷
- TH0 = 15536 >> 8; //給定時(shí)器高位重裝初始值
- value ++;
- if(value >= speed)
- {
- value = 0;
- W_LCNT++;
- if(W_LCNT >= 16)
- {
- W_LCNT=0;
- W_BCNT++;
- if(W_BCNT >= (WORDNUM-1))
- {
- W_BCNT=0;
- }
- }
-
- }
- }
復(fù)制代碼 |
|