//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;r0;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); } } */ } }