📄 12864_serial_5410_new.c
字号:
#include <stc12c5410ad.h>
#include <intrins.h>
#include "string.h"
#define uint unsigned int
#define uchar unsigned char
sbit sclk=P3^2;//clock input 同步时钟输入端
sbit sid=P3^3;//data input/output 串行数据输入、输出端
//sbit RS_CS=P3^5;//chip select 片选端
//sbit PSB =P3^6;//serial mode select 串口模式
//sbit RST =P1^2;
xdata uchar wave[256];
//idata uchar dpdata[128];
void delay(uchar n);
void delayint(uint n);
void sendbyte(uchar dat);
uchar receievebyte(void);
bit readbf();
void sendcmd(uchar dat);
void senddat(uchar dat);
void display(uchar x_add,uchar dat1,uchar dat2);
void initlcm(void);
void write_str(char * str);
void clrscreen();
uint r_power2(uchar n);
void scalewave();
void buildwave();
void showwave();
void storewave();
//uint reverse16(uint);
void main(void)
{
// CLK_DIV=0x03;//8分频工作
// uchar i;
initlcm();
clrscreen();
storewave();
scalewave();
buildwave();
showwave();
while(1);
}
void delay(uchar i)
{
for(;i>0;i--);
}
void delayint(uint i)
{
for(;i>0;i--);
}
//串行发送一字节数据
void sendbyte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
sclk=0;
if(dat&0x80)
sid=1;
else
sid=0;
sclk=1;
dat=dat<<1;
}
}
//串行接收一字节数据
uchar receievebyte(void)
{
unsigned char i,d1,d2;
sid=1;
for(i=0;i<8;i++)
{
sclk=0;delay(100);
sclk=1;
if(sid)d1++;
d1=d1<<1;
}
for(i=0;i<8;i++)
{
sclk=0;delay(100);
sclk=1;
if(sid)d2++;
d2=d2<<1;
}
return (d1&0xF0+d2&0x0F);
}
//读取标志位BF
bit readbf()
{
bit bf;
uchar dat;
sendbyte(0xFA);//11111,01,0 RW=1,RS=0
dat=receievebyte();
P1=~dat;
if(dat>0x7F)
bf=1;
else
bf=0;
return bf;
}
//写控制命令
void sendcmd(unsigned char dat)
{
while(readbf());
// RS_CS=1;
sendbyte(0xF8);//11111,00,0 RW=0,RS=0 同步标志
sendbyte(dat&0xF0);//高四位
sendbyte((dat&0x0F)<<4);//低四位
// RS_CS=0;
}
//写显示数据或单字节字符
void senddat(unsigned char dat)
{
while(readbf());
// RS_CS=1;
sendbyte(0xFA);//11111,01,0 RW=0,RS=1
sendbyte(dat&0xF0);//高四位
sendbyte((dat&0x0F)<<4);//低四位
// RS_CS=0;
}
/*写汉字到LCD 指定的位置 x_add显示RAM的地址 dat1/dat2显示汉字编码 */
void display(unsigned char x_add,unsigned char dat1,unsigned char dat2)
{
sendcmd(x_add);//1xxx,xxxx 设定DDRAM 7位地址xxx,xxxx到地址计数器AC
senddat(dat1);
senddat(dat2);
}
//初始化 LCM
void initlcm(void)
{
// RST=0;
// RS_CS=0;
// PSB=0;//serial mode
delayint(1000);
// RST=1;
sendcmd(0x30);//功能设置,一次送8位数据,基本指令集
sendcmd(0x0C);//0000,1100 整体显示,游标off,游标位置off
sendcmd(0x01);//0000,0001 清DDRAM
sendcmd(0x02);//0000,0010 DDRAM地址归位
// sendcmd(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
// sendcmd(0x04);//点设定,显示字符/光标从左到右移位,DDRAM地址加 一
// sendcmd(0x0F);//显示设定,开显示,显示光标,当前显示位反白闪动
}
void write_str(char * str)
{
uchar i;
for(i=0;i<strlen(str);i++)
senddat(*(str+i));
}
void clrscreen()
{
uchar i,j;
sendcmd(0x36);
for(i=0;i<16;i++)
{
for(j=0;j<32;j++)
{
sendcmd(0x80+j);
sendcmd(0x80+i);
senddat(0);
senddat(0);
}
}
}
uint r_power2(uchar n)
{
switch(n)
{
case 15:return 1;break;
case 14:return 2;break;
case 13:return 4;break;
case 12:return 8;break;
case 11:return 16;break;
case 10:return 32;break;
case 9:return 64;break;
case 8:return 128;break;
case 7:return 256;break;
case 6:return 512;break;
case 5:return 1024;break;
case 4:return 2048;break;
case 3:return 4096;break;
case 2:return 8192;break;
case 1:return 16384;break;
case 0:return 32768;break;
default:break;
}
}
void scalewave()
{
uchar i=0;
do
{
// wave[i]=wave[i]*3/16;
wave[i]=(uchar)(wave[i]*3.0/8.0);
i--;
}
while(i!=0);
}
void buildwave()
{
/* uchar i,j,k,m;
for(i=0;i<8;i++)
{
for(m=0;m<2;m++)
{
for(j=0;j<8;j++)
{
dpdata[i*16+m*8+j]=r_power2(7-j);
for(k=m*8+j;k>0;k--)
{
if(wave[i*16+m*8+j]==wave[i*16+k-1])
{
dpdata[i*16+m*8+j]=r_power2(7-j)+dpdata[i*16+k-1];
break;
}
}
}
}
}*/
}
void showwave()
{
/* uchar i;
sendcmd(0x36);
for(i=0;i<128;i++)
{
sendcmd(0x80+wave[i]);
sendcmd(0x80+i/16);
senddat(dpdata[2*(i/2)]);
senddat(dpdata[2*(i/2)+1]);
}*/
uchar i,low;
sendcmd(0x36);
for(i=0;i<128;i++)
{
if(wave[i]<16)
low=1;
else
low=0;
sendcmd(0x80+(47-wave[i])%32);
sendcmd(0x80+i/16+8*low);
senddat((char)(r_power2(i%16)>>8));
senddat((char)r_power2(i%16));
}
}
void storewave()
{
uchar i;
for(i=0;i<128;i++)
{
wave[i]=i;
}
}
/*uint reverse16(uint w)
{
uint chDst;
uchar i;
chDst=w&1;
for( i=0; i<15; i++)
{
chDst<<=1,
w>>=1,
chDst|=(w&1);
}
return chDst;
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -