8051 Test code with 4 bit HD44780 LCD, LEDs, audio frequency generation.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

318 lines
6.1 KiB

//LCD 4 Bit Mode 8051
#include <8051.h>
#include "delay.h"
#define LCD P1
#define ENABLE 0x10
#define REG_SL 0x20
/*
LCD: DB4|DB5|DB6|DB7|EN |RS RW
P1: 0 1 2 3 4 5 GND
*/
void lcd_reset() //Reset sequence as stated in the LCD datasheet
{
delay_ms(350);
LCD = 0xFF;
delay_ms(20);
LCD = 0x03|ENABLE;
LCD = 0x03;
delay_ms(15);
LCD = 0x03|ENABLE;
LCD = 0x03;
delay_ms(5);
LCD = 0x03|ENABLE;
LCD = 0x03;
delay_ms(5);
LCD = 0x02|ENABLE;
LCD = 0x02;
delay_ms(5);
}
void lcd_cmd(unsigned char cmd) //Subroutine to send command
{
LCD = ((cmd>>4)&0x0F)|ENABLE; //Sending higher nibble by shifting with Pulsing Enable high
delay_us(20);
LCD = ((cmd>>4)&0x0F);
delay_us(20);
LCD = (cmd & 0x0F)|ENABLE; //Sending lower nibble Enable low
LCD = (cmd & 0x0F);
delay_us(60);
}
void lcd_data (char *dat) //Subroutine to send data
{
while(*dat != '\0') {
LCD = (((*dat>>4)&0x0F)|ENABLE|REG_SL); //Sending data by making RS=1
delay_us(20);
LCD = (((*dat>>4)&0x0F)|REG_SL);
delay_us(20);
LCD = ((*dat & 0x0F)|ENABLE|REG_SL);
delay_us(20);
LCD = ((*dat & 0x0F)|REG_SL);
delay_us(20);
dat++;
}
}
void lcd_init ()
{
lcd_cmd(0x28); // 4-bit mode - 2 line - 5x7 font.
lcd_cmd(0x0F); // Display cursor with blink.
lcd_cmd(0x06); // Automatic Increment - No Display shift.
lcd_cmd(0x01);
lcd_cmd(0x02); //Clear screen and return home
lcd_cmd(0x80); // First row first column
}
void achord(unsigned char count)
{
unsigned char y;
unsigned char r;
for(r=0;r<count;r++) {
for(y=110;y>0;y--) { //0.25 sec, A 440Hz
P3=0x55;
delay_us(91);
P3=0xAA;
delay_us(91);
}
for(y=139;y>0;y--) { //0.25 sec, C# 554Hz
P3=0x55;
delay_us(72);
P3=0xAA;
delay_us(72);
}
for(y=165;y>0;y--) { //0.25 sec, E 659Hz
P3=0x55;
delay_us(60);
P3=0xAA;
delay_us(60);
}
for(y=220;y>0;y--) { //0.25 sec, A 880Hz
P3=0x55;
delay_us(44);
P3=0xAA;
delay_us(44);
}
}
}
void main()
{
//unsigned int freq;
//unsigned int notes;
//unsigned int cycles;
unsigned int y;
//unsigned int z;
lcd_reset();
lcd_init();
lcd_data(" [RuhNet Labs] ");
while(1) {
delay_ms(1000);
lcd_init(); //Clear screen and return home
lcd_data(" [RuhNet Labs] ");
P3 = 0xFF; //turn all P3 outputs on
delay_ms(1000);
lcd_cmd(0xC0); // Second row first column
lcd_data("_Intel 8051 MCU_");
delay_ms(1000);
P3 = 0x00;
delay_ms(1000);
P3 = 0xFF;
delay_ms(1000);
lcd_cmd(0x80); // First row first column
lcd_data(">LED/Audio Test<");
P3 = 0x00;
delay_ms(2000);
lcd_cmd(0xC0); // Second row first column
lcd_data("(Port P3: 0xAA) ");
P3 = 0xAA;
delay_ms(1000);
lcd_cmd(0xC0); // Second row first column
lcd_data("(Port P3: 0x55) ");
P3 = 0x55;
delay_ms(1000);
lcd_cmd(0xC0); // Second row first column
lcd_data("P3 rate: ~10Hz ");
for(y=10;y>0;y--) { //0.2 seconds of 100Hz
P3=0x55;
delay_ms(5);
P3=0xAA;
delay_ms(5);
}
for (y=24;y>0;y--) {
P3=0x55;
delay_ms(50);
P3=0xAA;
delay_ms(50);
}
lcd_cmd(0xC0); // Second row first column
lcd_data("P3 rate: ~100Hz ");
for(y=100;y>0;y--) { //2 seconds, 100Hz
P3=0x55;
delay_ms(5);
P3=0xAA;
delay_ms(5);
}
lcd_cmd(0xC0);
lcd_data("P3 rate: ~1000Hz");
for(y=1000;y>0;y--) {
P3=0x55;
delay_us(40);
P3=0xAA;
delay_us(40);
}
lcd_cmd(0xC0); // Second row first column
lcd_data("P3 rate: ~10kHz ");
for(y=10000;y>0;y--) {
P3=0x55;
delay_us(4);
P3=0xAA;
delay_us(4);
}
lcd_cmd(0xC0);
lcd_data("P3 rate: 220Hz~A");
for(y=220;y>0;y--) {
P3=0x55;
delay_us(181);
P3=0xAA;
delay_us(181);
}
lcd_cmd(0xC0);
lcd_data("P3 rate: 247Hz~B");
for(y=247;y>0;y--) {
P3=0x55;
delay_us(161);
P3=0xAA;
delay_us(161);
}
lcd_cmd(0xC0);
lcd_data("P3 rate: 262Hz~C");
for(y=262;y>0;y--) {
P3=0x55;
delay_us(152);
P3=0xAA;
delay_us(152);
}
lcd_cmd(0xC0);
lcd_data("P3 rate: 294Hz~D");
for(y=294;y>0;y--) {
P3=0x55;
delay_us(136);
P3=0xAA;
delay_us(135);
}
lcd_cmd(0xC0);
lcd_data("P3 rate: 329Hz~E");
for(y=329;y>0;y--) {
P3=0x55;
delay_us(121);
P3=0xAA;
delay_us(121);
}
lcd_cmd(0xC0);
lcd_data("P3 rate: 370Hz~F");
for(y=370;y>0;y--) {
P3=0x55;
delay_us(108);
P3=0xAA;
delay_us(107);
}
lcd_cmd(0xC0);
lcd_data("P3 rate: 415Hz~G");
for(y=415;y>0;y--) {
P3=0x55;
delay_us(96);
P3=0xAA;
delay_us(96);
}
lcd_cmd(0xC0);
lcd_data("P3 rate: 440Hz~A");
for(y=440;y>0;y--) {
P3=0x55;
delay_us(91);
P3=0xAA;
delay_us(91);
}
lcd_cmd(0xC0);
lcd_data("Wait for it... ");
P3=0x00;
delay_ms(500);
lcd_cmd(0xC0); // Second row first column
lcd_data("FruitFly 2167Hz!");
for(y=4334;y>0;y--) { //2 seconds
P3=0x55;
delay_us(18);
P3=0xAA;
delay_us(18);
}
lcd_cmd(0x80);
lcd_data("~Chord: A Major");
lcd_cmd(0xC0); // Second row first column
lcd_data("A -> C# -> E-> A");
for(y=440;y>0;y--) { //1 sec, A 440Hz
P3=0x55;
delay_us(91);
P3=0xAA;
delay_us(91);
}
for(y=554;y>0;y--) { //1 sec, C# 554Hz
P3=0x55;
delay_us(72);
P3=0xAA;
delay_us(72);
}
for(y=659;y>0;y--) { //1 sec, E 659Hz
P3=0x55;
delay_us(60);
P3=0xAA;
delay_us(60);
}
for(y=880;y>0;y--) { //1 sec, A 880Hz
P3=0x55;
delay_us(44);
P3=0xAA;
delay_us(44);
}
achord(4);
lcd_cmd(0x80);
lcd_data(" -The|End- ");
lcd_cmd(0xC0); // Second row first column
lcd_data("https://ruel.io ");
//delay_ms(1000);
/*
//Doesn't work for some reason:
//Maintins 100Hz indefinitely... :-(
freq=399;
z=3985;
for(notes=398;notes>2;notes--) {
freq--;
z=z-5;
for(cycles=(z/40);cycles>0;cycles--) {
//for(cycles=freq;cycles>0;cycles--) {
P3=0x55;
delay_us(freq);
P3=0xAA;
delay_us(freq);
}
}
*/
}
}