📄 12864.h
字号:
#include"c8051f020.h"
#include"math.h"
//#include <absacc.h>
//#include <string.h>
//#include"common.c"
//12864字符液晶(带中文字库)
//并口:1 Vss 2 Vdd 3 N.C 4 RS 5 R/W 6 E 7~14 DB0~DB7 15 A(+) 16 A(-)
//串口:1 Vss 2 Vdd 3 N.C 4 En 5 data 6 clk
#define clear 0x01 //清屏幕,约1.6ms
#define home 0x02 //光标回零(左上角)/
#define f_set 0x30 //并行、基本指令
#define dis_on 0x0f //打开显示,光标,闪烁功能
#define in_mode 0x06 //输入方式,地址增1,光标右移
void bit8_serial_input(uchar ix);
void blank(uchar x,uchar y,uchar z,bit repos);
//void delayms(uint count);
void dis_10num(uint num,bit flag); //显示十进制数字
void dis_16num(uint num,bit flag); //显示十六进制数字
void dis_str(uchar x,uchar y,uchar*str); //显示多个汉字,也可以显示字母
void initial(void); //初始化
void instruct(uchar dat); //归 位
void setpos(uint xpos,uint ypos); //光标设定
void write_abyte(uchar dat); //dat为ASCII码
void write_word(uint w); //写入汉字,输入为汉字对应的码
void welcome();
void menu();
sbit P_RS =P0^7;
sbit P_RW =P0^6;
sbit P_E =P0^4;
bdata uchar ab;
sbit abit7=ab^7;
//////////////////////////////////////////////
/*-----------------------------把ix依次送入RW----------------------------*/
void bit8_serial_input(uchar ix)
{
data uchar i,j,nc;
P_E=0; //clk=0;
ab=ix;
for(i=0;i<8;i++){
P_RW=abit7; //din=abit7;
ab<<=1;
P_E=1;
for(j=0;j<10;j++)nc=0;
P_E=0;
}
}
/*-----------------------写入控制方式 ----------------------------------*/
void instruct(uchar dat)
{
data uchar ch;
P_RS=1; //选通
ch=0xf8;
bit8_serial_input(ch);
ch=dat&0xf0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0; //结束作业
}
/*------------------------------------------------------------*/
void write_abyte(uchar dat) //input ASCII
{
data uchar ch;
P_RS=1; //读数据--不选通
ch=0xfa; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat&0xf0; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0; //结束作业
}
/*------------------------------------------------------------------*/
/*
写一个汉字到x,Y坐标处其中X为8列y为4行
*/
void write_word(uint w) //a ch_word
{
data uchar ch,cl;
ch=w>>8;
cl=w;
write_abyte(ch);
write_abyte(cl);
}
/*
显示字母数字在x,y处
*/
void dis_str(uchar x, uchar y, uchar *str)
{
data uchar loc,*p;
code uchar xline[5]={0,1,3,2,4};
p=str;
x=xline[x];
instruct(home);
loc=(16*(x-1)+y-1);
if(loc&0x01){
loc/=2;
instruct(loc|0x80);
//ch=' '; //字符串前加空格(0x20 )
write_abyte(' ');
}else{
loc/=2;
instruct(loc|0x80);
}
while(*p){
write_abyte(*p++);
}
}
/*---------------------------------------------------------------------------*/
void setpos(uint xpos,uint ypos)
{
int i,j,x,y;
y=ypos;
if(xpos%4==1)x=1;
if(xpos%4==2)x=3;
if(xpos%4==3)x=2;
if(xpos%4==0)x=4;
instruct(0x03);
for(i=1;i<x;i++)
for(j=0;j<8;j++) instruct(0x14);
for(i=1;i<y;i++) instruct(0x14);
}
void blank(uchar x,uchar y,uchar z,bit repos) //从(x,y)位置开始,清出Z个空格,repos=1光标复原位,repos=0光标不复原位
{
setpos(x,y);
for(;z>0;z--)
{
write_abyte(' ');
}
if(repos==1) setpos(x,y);
}
//----------------- 显示16进制数字------------------
void dis_16num(uint num,bit flag) //flag=1 显示0
{
/*uchar num4,num3,num2,num1;//uchar hex;
num4=num/4096;
num3=(num-num4*4096)/256;
num2=(num-num4*4096-num3*256)/16;
num1=(num-num4*4096-num3*256-num2*16);
if(num4<=9)num4=num4+'0'; else num4=(num4-10)+'A';
write_abyte(num4);
if(num3<=9)num3=num3+'0'; else num3=(num3-10)+'A';
write_abyte(num3);
if(num2<=9)num2=num2+'0'; else num2=(num2-10)+'A';
write_abyte(num2);
if(num1<=9)num1=num1+'0'; else num1=(num1-10)+'A';
write_abyte(num1); */
uchar snum[5];uchar i;int temp=0;//bit flag=0; //检验到第一个非零的数
for(i=0;i<5;i++)
{
snum[i]=(num-temp)/(pow(16,4-i));
temp+=snum[i]*(pow(16,(4-i)));
P_RS=1; //选通
bit8_serial_input(0xf8);
if(flag|snum[i]!=0|i==4) {
if(snum[i]<=9) snum[i]=snum[i]+'0';
else snum[i]=(snum[i]-10)+'A';
write_abyte(snum[i]);
flag=1;
}
P_RS=0;
}
return;
}
void dis_10num(uint num,bit flag) //flag=0 不显示出高位0
{
uchar numm,num1000,num100,num10,num1; //bit flag=0;//uchar hex;
//uint num=number/2; //除以二显示
numm = num/10000;
num1000=(num-numm*10000)/1000;
num100 =(num-numm*10000-num1000*1000)/100;
num10 =(num-numm*10000-num1000*1000-num100*100)/10;
num1 =(num-numm*10000-num1000*1000-num100*100-num10*10)/1;
P_RS=1; //选通
bit8_serial_input(0xf8);
if(flag|numm!=0) {numm=numm+'0'; write_abyte(numm); flag=1;}
if(flag|num1000!=0) {num1000=num1000+'0'; write_abyte(num1000); flag=1;}
if(flag|num100!=0) {num100=num100+'0'; write_abyte(num100); flag=1;}
if(flag|num10!=0) {num10=num10+'0'; write_abyte(num10); flag=1;}
num1=num1+'0'; write_abyte(num1);
P_RS=0; //选通
}
//---------------------对液晶显示屏初始化--------------------------------
void initial(void)
{
data uchar i,j;
P_RS=0; //串行--不选通
//P_PSB=0;
P_E=0; //串行方式
instruct(f_set); //0x30; //8位并行接口 基本指令
for(i=0;i<30;i++){}
//for(i=0;i<250;i++){}
//for(i=0;i<250;i++){}
//instruct(dis_on); //0x0f); //开启屏幕 光标 闪烁
for(i=0;i<30;i++){}
instruct(clear); //0x01); //清屏幕 clear
for(j=0;j<10;j++){
for(i=0;i<250;i++){}
}
instruct(in_mode); //0x06); //光标右移、地址增1 方式
for(i=0;i<30;i++){}
instruct(home);
}
void welcome()
{
instruct(0x0c);
//////////////// //////////// //液晶显示
dis_str(1,1, "20--07年全国电赛\0"); delayms(1);
dis_str(2,1, " 南 邮 \0"); delayms(1);
dis_str(3,1, "NJ Uni. of P&T \0"); delayms(1);
dis_str(4,1, "Press Any Key...\0"); delayms(1); //多余被截
//instruct(0x03); //位置归位,初始化
}
void menu()
{
//////////////// //////////// //液晶显示
dis_str(1,1, " DDS \0"); delayms(1);
dis_str(2,1, "fmax: 50MHz \0"); delayms(1);
dis_str(3,1, " \0"); delayms(1);
dis_str(4,1, "频率: kHz\0"); delayms(1);
//instruct(0x03); //位置归位,初始化
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -