cs5460程序12864串行显示

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include
//#include
#include

#define uchar unsigned char
#define uint unsigned int

//CS5460A的变量设置及端口设置
sbit SDO=P3^3;
sbit SDI=P1^6;
sbit CLK=P1^7;
sbit CS=P3^4;
sbit RESTEN=P3^2;



/****************************************************************************/
//128*64引脚定义
sbit RS = P2^6; //此管脚没用
sbit SID = P2^5; //数据
sbit SCLK = P1^1; //时钟
sbit PSB = P2^4;
#define comm 0
#define dat 1
#define x1 0x80
#define x2 0x88
#define y 0x80

uchar idata d[2][5];//存放转后以后三个温度的ASCII码
uchar code tab1[]={" 电压电流显示 "};
uchar code tab2[]={" 电压值: V"};
uchar code tab3[]={" 电流值: A"};

uint c;
uint RawTemp_byte_MSB;
uint RawTemp_byte_LSB;
uint RawTemp_uVal;
uint RawTemp_uValu;
//int RawTemp_byte_MSB;
//int RawTemp_byte_LSB;
long int RawTemp_uVal1;
long int RawTemp_uVal2;
uchar v[4][5];
uchar idata q[4][5];
//uchar idata c1[3];
//uchar i[2][2];
uint v0;
uint i0;
long int t0;
//uint q0,y;
uint s0;

void s_write_byte(unsigned char value);
char s_read_byte();
/****************************************************************************/
//函数声明
void lcm_w_word(uchar addr,unsigned char *str) ; //写字符 例:lcm_w_word("您好!");
void lcm_w_test(bit start,unsigned char ddata); //(0,指令) (1,数据)
void lcm_w_byte(unsigned char bbyte); //写一个字节给lcm
void delaynms(unsigned int di); //延时
void lcm_init(void); //lcm初始化
void lcm_clr(void); //清屏




void delayXms(uint dlycnt) //延时1ms
{
uint i;
for(;dlycnt>0;dlycnt--)
{
for(i=0;i<920;i++)
{;}
}
//i=0;
}

//延时子程序
void delay(void)
{_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();
}
void delayms1(void)
{ unsigned int i;
for(i=0;i<2536;i++)
{delay();
}
}

/*void delayms(uint dlycnt) //延时1ms
{
uint i;
for(;dlycnt>0;dlycnt--)
{
for(i=0;i<124;i++)
{;}
}

} */
/*******************lcd串行子程序*************************/
/****************************************************************************/
//初始化LCM
void lcm_init(void) {
delaynms(100); //启动等待,等LCM讲入工作状态
lcm_w_test(0,0x30); //8 位介面,基本指令集
lcm_w_test(0,0x0c); //显示打开,光标关,反白关
lcm_w_test(0,0x01); //清屏,将DDRAM的地址计数器归零
delaynms(100); //启动等待,等LCM讲入工作状态
}
/******************************************************************************/
//写指令或数据 (0,指令) (1,数据)
void lcm_w_test(bit start, unsigned char ddata) {
unsigned char start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //0:写指令
else
start_data=0xfa; //1:写数据


Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
lcm_w_byte(start_data); //发送起始信号
delaynms(5); //延时是必须的
lcm_w_byte(Hdata); //发送高四位
delaynms(5); //延时是必须的
lcm_w_byte(Ldata); //发送低四位
delaynms(5); //延时是必须的
}

/******************************************************************************/
//发送一个字节(底层函数)
void lcm_w_byte(unsigned char bbyte) {
unsigned char i;
for(i=0;i<8;i++){
SID=bbyte&0x80; //取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1; //左移
}
}

/******************************************************************************/
//延时(LCM占用)
void delaynms(unsigned int di) {
unsigned int da,db;
for(da=0;dafor(db=0;db<10;db++);
}

/*****************************************************************************/
//清屏函数
void lcm_clr(void){
lcm_w_test(0,0x01);
delaynms(40); //启动等待,等LCM讲入工作状态

}
/*****************************************************************************/
//向LCM发送一个字符串,长度64字符之内。
//应用:lcm_w_word(0x80,"您好!");
void lcm_w_word(uchar addr,unsigned char *str)
{
lcm_w_test(0,addr);//写入显示地址
while(*str != '\0')
{
lcm_w_test(1,*str++);
}
*str = 0;
}
/*****************************************************************************/
//向LCM发送一个数组
//应用:
/**********************************************
locat:字符的起始位置,范围为80到9F()
cnt:显示的字符个数
*str:指向要显示的字符指针
**************************************************
void lcm_w_array(uchar locat,uchar cnt,uchar *str)
{
lcm_w_test(0,locat);//写入起始地址
while(*str != '\0')
{
lcm_w_test(1,*str++);
}
*str = 0;
}*/
////////////////////////////////
/**********************************************************
;子程序名 fan(uchar lcd_x,uchar lcd_y,uchar width)
;功 能:12864液晶反白子程序
;说 明: X第几个字(1~8),Y第几行(1~4行),width反白的宽度(1~16)(单位:字符)
若width==0则上次反白的位置变为正常显示,若width!=0,上次反白的位
置变为正常显示,则这次反白的位置反白。
;调 用:fan(uchar lcd_x,uchar lcd_y,uchar width)
;设 计:启蒙电子
;修 改:豆豆
;**********************************************************/
/*void fan(uchar lcd_x,uchar lcd_y,uchar width)
{
uchar xx,yy,i,j,t;
yy=0x80;xx=0x80;
lcm_w_test(comm,0x36);
for (i=0;i<32;i++)
{
lcm_w_test(comm,yy++);lcm_w_test(comm,xx);
for (j=0;j<16;j++)
{ lcm_w_test(dat,0x00);}
}
yy=0x80;xx=0x88;
for (i=0;i<32;i++)
{
lcm_w_test(comm,yy++);lcm_w_test(comm,xx);
for (j=0;j<16;j++)
{ lcm_w_test(dat,0x00);}
}

lcm_w_test(comm,0x30);
//-------------------------------------------
if(width!=0)
{
t=lcd_x%2;
if(lcd_y>2)
{
xx=lcd_x+0x87;
yy=((lcd_y-3)<<4)+0x80;
}
else
{
xx=lcd_x+0x7f;
yy=((lcd_y-1)<<4)+0x80;
}
//-----------------------------------------
lcm_w_test(comm,0x36);
for (i=0;i<16;i++)
{
lcm_w_test(comm,yy++);lcm_w_test(comm,xx);
for (j=0;j{ lcm_w_test(dat,0xff);}
}
lcm_w_test(comm,0x30);
}
} */
//十六进制数转换成十进制再变成ASCII码
void SixtoT1(unsigned int t,unsigned char a[])
{
a[0]=t/10000+0x30;
a[1]=t%10000/1000+0x30;
a[2]=t%1000/100+0x30;
a[3]=t%100/10+0x30;
a[4]=t%10+0x30;
}
/*****************************************************
*************功率芯片CS5460A**************************
******************************************************/
//CS5460A的初始化函数
void Init()
{
RESTEN=0;
// delayms1();
delayms1();
RESTEN=1;


s_write_byte(0xff);//写三个同步命令1之后再写一个同步命令0
s_write_byte(0xff);
s_write_byte(0xff);
s_write_byte(0xfe);

s_write_byte(0x40);//写配置寄存器
s_write_byte(0x00);//电流通道增益=10
s_write_byte(0x00);
s_write_byte(0x01);//dclk=mclk/1

s_write_byte(0x5e);//清状态寄存器
s_write_byte(0xff);
s_write_byte(0xff);
s_write_byte(0xff);

s_write_byte(0x74);//写中断屏蔽寄存器
s_write_byte(0x00);
s_write_byte(0x00);
s_write_byte(0x00);

s_write_byte(0x78);//写控制寄存器
s_write_byte(0x00);
s_write_byte(0x00);
s_write_byte(0x00);

s_write_byte(0x4A);//写CYCLE COUNT寄存器
s_write_byte(0x00);
s_write_byte(0x01);
s_write_byte(0x90);

s_write_byte(0xe8);//启动CS5460A

delayms1(); //读电压值
while(1)
{s_write_byte(0x1e);
RawTemp_byte_MSB=s_read_byte();
RawTemp_byte_LSB=s_read_byte();
c=s_read_byte();
if(RawTemp_byte_MSB&0x80)
break;
}
}


void s_write_byte(unsigned char value)//输入发送命令值,返回发送完毕状态
{
unsigned char i;
CLK=0;
CS=0;
//delay();
for(i=0;i<8;i++)
{if(value&0x80)
{SDI=1;}
else
{SDI=0;}
delay();
CLK=1;
value<<=1;
delay();
_nop_();
_nop_();
CLK=0;
delay();

}
CS=1;
SDI=1;
}
char s_read_byte()//读出所测数据
{
unsigned char i,j=0;
unsigned char data1;
data1=0;
CS=0;
CLK=0;
for (i=0x80;i>1;i/=2)
{SDI=1;
CLK=0;
delay();
delay();
CLK=1;
// delay();

if(SDO)
// if(0)
{
data1=(data1 | i);
}
//data<<=1;
}
SDI=0;
CLK=0;
delay();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
CLK=1;
delay();
_nop_();

_nop_();_nop_();_nop_();
if(SDO)
//if(1)
{data1=data1+1;}
CLK=0;
SDI=1;
delay();
CS=1;
//data = 0xfe;
return data1;
}


void vol()
{
//uchar i,j,k;
// sum[0]=0;
Init();
s_write_byte(0x18); //读电压值
RawTemp_byte_MSB=s_read_byte();
RawTemp_byte_LSB=s_read_byte();
c=s_read_byte();
delay();
RawTemp_uVal=((RawTemp_byte_MSB<<8)|(RawTemp_byte_LSB&0x00FF));
RawTemp_uValu=RawTemp_uVal/98;
//SixtoT(RawTemp_uVal/98,v[0]);
//GetChar_U(RawTemp_uValu,cod[0]);//显示
}

/*void current()
{
//uchar i;
Init();
//s_write_byte(0x5e);
s_write_byte(0x16); //读电流值
RawTemp_byte_MSB=s_read_byte();
RawTemp_byte_LSB=s_read_byte();
c=s_read_byte();
delay();
RawTemp_uVal1=((RawTemp_byte_MSB<<8)|(RawTemp_byte_LSB&0x00FF));

//RawTemp_uVal1=(RawTemp_uVal1*100)/2565.4;
//i0=RawTemp_uVal1;
i0=(RawTemp_uVal1*100/390);
//GetChar_I(i0,cod[0]);
} */

void main()
{
PSB=0;//设置液晶串行传输
delayXms(100);
lcm_init();//初始化液晶显示器
lcm_clr();//清屏
lcm_w_test(0,0x80); //第一行\:80-87 第三行:88-8F 第二行90-97 第四行 :98-9F
lcm_w_test(1,0x20);//初始化时在第一行先发送0x20-空格
lcm_w_word(0x80,tab1);
lcm_w_word(0x90,tab2);//显示电压字字样
lcm_w_word(0x88,tab3);
Init();
while(1)
{
vol();
SixtoT1(RawTemp_uVal,d[0]);//c[*]里面放的是转换后的ASCII
lcm_w_word(0x95,d[0]);
//delayXms(10);
//显示
//delayms(1000);

//current();
//显示
//delayms(1000);
}

}

相关文档
最新文档