Files
51-microcontroller-homework/homework7/src/homework7.h
T
2025-05-25 00:37:27 +08:00

77 lines
2.3 KiB
C

/*
* @name: homework7.h
* @author: msksbr
* @date: 2025-05-24
* @description: a header for homework7's homework tests
* @version: 1.0f: fix errors in timer
* variables:
* 1.0:
* 1. sbit DB_0 ~ sbit DB_7: pin number for led matrix cathodes
* 2. pin number for 74HC138's address pins & enable pin
* 2.1. sbit ADDR0 ~ sbit ADDR2: pin number for 74HC138's address pins
* 2.2. sbit ADDR3 & sbit ENLED: pin number for 74HC138's enable pin
* functions:
* 1.0:
* 1. void switch_138(unsigned char n): switch the 74HC138's address to n
* 2. void delay_ms(unsigned char ms): a timer by ms base on timer0 mode 1
*/
#include <REG52.H>
// variables:
// 1. sbit DB_0 ~ sbit DB_7: pin number for led matrix cathodes
sbit DB_0 = P2 ^ 0;
sbit DB_1 = P2 ^ 1;
sbit DB_2 = P2 ^ 2;
sbit DB_3 = P2 ^ 3;
sbit DB_4 = P2 ^ 4;
sbit DB_5 = P2 ^ 5;
sbit DB_6 = P2 ^ 6;
sbit DB_7 = P2 ^ 7;
// 2. pin number for 74HC138's address pins & enable pin
// 2.1. sbit ADDR0 ~ sbit ADDR2: pin number for 74HC138's address pins
sbit ADDR0 = P1 ^ 0; // @var ADDR0: to A(A0)
sbit ADDR1 = P1 ^ 1; // @var ADDR1: to B(A1)
sbit ADDR2 = P1 ^ 2; // @var ADDR2: to C(A2)
// 2.2. sbit ADDR3 & sbit ENLED: pin number for 74HC138's enable pin
sbit ADDR3 = P1 ^ 3; // @var ADDR3: to E2
sbit ENLED = P1 ^ 4; // @var ENLED: to E3
// functions:
// 1. void switch_138(unsigned char n): switch the 74HC138's address to n
void switch_138(unsigned char n)
{
bit A0, A1, A2;
// @subsection: enable the 74HC138
ENLED = 0;
ADDR3 = 0;
// @subsection: turn n to 3 bit binary number
A0 = n & 0x01;
A1 = (n >> 1) & 0x01;
A2 = (n >> 2) & 0x01;
// @subsection: switch the 74HC138's address to n
ADDR0 = A0;
ADDR1 = A1;
ADDR2 = A2;
}
// 2. void delay_ms(unsigned char ms): a timer by ms base on timer0 mode 1
void delay_ms(unsigned char ms)
{
TMOD &= 0xF0; // set the timer mode to 16-bit timer mode.
TMOD |= 0x01; // set the timer mode to 16-bit timer mode.
// 1ms timer definition:
TH0 = 0XFC;
TL0 = 0X18;
// start the timer:
TR0 = 1;
while (ms--) {
while (!TF0) {} // wait for the timer to overflow.
TF0 = 0; // clear the timer flag.
TH0 = 0XFC; // reload the timer value.
TL0 = 0X18; // reload the timer value.
}
TR0 = 0; // stop the timer.
}