sys.h
[C] 纯文本查看 复制代码 //--------------------------------------------------------------
/*本代码严格遵循微软代码风格约定
//---------------------------------------------------------------
代码风格约定:
局部变量: 小写可(加下划线)
float sum = 0.0f;
float sum_count = 0;
全局变量: g_开头加小驼峰(可加下划线)
int g_maxStudents = 100;
float g_averageScore = 0.0f;
函数: 大驼峰(可加下划线)
int CalculateSum(int x, int y);
int Calculate_Sum(int x, int y);
宏定义: 全大写
#define PI 3.14159265358979323846
*/
//----------------------------------------------------------------
/*程序说明:
降龙棍~按键响应数码管,按键S2,S3控制独立键盘控制值0-255,按键4,5将变量至0,88888888
*引脚说明:
S2:P46
S3:P47
S4:P32
S5:P33
数码管位:P27
数码管段:P26
~74HC573,4位数码管接线在P0口,数码管采用共阴极
同步89开发板的时钟,这里为了与89开发板同步做实验统一用11.0592晶振
*/
#ifndef __SYS_H_
#define __SYS_H_
#include <STC32G.H>
/*定义无符号整数类型*/ #define ULONG unsigned long
/*定义数码管端口*/ #define B8LED P0
// 编程框架函数声明
void Sys_Init();
void Sys_Draw();
void User_Updata();
void Sys_Updata();
// 用户函数声明
void Dis_Show(char wei_flag, char val);
void Dis_Scan(ULONG val);
void Key_Scan();
void Delay5ms();
#endif
main.c
[C] 纯文本查看 复制代码
#include "sys.h"
/*段引脚*/ sbit g_duan = P2 ^ 6;
/*位引脚*/ sbit g_wei = P2 ^ 7;
/*S2引脚定义*/ sbit g_key2 = P4 ^ 6;
/*S3引脚定义*/ sbit g_key3 = P4 ^ 7;
/*S4引脚定义*/ sbit g_key4 = P3 ^ 2;
/*S5引脚定义*/ sbit g_key5 = P3 ^ 3;
/*数码管段码表*/
unsigned char code g_duan_Data[] = {
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, // 熄灭
0x00 // 自定义
};
/*数码管位表*/
unsigned char code g_wei_Data[] = {
0xfe, // 1111 1110 b
0xfd, // 1111 1101 b
0xfb, // 1111 1011 b
0xf7, // 1111 0111 b
0xef, // 1110 1111 b
0xdf, // 1101 1111 b
0xbf, // 1011 1111 b
0x7f // 0111 1111 b
};
/*需要显示的数据*/ ULONG g_num = 0;
void main()
{
// 采用框架式编程
// 1.定义数据
// 2.系统初始化数据
Sys_Init(); // 初始化
while (1)
{
// 3.系统数据绘制
Sys_Draw();
// ----------------------------------------4.数据更新
// 4.1用户干预更新数据
User_Updata();
// 4.2 系统自动更新数据
Sys_Updata();
}
}
// 系统式编程框架-----------------------------------------------
/*初始化函数*/
void Sys_Init()
{
P3M0 = 0x00;
P3M1 = 0x00; // P3口设置为准双向IO口,独立按键
P2M0 = 0x00;
P2M1 = 0x00; // P2口设置为准双向IO口,74H芯片
P0M0 = 0x00;
P0M1 = 0x00; // P0设置为准双向IO口,数码管
P4M0 = 0x00;
P4M1 = 0x00; // 降龙棍和改版后P31,P30 被改为P47 P46
P4 = 0xff; // 设置为高电平
P2 = 0xff; // 设置为高电平
P3 = 0xff; // 设置为高电平
P0 = 0x00; // 设置为低电平
WTST = 0X00; // 延时等待控制器
}
/*绘制处理数据*/
void Sys_Draw()
{
Dis_Scan(g_num);
}
/*用户干预更新数据*/
void User_Updata()
{
Key_Scan();
}
/*系统更新数据*/
void Sys_Updata()
{
}
// 下面数用户函数实现区域-----------------------------------
/*键盘扫描
*S2功能:显示结果+1;
*S3功能:显示结果-1;
*S4功能:显示结果为88888888
*S5功能:显示结果为0
*/
void Key_Scan()
{
if (g_key2 == 0 ) // 如果按键按键状态为非占用,并且按键被按下
{
while (g_key2 == 0)
; // 等待用户松开按键
if (g_num < 255)
g_num++; // 将结果+1
}
if (g_key3 == 0 )
{
while (g_key3 == 0)
; // 等待用户松开按键
if (g_num >= 1)
g_num--; // 将结果-1
}
if (g_key4 == 0 && g_num != 88888888)
{
while (g_key4 == 0)
; // 等待用户松开按键
g_num = 88888888;
}
if (g_key5 == 0 && g_num != 0)
{
while (g_key5 == 0)
; // 等待用户松开按键
g_num = 0;
}
}
/*数码管单位显示
*参数1:wei_flag: 显示在哪一位上
*参数2:val: 需要显示的值
*/
void Dis_Show(char wei_flag, char val)
{
B8LED = 0; // 清除段码
g_wei = 1; // 打开位锁存器
B8LED = g_wei_Data[wei_flag]; // 选择数码管位
g_wei = 0; // 关闭位锁存器
B8LED = 0; // 清除段码
g_duan = 1; // 打开段锁存器
B8LED = g_duan_Data[val]; // 显示段数据
g_duan = 0; // 关闭段锁存器
}
/*数码管动态扫描
*参数1:val需要显示的数据
*/
void Dis_Scan(ULONG val)
{
char val_arr[8]; // 储存每个位置的数组
char count = 0; // 初始化遍历记录变量为0
if (val == 0)
{ // 如果传入的值为0
Delay5ms(); // 消除鬼影
Dis_Show(7, 0); // 直接输出数码管显示结果为0
}
else
{
while (val != 0)
{
val_arr[count] = val % 10;
val /= 10;
count++;
Delay5ms(); // 消除鬼影
Dis_Show((char)(8 - count), val_arr[count - 1]);
}
}
}
/*延时函数5毫秒*/
void Delay5ms() //@11.0592MHz
{
volatile unsigned long i;
_nop_();
_nop_();
_nop_();
i = 13822UL;
while (i)
i--;
}
|