目录

  • 1 项目1  电子琴设计
    • 1.1 课程概述
    • 1.2 蜂鸣器发声
    • 1.3 不同音阶发声和控制
    • 1.4 多功能电子琴
      • 1.4.1 播放一首乐曲的程序编写与仿真
      • 1.4.2 具有多功能电子琴设计与实施
      • 1.4.3 具有多功能电子琴程序编写和仿真
      • 1.4.4 具有多功能电子琴设计--直播程序讲解
  • 2 项目2  LED流水灯设计
    • 2.1 左右依次循环点亮的流水灯设计
    • 2.2 多种花样点亮的流水灯设计
    • 2.3 可调节型多功能亮灯的流水灯设计
  • 3 项目3 直流电机控制
    • 3.1 直流电机的双向转动设计
    • 3.2 转速可调的直流电机转动设计
    • 3.3 多功能直流电机双向转动设计
  • 4 项目4  步进电机控制
    • 4.1 步进电机的双向转动设计
    • 4.2 转速可调的步进电机转动设计
    • 4.3 多功能步进电机双向转动设计
  • 5 项目5 直流电机、步进电机、舵机综合设计
    • 5.1 综合设计
  • 6 项目6 广告灯设计
    • 6.1 在8*8点阵上显示一个字符
    • 6.2 在16*16点阵上显示一个汉字
    • 6.3 在16*16点阵上显示滚动汉字
  • 7 项目7 液晶显示设计
    • 7.1 在1602液晶屏上显示字符
    • 7.2 在1602液晶屏上显示自定义符号和图形
  • 8 电子万年历的制作
    • 8.1 简单万年历的制作
    • 8.2 复杂万年历的制作
    • 8.3 创新万年历的制作
  • 9 作品考核--制作18B20温控风扇
    • 9.1 任务书(拟实现的主要功能)
      • 9.1.1 单片机相关资料
      • 9.1.2 18B20相关资料
      • 9.1.3 PWM脉宽调制资料
      • 9.1.4 74H573介绍
      • 9.1.5 数码管介绍
    • 9.2 原理图、PCB图、焊接图、仿真图
    • 9.3 程序
在16*16点阵上显示一个汉字

1、在16*16点阵上显示一个汉字



2、pctolcd2002软件的使用


3、在16*16点阵上显示一个汉字--程序编写


4、在16*16点阵上显示一个汉字--仿真演示


参考程序:

/****************************************

修改时间:2020年4月21日 17:19:20

功能:16*16LED点阵显示

目的:显示"安"

显示方式:列扫描方式

取模软件:PCtoLCD2002完美版

****************************************/

#include  <reg52.h>

#define uchar unsigned char

#define uint unsigned int


sbit  datal595=P1^0;   //列数据线

sbit  datah595=P1^1;   //行数据线

sbit  clk595=P1^2;   //数据输入时钟线

sbit  str595=P1^3;   //输出存储器锁存时钟线

sbit  oe595=P1^4;   //oe输出使能

  

//取模方式:阴码(0为亮,阴码1为亮)、逐列式、逆向、十六进制、C51格式自定义 (使用Pctolcd2002软件)

uchar  code  displaydata[]=              //在ROM中定义一个可变长度数组,供用户填充一定个数的字模

//可填充的最大字模数取决于您所选用的单片机ROM空间大小

{

0x00,0x00,


0x00,0x00,0x00,0x00,0xF8,0x01,0x0C,0x07,0x0C,0x0C,0x0C,0x18,0x1C,0x30,0x18,0x30,

0x08,0x18,0x08,0x08,0x0C,0x0C,0x0C,0x06,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/

};/*"哈"*/



/*----------------------------------

函数名字: senddata 

形式参数: 无字符整型 datah:行的数据 

无字符整型 datal:列的数据

函数功能: 把数据发送给芯片74HC595

返回值  :

------------------------------------*/

void  senddata(uint datah,uint datal)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              //向行和列的4个595同时发送数据,显示其中的一列数据

{

    uchar i=0;

uint m,n;

oe595=0;                  //使能OE拉低,存储寄存器的数据输出到总线

str595=0; //输出存储器锁存时钟线

for(;i<16;i++)                       //行和列各有两片595驱动,所以行和列分别需要连续送两个字节数据                      

{

    clk595=0; //数据输入时钟线

m=datah;                         //行为高电平驱动

n=~datal;                        //列为低电平驱动

m&=0x8000;

n&=0x8000; //得到数据的最高位

datah595=(bit)m; //在每个clk周期,同时送出行和列的1bit串行数据

datal595=(bit)n;

datah<<=1; 

datal<<=1;         //左移

clk595=1;

}

str595=1;                            //一列数据送完,锁存到输出端进行显示

str595=0;

}


/*----------------------------------

函数名字: horizontal 

形式参数: 无符号字符型 指针 p:字符显示数据的首地址

函数功能: 显示字符

返回值  :

------------------------------------*/


void  dispaly(uchar *p)            //显示子程序

{

uint datah,datal;              //datah是行数据,datal是列选通

uchar x;

uint j,k;

for(x=0;x<16;x++)              //发送一整屏数据,16个16位            

{

p=p+3;               //受到取模软件的限制,需要对字模表的数据进行重新排列

j=(uint)*p;

j<<=8;                    //16位中的高字节数据

j&=0xff00;                //低字节清零

p=p-1;

k=(uint)*p;               //16位中的低字节数据

k&=0x00ff;                //高字节清零

datah=j|k;                //二者拼接,形成一个完整的16bit行数据

datal=0x0001<<x;    //列选通位移到相应的列上进行选通

//datah=~datah;          //去掉此行前面的注释则水平移动程反白显示

senddata(datah,datal);   //将行和列数据发送出去进行一列的显示

}

oe595=0;

}


void  main(void)

{

while(1)

{

    dispaly(displaydata);         //将字模表中的所有汉字进行水平移动counth

}

}