?? 16×16 c52.c
字號:
//proteus仿真論壇:http://proteus.5d6d.com
#include <AT89X52.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define BLKN 2 /*列存貯器數,表示8*8led組合的行數*/
sbit E1 =P3^4; //74HC154(18)-E1 為0開列(col)輸出 顯示允許控制信號端口
sbit ST_CP =P3^2; //74HC595(12)-ST_CP 上升沿--移位寄存器的數據進入數據存儲寄存器 輸出鎖存器的時鐘信號端口
sbit MR =P3^3; //74HC595(10)-MR 為0將移位寄存器的數據清0
void delay(unsigned int); //延時函數
uchar data dispram[32]; //顯示緩存
uchar code bmp[][32]={ //字模表
//{
//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,0x08,0x00,0x08,0xF8,0x0B,0x28,0x09,0x29,0x09,0x2E,0x09,0x2A,0x09,0xF8,0xFF,
0x28,0x09,0x2C,0x09,0x2B,0x09,0x2A,0x09,0xF8,0x0B,0x00,0x08,0x00,0x08,0x00,0x00,/*"單",2*/
},{
0x00,0x80,0x00,0x40,0x00,0x30,0xFE,0x0F,0x10,0x01,0x10,0x01,0x10,0x01,0x10,0x01,
0x10,0x01,0x1F,0x01,0x10,0x01,0x10,0xFF,0x10,0x00,0x18,0x00,0x10,0x00,0x00,0x00,/*"片",3*/
},{
0x08,0x04,0x08,0x03,0xC8,0x00,0xFF,0xFF,0x48,0x00,0x88,0x41,0x08,0x30,0x00,0x0C,
0xFE,0x03,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x3F,0x00,0x40,0x00,0x78,0x00,0x00,/*"機",4*/
},{
0x40,0x00,0x20,0x00,0x10,0x00,0xEC,0x7F,0x07,0x40,0x0A,0x20,0x08,0x18,0x08,0x06,
0xF9,0x01,0x8A,0x10,0x8E,0x20,0x88,0x40,0x88,0x20,0xCC,0x1F,0x88,0x00,0x00,0x00,/*"仿",5*/
},{
0x00,0x10,0x04,0x90,0x04,0x90,0x04,0x50,0xF4,0x5F,0x54,0x35,0x5C,0x15,0x57,0x15,
0x54,0x15,0x54,0x35,0x54,0x55,0xF4,0x5F,0x04,0x90,0x06,0x90,0x04,0x10,0x00,0x00,/*"真",6*/
} };
void main( )
{
uchar num,cur,tmp,nums=sizeof(bmp)/32;
//num:當前顯示的文字塊指針
//cur:當前文字塊的斷碼指針(bmp)
//tmp:臨時變量
//nums:總文字塊數
SCON = 0x00; //串口工作模式0;移位寄存器方式
TMOD = 0x01; //定時器T0工作方式1:16位方式
TR0 = 1; //T1
P1 = 0x3f; //
IE = 0x82; //中斷允許設置
while (1)
{
delay(1000); //2種效果之間的停頓
// for(tmp=0;tmp<1;tmp++) //讓卷動效果只顯示一次
{
//delay(2000); //延時2s 一條標語滾動一次前的延時時間
delay(100);
for(num=0;num<nums;num++)
{
for(cur=0;cur<32;cur++) //顯示效果:卷簾出
{
dispram[cur]=bmp[num][cur];
if((cur % 2)==1)
delay(100);
}
delay(100);
}
}
delay(1000); //2種效果之間的停頓
// for(tmp=0;tmp<1;tmp++) //讓卷動效果只顯示一次
{
//delay(2000); //延時2s 一條標語滾動一次前的延時時間
delay(100);
for(num=0;num<nums;num++)
{
for(cur=31;cur<0xff;cur--)//顯示效果:卷簾入 當cur為0時,再循環一次就為0xff
{
dispram[cur]=bmp[num][cur];
if((cur % 2)==0)
delay(100);
}
delay(100);
}
}
}
}
///////延時函數
void delay(uint dt)
{
uchar bt;
for(;dt;dt--)
for(bt=0;bt<255;bt++);
}
//////////顯示屏掃描(定時器T0中斷)函數
void leddisplay(void) interrupt 1 using 1
{
static uchar col=0;
TH0 = 0xF8; //設定顯示屏刷新率62.5幀/S
TL0 = 0x30;
MR=0; //清理行輸出,將移位寄存器的數據清0
MR=1;
SBUF = dispram[col*2]; //送顯示數據
while(TI==0); //等待發送完畢
T1 = 0;
SBUF = dispram[col*2+1]; //送顯示數據
while(TI==0); //等待發送完畢
T1 = 0;
E1 = 1; //消隱(關閉顯示)
P1 = 0xF0; //行號端口清0 多余2行,但是去掉后不行
P1 = 0xF0; //行號端口清0
E1 = 0; //打開顯示
ST_CP =1; //顯示數據打入輸出鎖存器
ST_CP = 0; //鎖存顯示數據
P1 = col; //寫入行號
col=(col+1)%16;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -