標(biāo)題:
單片機(jī)16x16點(diǎn)陣顯示漢字程序 左右移動(dòng),可快慢,暫停
[打印本頁]
作者:
想后看開
時(shí)間:
2022-11-21 11:53
標(biāo)題:
單片機(jī)16x16點(diǎn)陣顯示漢字程序 左右移動(dòng),可快慢,暫停
#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; 此字體下對應(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; 此字體下對應(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; //開啟定時(shí)器0
ET0 = 1; //允許定時(shí)器0中斷
EA = 1; //開啟全局中斷
}
//按鍵
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ù)帶松手檢測,按下鍵返回一次鍵值后返回0,直至第二次按鍵按下
//========================================================================
u8 Key_Scan()
{
static u8 key_up=1;//按鍵按松開標(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;// 無按鍵按下
}
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; //開啟定時(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ù)制代碼
作者:
heicad
時(shí)間:
2022-11-21 15:18
電路是如何連接的?樓主能介紹一下嗎?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1