📄 lcd_curl.c
字号:
#include <C8051F310.h>
#define byte unsigned char
#define ZLG_7290 0x70 //ZLG7290 从器件地址
#define ZLG7290_Key 0x01 //键盘地址
#define LCD_ROLL_UP_KEY 7 //图像上卷
#define LCD_ROLL_DOWN_KEY 1 //图像下卷
#define LCD_Write_Command 0xF8 //写命令(起始命令)
#define LCD_Write_Data 0xFA //写数据
#define LCD_Read_State 0xFC //读状态
#define LCD_Clear_Screen 0x01 //清除显示
#define LCD_Reset_Address 0x02 //地址归位
#define LCD_Cursor_Dir 0x04 //点设定
#define LCD_Disp_mode 0x08 //显示状态
#define LCD_Cursor_Ctrl 0x10 //光标或显示移位控制
#define LCD_BasicFun_Set 0x30 //功能设定(基本指令集动作)
#define LCD_ExtCommand_off 0x34 //扩展功能设定,此命下发送GDRANM地址
#define LCD_ExtCommand_on 0x36 //开启绘图
#define LCD_Picture_UP_Addr 0x80 //上半屏x起始坐标
#define LCD_Picture_DN_Addr 0x88 //下半屏x起始坐标
#define LCD_Picture_ROLL_Addr 0xA0 //卷动屏下半屏x起始坐标
//extern void LCD_GDRAM_Clear();
extern void Write_Command_To_LCD(char Command);
extern void Write_Data_To_LCD(byte Data);
//extern void Init_Device();
extern void LCD_Init();
unsigned long int a;
unsigned int pp=0;
unsigned int sp[16];
int Current_Param[2];
/******************************************************
转换成电压数值函数
*******************************************************/
void to_Volt()
{
a=3300; //放大1000倍,把小数变为整数
a=a*pp; //pp为传进来的AD转换后的二进制电压值
a>>=10; //最后的电压值=pp*3.3/1024
}
/****************************************************
定时器0溢出中断,每50毫秒溢出一次即采集一次数据
**************************************************/
void Timer0_Over_Interrupt() interrupt 1
{
static char p=0;
TL0 = yy%256;
TH0 = yy/256; //初值,计数范围5000
AD0EN = 1;
AD0BUSY=1; //启动转换
while(AD0BUSY==1); //等待结束
AD0BUSY=1; //启动转换
PCA0CPH4 =0x00;
while(AD0BUSY==1); //等待结束
adv.c[0]=ADC0H;
adv.c[1]=ADC0L;
sp[p]=adv.i&0x3ff; //数据放入缓存取A/D转换的有效十位
p+=1;p&=15;
AD0EN = 0;
}
/*******************************************************
滤波函数,取16个值,舍弃最大4个值和最小4 个值中间8个取平均
********************************************************/
void filter()
{
char x=0,y=0;
unsigned int fil_buf[16];
unsigned int change;
for(x=0;x<16;x++) (fil_buf[x]= sp[x]); /*按从小到大顺序
排列*/
for(x=0;x<15;x++)
{
for(y=x+1;y<16;y++)
{
if(fil_buf[y]<fil_buf[x])//相邻两个数比较大小
{
change=fil_buf[y];
fil_buf[y]=fil_buf[x];
fil_buf[x]=change;
}
PCA0CPH4 =0x00;
}
PCA0CPH4 =0x00;
}
for(y=4;y<=12;y++) //舍弃前4个最小值和后4个最大值
{ pp+=fil_buf[y]; //对中间8个数求和
PCA0CPH4 =0x00;
}
pp>>=3; ////右移3位是对采集进来滤波后的8个电压总和取平均值
}
void Data_Transfer()
{
static unsinged char i=0;
if(i<15)
{
Current_Param[0]=fil_buf[i];
Current_Param[1]=fil_buf[++i];
}
else i=0;
}
/******************************
????????
******************************/
void bligt_on_off()
{
static unsigned char cur=0,obj=0;
unsigned char j,col,b_first,b_later;
int xi,xj;
xi=Current_Param[1]-Current_Param[0];
hp=(unsigned int)a;
for(col=0;col<8;col++)
{
b_first=0x80;
b_later=0x80;
for(j=0;j<16;j++) //写16个点后横坐标加一
{
Data_Transfer();
if(xi<0)
{
xj=Current_Param[0]-Current_Param[1];
if(xj>64)
{
xj=64;
}
cur=xj;
}
else if(xi>64)
{
xi=64;
cur=xi;
}
else
{
cur=xi;
}
obj=cur;
if(obj<32) //上半屏
{
Write_Command_To_LCD(LCD_ExtCommand_off);
Write_Command_To_LCD(LCD_Picture_UP_Addr+obj); //纵坐标0x80+xi
Write_Command_To_LCD(LCD_Picture_UP_Addr+col); //横坐标
Write_Command_To_LCD(LCD_BasicFun_Set);
}
else //下半屏
{
Write_Command_To_LCD(LCD_ExtCommand_off);
Write_Command_To_LCD(LCD_Picture_UP_Addr+obj-32); //纵坐标0x80+xi
Write_Command_To_LCD(LCD_Picture_DN_Addr+col); //横坐标
Write_Command_To_LCD(LCD_BasicFun_Set);
}
if(j<8)
{
Write_Data_To_LCD(b_first);
Write_Data_To_LCD(0x00);
b_first>>=1;
}
else
{
Write_Data_To_LCD(0x00);
Write_Data_To_LCD(b_later);
b_later>>=1;
}
}
}
}
}
void maim( )
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -