Основы экспериментального примера обновления
Базовый эксперимент по обновлению примера:
Keil C51 компилятор исходного кода (https://github.com/hongwenjun/stc89c52/tree/master/src)
Исходный код SDCC lib (https://github.com/hongwenjun/stc89c52/tree/master/sdcc/lib_src)
Hongwenjun одночиповый микрокомпьютер базовый (https://space.bilibili.com/93630735/channel/detail?cid=76908)
Видеоурок по обучению одночипового микрокомпьютера за десять дней от учителя Ся (https://www.bilibili.com/video/av37406640)
Справочник по другим компонентам платы разработки (https://github.com/hongwenjun/img/tree/master/c51)
Компилятор Keil uVision5 C51 (https://www.keil.com/download/product/)
Настройки CodeBlocks, выбор компилятора Keil C51:
Каталог компилятора: C:\Keil\C51
Каталог поиска файлов заголовков компилятора: C:\Keil\C51\INC
Каталог поиска библиотечных файлов компилятора: C:\Keil\C51\LIB
Имя: Keil_C51 компиляция_создание HEX
Исполняемая программа: OH51.EXE
$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).omf
SDCC — это оптимизирующий компилятор ANSI C89, ISO C99 и ISO C11 с малым размером устройства для микропроцессоров на базе Intel MCS51 (8031, 8032, 8051, 8052 и т. д.), Maxim (ранее Dallas) DS80C390, Freescale (ранее Motorola) на основе HC08 (hc08, s08), Zilog Z80 на основе MCU (z80, z180, gbz80, Rabbit 2000/3000, Rabbit 3000A, TLCS-90), Padauk (pdk14, pdk15) и STMicroelectronics STM8. В настоящее время ведётся работа над поддержкой Padauk (pdk13), Microchip PIC16 и PIC18. Он может быть повторно настроен на другие микропроцессоры.
SDCC компилятор с открытым исходным кодом (http://sdcc.sourceforge.net)
Настройка CodeBlocks, выберите компилятор SDCC:
Каталог компилятора: C:\sdcc
Каталог поиска файлов заголовков: C:\sdcc\include
Каталог поиска библиотек: C:\sdcc\lib
# Создание нового проекта CodeBlocks, выбор MCS51 Project, по умолчанию выбирается компилятор SDCC, шаблон автоматически добавляет команду преобразования C51 в файл HEX
cmd /c "packihx <$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).ihx >$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).hex"
// Музыкальный проигрыватель: порхающая девушка, одна и та же песня, две бабочки
void main()
{
InitialSound();
while (1) {
keypros();
// K1 кнопка для выбора песни «Две бабочки»
if (key_id == 1) {
Play(Music_Two, 0, 3, 360);
Delay1ms(500);
key_id = 0;
}
// K2 кнопка для выбора песни «Порхающая девушка»
// K3 кнопка для выбора той же песни
// K4 звуковой сигнал
}
}
Подарок: семисегментный дисплей с 7 сегментами и 26 буквами
sbit LSA = P2 ^ 2;
sbit LSB = P2 ^ 3;
sbit LSC = P2 ^ 4; // Управление выходом Y0 38-го декодера с низким уровнем напряжения
u8 code smgduan[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, // 0 1 2 3 4
0x6d, 0x7d, 0x07, 0x7f, 0x6f, // 5 6 7 8 9
0x77, 0x7c, 0x39, 0x5e, 0x79, // A B C D E
0x71, 0x00 // F NULL
};
— Файл: * Семисегментный дисплей — таблица из 26 букв и символов.xls * используется для расширения пользовательских букв и знаков.
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//чтение кнопки, чтобы увидеть, нажата ли она
{
delay(1000);//задержка 10 мс для устранения дребезга
if(GPIO_KEY!=0x0f)//повторное определение, нажата ли кнопка
{
//тестирование столбца
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//проверка строки
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
``` **5. 8*8LED матрица — эксперимент по отображению текста**
В то время как (a < 50) и (GPIO_KEY != 0xf0), {
delay(1000);
a++;
}
}
**6. Таймер и прерывание**
// Прерывание по таймеру
void Timer0Init(void) { // 2 мс при 12 МГц
EA = 1 ; // Разрешить все прерывания
TMOD &= 0xFC; // Установить режим таймера
TMOD |= 0x01;
TH0 = (655536 - 2000) / 256; // 2мс
TL0 = (655536 - 2000) % 256;
ET0 = 1; // Включить таймер 0
TR0 = 1; // Запустить таймер 0
}
void inter_timer0() interrupt 1 {
static unsigned int cnt;
cnt++;
if (cnt >= 1000) { // 2мс * 1000 = 2 секунды срабатывания
cnt = 0;
P2 = ~P2;
}
}
**7. Управление кнопкой для внешнего прерывания**
#include <reg51.h>
// K3 независимая кнопка вызывает внешнее прерывание INT0
// Внешняя процедура обслуживания прерываний 0 // Внешнее прерывание 0
void exint0() interrupt 0 {
P2++; // Светодиод в группе P2 I/O порт
}
void main() {
IT0 = 1; // Установить тип INT0 int (1: спад, 0: низкий уровень)
EX0 = 1; // Разрешить прерывание INT0
EA = 1; // Открыть глобальный переключатель прерываний
while (1);
}
**8. Знакомство с ЖК-модулем LCD1602**
#define LcdDB P0 // D0-D7 — 8-битные двунаправленные линии данных для передачи данных или команд
sbit LcdRS = P2 ^ 6; // RS — выбор регистра, высокий уровень выбирает регистр данных, низкий уровень выбирает регистр команд
sbit LcdRW = P2 ^ 5; // R/W — линия чтения/записи, высокий уровень для операции чтения, низкий уровень для записи
sbit LcdEN = P2 ^ 7; // E — разрешение, когда высокий уровень переходит в низкий, ЖК-модуль выполняет команду
void Lcd_Init(); // Функция инициализации LCD1602
void LcdWrDat(uchar dat); // Функция записи 8-битных данных на LCD1602
void LcdWrCmd(uchar cmd); // Функция записи 8-битной команды на LCD1602
void LcdBusy(); // Ожидание сигнала занятости
void Lcd_Show(uchar x, uchar y); // Отображение координат: x — горизонтальная координата; y — вертикальная координата (y=0 — первая строка, y=1 — вторая строка)
void Lcd_Init() {
LcdWrCmd(0x38); // Запись команды 38H: установка режима отображения
LcdWrCmd(0x0C); // Запись команды 0CH: включить отображение, не отображать курсор
LcdWrCmd(0x06); // Запись команды 06H: установить положение курсора
LcdWrCmd(0x01); // Запись команды 01H: очистить экран
LcdWrCmd(0x08); // Запись команды 08H: выключить отображение
}
void LcdWrDat(uchar dat) {
LcdBusy(); // Ожидание сигнала занятости
LcdRS = 1; // Высокий уровень для выбора регистра данных
LcdRW = 0; // Низкий уровень для выполнения операции записи
LcdDB = dat; // Запись данных
LcdEN = 1; // Падение уровня для разрешения
LcdEN = 0;
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )