📄 lcd.c
字号:
#include "config.h"
#include <math.h>
#define Z_bit 2 //子函Disp_anynum中整数位最多为4位
#define F_bit 2 //子函Disp_anynum中小数位最多为2位,即精度为3位
#define weishu 4 //子函Disp_anynum中最大位数=Z_bit+F_bit=3+3=6
#define CS 1<<8
#define SID 1<<10
#define SCLK 1<<13
/******************************************************************************/
void Delaynms(uint32 di) //延时
{
uint16 da,db;
for(da=0;da<di;da++)
for(db=0;db<100;db++);
}
void Delay(uint32 di) //延时
{
uint16 da,db;
for(da=0;da<di;da++)
for(db=0;db<50000;db++);
}
/******************************************************************************/
void Send_byte(uint8 bbyte) //发送一个字节
{
uint8 i;
PINSEL0=0x00000000;
PINSEL1=0x00000000;
IO0DIR=CS|SID|SCLK;
for(i=0;i<8;i++)
{
if(bbyte&0x80)
IO0SET=SID;
else
IO0CLR=SID;
IO0SET=SCLK;
IO0CLR=SCLK;
bbyte<<=1; //左移
}
}
/******************************************************************************/
void Write_char(uint8 start, uint8 ddata) //写指令或数据
{
uint8 start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //写指令
else
start_data=0xfa; //写数据
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
Send_byte(start_data); //发送起始信号
Delaynms(10); //延时是必须的
Send_byte(Hdata); //发送高四位
Delaynms(5); //延时是必须的
Send_byte(Ldata); //发送低四位
Delaynms(5); //延时是必须的
}
/******************************************************************************/
void Lcd_init(void) //初始化LCD
{
Delaynms(50); //启动等待,等LCM讲入工作状态
// PSB=0; ; //串口驱动模式
// RST=0; Delaynms(1); RST=1; // 复位LCD
IO0SET=CS;
Write_char(0,0x30); //8 位介面,基本指令集
Write_char(0,0x0c); //显示打开,光标关,反白关
Write_char(0,0x01); //清屏,将DDRAM的地址计数器归零
}
/******************************************************************************/
void Disp_img(uint8 *img) //图形显示 字模221 横向取膜
{
uint8 i,j;
uint8 k =0 ;
for(i=0;i<32;i++)
{
Write_char(0,0x80+i);
Write_char(0,0x80);
for(j=0;j<16;j++)
{
Write_char(1,img[k++]);
}
}
for(i=0;i<32;i++)
{
Write_char(0,0x80+i);
Write_char(0,0x88);
for(j=0;j<16;j++)
{
Write_char(1,img[k++]);
}
}
}
/****************************************************************************/
void Lcd_img_Cls(void) //图形方式下清屏
{
uint8 i,j;
for(i=0;i<32;i++)
{
Write_char(0,0x80+i);
Write_char(0,0x80);
for(j=0;j<16;j++)
Write_char(1,0x00);///for test
}
for(i=0;i<32;i++)//
{
Write_char(0,0x80+i);
Write_char(0,0x88);
for(j=0;j<16;j++)
Write_char(1,0x00);
}
}
/*-----------------------------------------------------------------------
LCD_set_xy : 设置LCD显示的起始位置,X为行,Y为列
输入参数:x、y : 显示字符串的位置,X:0-15,Y:0-1
LCD第一行显示寄存器地址:0X80-0X8F
LCD第一行显示寄存器地址:0XC0-0XCF
编写日期 :2005
最后修改日期 :2005
-----------------------------------------------------------------------*/
void LCD_set_xy( uint8 x, uint8 y )
{
uint8 address;
switch(x)
{
case 0: address = 0x80 + y; break;
case 1: address = 0x90 + y; break;
case 2: address = 0x88 + y; break;
case 3: address = 0x98 + y; break;
default:address = 0x80 + y; break;
}
Write_char(0, address);
}
/*-----------------------------------------------------------------------
LCD_Write_char_string : 中英文字符串显示函数
输入参数:*s :英文字符串指针;
X、Y : 显示字符串的位置
编写日期 :2005
最后修改日期 :2005
-----------------------------------------------------------------------*/
void LCD_Write_char_string(uint8 X,uint8 Y, uint8 *s)
{
LCD_set_xy( X, Y );
while (*s)
{
Write_char( 1, *s );
s ++;
Delaynms(5);
}
}
/******************************************************************************/
void Disp1num(unsigned char num) //显示数字
{
switch(num)
{
case 0:Write_char(1,'0');break;
case 1:Write_char(1,'1');break;
case 2:Write_char(1,'2');break;
case 3:Write_char(1,'3');break;
case 4:Write_char(1,'4');break;
case 5:Write_char(1,'5');break;
case 6:Write_char(1,'6');break;
case 7:Write_char(1,'7');break;
case 8:Write_char(1,'8');break;
case 9:Write_char(1,'9');break;
}
}
/******************************************************************************/
void Disp_anynum(uint8 x,uint8 y,fp32 num)
{
uint8 i,j;
uint8 LCD[weishu]; //子函Display_anynum中存储各位数的值
uint32 date,N10;
for(i=0,N10=1;i<F_bit;i++)
N10*=10;
date=(int32)(num*N10);
for(i=0,N10=1;i<weishu-1;i++)
N10*=10;
for(i=0;i<weishu;i++) //分离各位数
{
LCD[i]=date/N10%10;
N10/=10;
}
LCD_set_xy(x,y);
for(i=0;i<Z_bit;i++) //显示整数部分
{
if(LCD[i]!=0)
Disp1num(LCD[i]); //显示非0值
else
{
if(i>0)
{
for(j=0;j<i;j++)
if(LCD[j]!=0) break;
if(j<i)
Disp1num(LCD[i]); //显示0
else if(i==Z_bit-1)
Disp1num(LCD[i]); //显示0
}
}
}
Write_char(1,'.'); //显示小数点
for(i=0;i<F_bit;i++)
Disp1num(LCD[i+Z_bit]); //显示小数部分
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -