📄 yejing.c
字号:
/**************************************************
the led should be set to two 8bytes lines with the first character of the first line at address 0x80
and the first character of the second line at address 0xC0
ipbus = 2.4576M
cycle = 0.4u delaytwous(1) means delay 2us
MCU DISPLAY
PORTC0 ->RS
PORTC1 ->R/W
PORTC2 ->E
MOSI ->A
SPSCK ->CLK
PORTC3 ->MR
+5V ->B
SS ->+5V
***************************************************/
#include <hidef.h>
#include "string.h"
#define PORTA (*((char *)0x0000))
#define DDRA (*((char *)0x0004))
#define PORTB (*((char *)0x0001))
#define DDRB (*((char *)0x0005))
#define PORTC (*((char *)0x0002))
#define DDRC (*((char *)0x0006))
#define SPCR (*((char *)0x0010))
#define SPSCR (*((char *)0x0011))
#define SPDR (*((char *)0x0012))
#define COMMANDOPRA (PORTC &= 0xFE)
#define DATAOPRA (PORTC |= 0x01)
#define READOPRA (PORTC |= 0x02)
#define WRITEOPRA (PORTC &= 0xFD)
#define EUP (PORTC |= 0x04)
#define EDOWN (PORTC &= 0xFB)
#define MRUP (PORTC |= 0x08)
#define MRDOWN (PORTC &= 0xF7)
unsigned char logo[17] = " _Tsinghua MAC_ ";
void delaytwous(int twous); //in 2us
void spi_out(unsigned char onebyte);
void senddata(unsigned char onebyte);
void sendcommand(unsigned char onebyte);
void setledadd(unsigned int i);
void clrscreen(void);
void displaystring(unsigned char* buffer);
void cpuinit(void);
void displayinit(void);
void appinit(void);
/*delay function :the input argument = 1 means delay 2us*/
void delaytwous(int twous) //in 2us
{
int i;
for (i=0;i<twous;i++)
asm{
nop
nop
};
return;
}
/*use spi to send one char to led*/
void spi_out(unsigned char onebyte)
{
do{
}while((SPSCR & 0x08) == 0);
SPDR = onebyte;
do{
}while((SPSCR & 0x08) == 0);
return;
}
/*send data from mcu to led by spi*/
void senddata(unsigned char onebyte)
{
DATAOPRA;
WRITEOPRA;
spi_out(onebyte);
asm{
nop
nop
};
EUP;
asm{
nop
nop
};
EDOWN;
}
/*send command from mcu to led by spi*/
void sendcommand(unsigned char onebyte)
{
COMMANDOPRA;
WRITEOPRA;
spi_out(onebyte);
asm{
nop
nop
};
EUP;
asm{
nop
nop
};
EDOWN;
}
/*set the display char's address*/
void setledadd(unsigned int i)
{
if (i == 0)
{
sendcommand(0x80);
delaytwous(20);
}
if (i == 8)
{
sendcommand(0xC0);
delaytwous(20);
}
}
/*clear screen function by sendcommand 0x01 to led*/
void clrscreen(void)
{
sendcommand(0x01);
delaytwous(800);
}
/*display one string using the senddata function*/
void displaystring(unsigned char* buffer)
{
unsigned int i, l;
l = strlen(buffer);
clrscreen();
for (i = 0; i < l; i++)
{
setledadd(i);
senddata(buffer[i]);
delaytwous(20);
}
}
/*initialize the portc and spi*/
void cpuinit(void)
{
DDRC = 0xFF;
MRUP;
SPCR = 0x3A;
SPSCR = 0x00;
}
/*initialize the led by sending special command to it*/
void displayinit(void)
{
delaytwous(2300);
sendcommand(0x38);//function set
delaytwous(2300);
sendcommand(0x38);
delaytwous(50);
sendcommand(0x38);
delaytwous(20);
sendcommand(0x38);
delaytwous(20);
sendcommand(0x38);
delaytwous(20);
sendcommand(0x08);//display off
delaytwous(20);
clrscreen();//clear screen
sendcommand(0x06);//entry mode set
delaytwous(20);
sendcommand(0x14);//cursor or display shift
delaytwous(20);
sendcommand(0x0C);//display on/off control
delaytwous(20);
}
/*application initialize using cpuinit and displayinit*/
void appinit(void)
{
cpuinit();
displayinit();
}
/*the main function*/
void main(void)
{
appinit();
displaystring(logo);
while (1)
{}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -