本系列教程以AVR单片机为对象,介绍单片机的快速开发方法。
参考教材:《单片机技术及应用项目教程》 栾秋平 电子工业出版社 2019.6 第1版
本文介绍使用74HC595在LED阵列上,显示数字“0-9”的方法。
1、0的字模:0x80、0xB6、0x80
行 列 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
2 |
0 |
1 |
0 |
3 |
0 |
1 |
0 |
4 |
0 |
1 |
0 |
5 |
0 |
1 |
0 |
6 |
0 |
0 |
0 |
7 |
1 |
1 |
1 |
2、1的字模0xFF、0x80、0xFF
行 列 |
2 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
2 |
1 |
0 |
1 |
3 |
1 |
0 |
1 |
4 |
1 |
0 |
1 |
5 |
1 |
0 |
1 |
6 |
1 |
0 |
1 |
7 |
1 |
1 |
1 |
3、2的字模0x86、0xB6、0xB0
行 列 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
2 |
1 |
1 |
0 |
3 |
0 |
0 |
0 |
4 |
0 |
1 |
1 |
5 |
0 |
1 |
1 |
6 |
0 |
0 |
0 |
7 |
1 |
1 |
1 |
4、3的字模0xB6、0xB6、0x80
行 列 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
2 |
1 |
1 |
0 |
3 |
0 |
0 |
0 |
4 |
1 |
1 |
0 |
5 |
1 |
1 |
0 |
6 |
0 |
0 |
0 |
7 |
1 |
1 |
1 |
5、4的字模0xF0、0xF7、0x80
行 列 |
2 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
2 |
0 |
1 |
0 |
3 |
0 |
0 |
0 |
4 |
1 |
1 |
0 |
5 |
1 |
1 |
0 |
6 |
1 |
1 |
0 |
7 |
1 |
1 |
1 |
6、5的字模0xB0、0xB6、0x86
行 列 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
2 |
0 |
1 |
1 |
3 |
0 |
0 |
0 |
4 |
1 |
1 |
0 |
5 |
1 |
1 |
0 |
6 |
0 |
0 |
0 |
7 |
1 |
1 |
1 |
7、6的字模0x80、0xB6、0x86
行 列 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
2 |
0 |
1 |
1 |
3 |
0 |
0 |
0 |
4 |
0 |
1 |
0 |
5 |
0 |
1 |
0 |
6 |
0 |
0 |
0 |
7 |
1 |
1 |
1 |
8、7的字模0xFE、0xFE、0x80
行 列 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
2 |
1 |
1 |
0 |
3 |
1 |
1 |
0 |
4 |
1 |
1 |
0 |
5 |
1 |
1 |
0 |
6 |
1 |
1 |
0 |
7 |
1 |
1 |
1 |
9、8的字模0x80、0xB6、0x80
行 列 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
2 |
0 |
1 |
0 |
3 |
0 |
0 |
0 |
4 |
0 |
1 |
0 |
5 |
0 |
1 |
0 |
6 |
1 |
0 |
0 |
7 |
1 |
1 |
1 |
10、9的字模0xB0、0xB6、0x80
行 列 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
2 |
0 |
1 |
0 |
3 |
0 |
0 |
0 |
4 |
1 |
1 |
0 |
5 |
1 |
1 |
0 |
6 |
0 |
0 |
0 |
7 |
1 |
1 |
1 |
int main(void)
{
//定义局部变量
//目标板初始化,该函数会自动初始化相应的外设文件
TARGET_Init();
//初始化全局变量
//在上电时,执行的相应操作
//后台主循环
while(1)
{
/*
**********************************
在这里完成自己的项目逻辑
**********************************
*/
HC595_WriteByte(0xB0); //9
HC595_WriteByte(0xB6);
HC595_WriteByte(0x80);
HC595_SELECT;
TARGET_Delayms(1000, 1);
HC595_WriteByte(0x80); //8
HC595_WriteByte(0xB6);
HC595_WriteByte(0x80);
HC595_SELECT;
TARGET_Delayms(1000, 1);
HC595_WriteByte(0xFE); //7
HC595_WriteByte(0xFE);
HC595_WriteByte(0x80);
HC595_SELECT;
TARGET_Delayms(1000, 1);
HC595_WriteByte(0x80); //6
HC595_WriteByte(0xB6);
HC595_WriteByte(0x86);
HC595_SELECT;
TARGET_Delayms(1000, 1);
HC595_WriteByte(0xB0); //5
HC595_WriteByte(0xB6);
HC595_WriteByte(0x86);
HC595_SELECT;
TARGET_Delayms(1000, 1);
HC595_WriteByte(0xF0); //4
HC595_WriteByte(0xF7);
HC595_WriteByte(0x80);
HC595_SELECT;
TARGET_Delayms(1000, 1);
HC595_WriteByte(0xB6); //3
HC595_WriteByte(0xB6);
HC595_WriteByte(0x80);
HC595_SELECT;
TARGET_Delayms(1000, 1);
HC595_WriteByte(0x86); //2
HC595_WriteByte(0xB6);
HC595_WriteByte(0xB0);
HC595_SELECT;
TARGET_Delayms(1000, 1);
HC595_WriteByte(0xFF); //1
HC595_WriteByte(0x80);
HC595_WriteByte(0xFF);
HC595_SELECT;
TARGET_Delayms(1000, 1);
HC595_WriteByte(0x80); //0
HC595_WriteByte(0xBE);
HC595_WriteByte(0x80);
HC595_SELECT;
TARGET_Delayms(1000, 1);
/*
**********************************
喂狗语句,大部分工程项目都不应去除
**********************************
*/
#if INTERNAL_PERIPHERAL_WDT_MODE != 0
TARGET_WatchDogReset();
#endif
}
return 0; //永不执行
}
#ifndef HAL_H_
#define HAL_H_
//引脚定义
////////////////////////////////////////////////////////////////////////////////////
//PortB
#define IO_PB_DIR 0b00000000
#define IO_PB_OUT 0b00000000
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//PortC
#define IO_PC_DIR 0b00000000
#define IO_PC_OUT 0b00000000
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//PortD
#define IO_PD_DIR 0b00000000
#define IO_PD_OUT 0b00000000
////////////////////////////////////////////////////////////////////////////////////
//函数原型声明
void ShowNumber(uint8 u8_Number);
#endif /* HAL_H_ */
#include "../include.h"
//以下函数为工程项目中用到的函数
void ShowNumber(uint8 u8_Number)
{
uint8 u8_Line[3];
switch (u8_Number)
{
case 0:
u8_Line[2] = 0x80;
u8_Line[1] = 0xBE;
u8_Line[0] = 0x80;
break;
case 1:
u8_Line[2] = 0xFF;
u8_Line[1] = 0x80;
u8_Line[0] = 0xFF;
break;
case 2:
u8_Line[2] = 0x86;
u8_Line[1] = 0xB6;
u8_Line[0] = 0xB0;
break;
case 3:
u8_Line[2] = 0xB6;
u8_Line[1] = 0xB6;
u8_Line[0] = 0x80;
break;
case 4:
u8_Line[2] = 0xF0;
u8_Line[1] = 0xF7;
u8_Line[0] = 0x80;
break;
case 5:
u8_Line[2] = 0xB0;
u8_Line[1] = 0xB6;
u8_Line[0] = 0x86;
break;
case 6:
u8_Line[2] = 0x80;
u8_Line[1] = 0xB6;
u8_Line[0] = 0x86;
break;
case 7:
u8_Line[2] = 0xFE;
u8_Line[1] = 0xFE;
u8_Line[0] = 0x80;
break;
case 8:
u8_Line[2] = 0x80;
u8_Line[1] = 0xB6;
u8_Line[0] = 0x80;
break;
case 9:
u8_Line[2] = 0xB0;
u8_Line[1] = 0xB6;
u8_Line[0] = 0x80;
break;
default:
u8_Line[2] = 0xFF;
u8_Line[1] = 0xFF;
u8_Line[0] = 0xFF;
break;
}
HC595_WriteByte(u8_Line[2]);
HC595_WriteByte(u8_Line[1]);
HC595_WriteByte(u8_Line[0]);
HC595_SELECT;
}
int main(void)
{
//定义局部变量
int8 i;
//目标板初始化,该函数会自动初始化相应的外设文件
TARGET_Init();
//初始化全局变量
//在上电时,执行的相应操作
//后台主循环
while(1)
{
/*
**********************************
在这里完成自己的项目逻辑
**********************************
*/
for (i = 9; i >= 0; i--)
{
ShowNumber(i);
TARGET_Delayms(1000, 1);
}
/*
**********************************
喂狗语句,大部分工程项目都不应去除
**********************************
*/
#if INTERNAL_PERIPHERAL_WDT_MODE != 0
TARGET_WatchDogReset();
#endif
}
return 0; //永不执行
}
任何问题,只需在此文章的评论处留言即可,我将尽力解答,不要试图采用其它的联系方式,我一概不理会。
原创性文章,转载请注明出处CSDN:http://blog.csdn.net/qingwufeiyang12346。