📄 dianzhen.c
字号:
#include"reg51.h"
#include"for51.h"
uchar start;
uchar CS_3_8_0, CS_3_8_1;
void SendData(uchar ddata);//向74HC595发送数据
void DisplayPic(uchar* Pic, uchar num);
void Delayms(uint ticks);
//图片数据
uchar code pic[] = {
/*-- 文字: 中 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,
0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00,
/*-- 空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 国 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00,
/*-- 空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 人 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x01,0x06,0x0C,0x18,0x30,0x60,0x20,0x00,
/*-- 空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 民 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x9E,0x80,0x80,0x00,0x00,
0x00,0x00,0xFF,0x40,0x20,0x10,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0xF0,0x00,0x00,
/*-- 空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 解 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0xF4,0x57,0x54,0xFC,0x54,0xF0,0x42,0xA2,0x1E,0x02,0xA2,0x62,0x3E,0x00,0x00,
0x80,0x7F,0x02,0x02,0x5F,0x82,0x7F,0x0A,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x00,
/*-- 空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 放 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x08,0xF8,0x49,0x4E,0xC8,0x88,0x40,0x38,0xCF,0x0A,0x08,0x88,0x78,0x08,0x00,
0x40,0x30,0x0F,0x40,0x80,0x7F,0x00,0x40,0x20,0x10,0x0B,0x0E,0x31,0x60,0x20,0x00,
/*-- 空格 --*/
//0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 军 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x18,0x26,0x22,0xA2,0x72,0x2E,0xAA,0x22,0x22,0x22,0x32,0x22,0x0A,0x06,0x00,
0x00,0x10,0x10,0x12,0x13,0x12,0x12,0xFF,0x12,0x12,0x12,0x13,0x12,0x18,0x10,0x00,
};
void main(void) {
while(1) {
start = 0;
DisplayPic(pic, 112);//显示pic1
Delayms(10);
}
}
/**************************************************
函数名称: 串行数据发送函数
参数含义: ddata - 字节显示数据
函数功能: 主机向从机发送一个字节串行数据
返 回 值: 无返回
**************************************************/
void SendData(uchar ddata) {
uchar count=0;
for(; count != 8; count++) {
SCK = 0;
if(ddata & 0x80)
MOSI=1; //发送数据
else
MOSI=0;
SCK = 1; //发送时钟
ddata <<= 1; //数据右移一位
}
SS = 0;
SS = 1; //锁存数据
SS = 0;
}
/**************************************************
函数名称: 延时函数
参数含义: 延长时间
函数功能: 延时
返 回 值: 无返回
**************************************************/
void Delayms(uint ticks) {
uchar i;
for(; ticks != 0; ticks--)
for(i = 100; i != 0; i--);
}
/**************************************************
函数名称: 图片显示函数
参数含义: start - 从哪一列开始显示
pic - 图片数据指针
num - 图片数组字节数
函数功能: 从某一列开始显示一副图片
返 回 值: bool类型,正确显示返回TURE,异常返回FALSE
**************************************************/
void DisplayPic(uchar* Pic, uchar num) {
uchar temp_cs0, temp_cs1;
uchar i, j, k;
uchar tempdata;
for(i = 0; i < 32; i++) {//图片从最右边一列移动到最左边一列的显示代码
for(k = 0; k < 10; k++) {
if(i < 8) {//图片从最右边向左移动,所以最开始在最右边
CS_3_8_0 = 3;
CS_3_8_1 = (7 - i) % 8;
}
if(i >= 8 && i < 16) {//当向左移动到第二块范围
CS_3_8_0 = 2;
CS_3_8_1 = (7 - (i - 8)) % 8;
}
if(i >= 16 && i < 24) {//当向左移动到第三块范围
CS_3_8_0 = 1;
CS_3_8_1 = (7 - (i - 16)) % 8;
}
if(i >= 24 && i < 32) {//当向左移动到第四块范围
CS_3_8_0 = 0;
CS_3_8_1 = (7 - (i - 24)) % 8;
}
tempdata = start;//第一排起始数据偏移量
for(j = i; j >= 0; j--) {//显示一副画面的上半部分
if(j == i) {
temp_cs0 = CS_3_8_0;
temp_cs1 = CS_3_8_1;
}
if(((j + 1) % 8 == 0) && j != i) {
CS_3_8_0 += 1;//此点阵块显示完,显示下一块
CS_3_8_1 = 0;//
}
P1 &= 0xf0;//第几块点阵译码器
P1 |= 1;//关总显示
SendData(Pic[tempdata++]);
P2 = CS_3_8_1++;//第几列译码器数据
P1 = CS_3_8_0 << 1;//第几块译码器数据
P1 &= 0xfe;//开块译码器
Delayms(1);
}
tempdata = start + 16;//第二排起始数据偏移量
for(j = i; j >= 0; j--) {//显示一幅画面的下半部分
if(j == i) {
CS_3_8_0 = temp_cs0 + 4;
CS_3_8_1 = temp_cs1;
}
if(((j + 1) % 8 == 0) && j != i) {
CS_3_8_0 += 1;//此点阵块显示完,显示下一块
CS_3_8_1 = 0;
}
P1 &= 0xf0;//第几块点阵译码器
P1 |= 1;//关总显示
SendData(Pic[tempdata++]);
P2 = CS_3_8_1++;//第几列译码器数据
P1 = CS_3_8_0 << 1;//第几块译码器数据
P1 &= 0xfe;//开块译码器
Delayms(1);
}
}
}
for(i = 0; i < num - 32; i++) {//显示占满点阵显示块的代码
start++;//显示数据每次向左移一位
for(k = 0; k < 10; k++) {
tempdata = start;
CS_3_8_0 = 0;
for(j = 0; j < 32; j++) {//显示第一排
if(j == 0) {
temp_cs0 = CS_3_8_0;
CS_3_8_1 = 0;
}
if(j != 0 && j % 8 == 0) {
CS_3_8_0++;
CS_3_8_1 = 0;
}
P1 &= 0xf0;//第几块点阵译码器
P1 |= 1;//关总显示
SendData(Pic[tempdata++]);
P2 = CS_3_8_1++;//第几列译码器数据
P1 = CS_3_8_0 << 1;//第几块译码器数据
P1 &= 0xfe;//开块译码器
Delayms(1);
}
tempdata = start + 16;//显示第二排
for(j = 0; j < 32; j++) {
if(j == 0) {
CS_3_8_0 = temp_cs0 + 4;
CS_3_8_1 = 0;
}
if(j != 0 && j % 8 == 0) {
CS_3_8_0++;
CS_3_8_1 = 0;
}
P1 &= 0xf0;//第几块点阵译码器
P1 |= 1;//关总显示
SendData(Pic[tempdata++]);
P2 = CS_3_8_1++;//第几列译码器数据
P1 = CS_3_8_0 << 1;//第几块译码器数据
P1 &= 0xfe;//开块译码器
Delayms(1);
}
}
}
start = tempdata - 16 - 1;
for(i = 32; i != 0; i--) {
start++;
for(k = 0; k < 10; k++) {
tempdata = start;
CS_3_8_0 = 0;//显示最后结尾画面
for(j = i; j != 0; j--) {
if(j == i) {
temp_cs0 = CS_3_8_0;
CS_3_8_1 = 0;
}
if(j != i && j % 8 == 0) {
CS_3_8_0++;
CS_3_8_1 = 0;
}
P1 &= 0xf0;//第几块点阵译码器
P1 |= 1;//关总显示
SendData(Pic[tempdata++]);
P2 = CS_3_8_1++;//第几列译码器数据
P1 = CS_3_8_0 << 1;//第几块译码器数据
P1 &= 0xfe;//开块译码器
Delayms(1);
}
tempdata = start + 16;
for(j = i; j != 0; j--) {
if(j == i) {
CS_3_8_0 = temp_cs0 + 4;
CS_3_8_1 = 0;
}
if(j != i && j % 8 == 0) {
CS_3_8_0++;
CS_3_8_1 = 0;
}
P1 &= 0xf0;//第几块点阵译码器
P1 |= 1;//关总显示
SendData(Pic[tempdata++]);
P2 = CS_3_8_1++;//第几列译码器数据
P1 = CS_3_8_0 << 1;//第几块译码器数据
P1 &= 0xfe;//开块译码器
Delayms(1);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -