📄 fm12864.c
字号:
/********************************************************
RS 数据与指令选择(1为送数据,0为送指令)
RW:读写控制(RW=1 E=1数据被读到DB0~DB7,
RW=0 E=1->0 DB0~DB7数据被写到IR或DR)
E 使能 RST 复位
*********************************************************/
#include"mega16.h"
#include"delay.h"
#include"stdlib.h"
#define RS PORTB.0 //0x10 光标左移
#define RW PORTB.1 //0x14 光标右移
#define E PORTB.2 //0x18 屏幕左移
#define RST_ON PORTB.3=0 //RST //0x1C 屏幕右移
#define RST_OFF PORTB.3=1 //
#define FM_DATA_OUT PORTC //
#define FM_DATA_IN PINC //
#define WRITE_FM DDRC=0XFF //
#define READ_FM DDRC=0X00 //
unsigned char chinese[]={"电子创新实验室"};
unsigned char chinese1[]={"时间"};
////////////////////////送数据///////////////////////////
void Send_Data(unsigned char Da){
RS=1;
RW=0;
FM_DATA_OUT=Da;
E=1;
delay_us(20);
E=0;
RW=1;
RS=0;
delay_us(90);//大部分指令用时70多微秒,没有进行忙碌标志检测
}
//////////////////////送命令//////////////////////////
void Send_Com(unsigned char Com){
RS=0;
RW=0;
FM_DATA_OUT=Com;
E=1;
delay_us(20);
E=0;
RW=1;
RS=1;
delay_us(90);
}
/////////////////////////(图形模式下)清屏////////////////////////////
void Clear(){
char i,j;
for(j=0;j<64;j++){
if(j<32){
Send_Com(0x80+j); //清除上半屏
Send_Com(0x80);
}
else {
Send_Com(0x80+j-32); //清除下半屏
Send_Com(0x88);
}
for(i=0;i<16;i++)
Send_Data(0x00);
}
}
//////////////////////////左右滚动当前行/////////////////////// fl=0向右滚,否则想左滚
void Run(char fl,unsigned char n){ //n为滚动的次数
unsigned char i;
for(i=0;i<n;i++){
if(fl)Send_Com(0X18);
else Send_Com(0X1c);
delay_ms(500);
}
}
/////////////////////////中文显示//////////////////////
/////X0为横坐标(0=<X0<=7)Y0为纵坐标(0=<Y0<=3) ////////
void Show_Text(unsigned char X0,unsigned char Y0,unsigned char *Text){
Send_Com((0x80+0X10*(Y0%2)+8*(Y0>>1))|X0); //设定显示坐标,此液晶4行不是按顺序进行的
while(*Text>0){ //(是第0行完到第2行再到第1行最后到第3行)
Send_Data(*Text); //故用上式进行变换
Text++;
delay_us(100);
}
}
////////////////////显示数字/////////////////////////
void FM_Num(unsigned char X0,unsigned char Y0,long da){
unsigned char *P="12345678";
ltoa(da,P);//库函数,转换长整型为字符串型
Show_Text(X0,Y0,P);
}
///////////////////位图显示//////////////////////
void Show_BMP(flash unsigned char *P){
int i,Y=0;
Send_Com(0x80); //行坐标
Send_Com(0x80); //列坐标
for(i=0;i<512;i++){
if(i<256){
if(i%8==0){
Send_Com(0x80+(Y++));Send_Com(0x80);} }
else if(i%8==0){
Send_Com(0x80+(Y++));Send_Com(0x88);}
Send_Data(P[i]);
Send_Data(P[i+1]);
if(Y==32)Y=0;
}
}
void INIT_FM(void){
DDRB|=0xFF;
WRITE_FM;
RST_ON;
delay_us(10);
RST_OFF;
Send_Com(0x30); //功能设定
Send_Com(0x01); //清屏显示
Send_Com(0x02); // 地址返回原点,不改变DDRAM内容
Send_Com(0x06); // 设定输入模式,光标加,屏幕不移动
Send_Com(0x0c); //显示开 光标关
}
////////////////////////////////////////////////////////////
main(){
int i=0;
INIT_FM();
Send_Com(0x30); //扩充指令集
delay_us(300); //此处延时必须且在这不少于300us
while(1)
{
for(i=0;i<=20;++i)
{
Show_Text(0,0,chinese);
Show_Text(0,1,chinese1);
FM_Num(2,1,i);
if(i>19)
{
i=-1;
INIT_FM();
delay_ms(50);
}
delay_ms(100);
}
}
//Send_Com(0x34); //关闭图形模式
//Clear();
/*Send_Com(0x80); //行坐标
Send_Com(0x80); //列坐标
for(i=0;i<512;i++){
if(i<256){
if(i%8==0){
Send_Com(0x80+(Y++));Send_Com(0x80);} }
else if(i%8==0){
Send_Com(0x80+(Y++));Send_Com(0x88);}
Send_Data(0xff);
Send_Data(0xff);
if(Y==32)Y=0;
} */
//Send_Com(0x36); //打开图形模式
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -