📄 lcd.c
字号:
//**************************************************************************************************************************
#include <c8051F020.h>
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "HEAD.H"
//**************************************************************************************************************************
void LCD_C_D(bit flag,unsigned char ldata)
{
A0 = !flag;
RD = 1;
WR = 1;
CS_LCD = 1;
P3 = LcdDataChange(ldata); // 由于硬件数据线相反
CS_LCD = 0;
WR = 0;
CS_LCD = 1;
WR = 1;
}
//**************************************************************************************************************************
void ChangeV(unsigned char changevol)
{
LCD_C_D(1,0x81); // 设置电量值寄存器
LCD_C_D(1,changevol); // V5 as 1/7
}
//**************************************************************************************************************************
void LCD_INIT(void)
{
xdata unsigned char i,j,st_data;
Delay_ms(200);
LCD_CLEAR();
LCD_C_D(1,0xA1); // Display ON(1)/OFF(0) 设置reverse的显示模式,seg132->seg1/
LCD_C_D(1,0x40); // 8.4ADD //0x20 //Display Start Line Address
for(i=0;i<8;i++) // 设置各page地址的column地址从0开始
{
st_data = i|0xB0;
LCD_C_D(1,st_data);
LCD_C_D(1,0x10);
LCD_C_D(1,0);
for (j=0;j<130;j++) // 清空显示RAM
{
LCD_C_D(0,0);
}
}
ChangeV(90);
LCD_C_D(1,0xA4); // 显示所有点
LCD_C_D(1,0xA6); // 正常显示
LCD_C_D(1,0xA3); // 设置电压基准比例1/7,a2
LCD_C_D(1,0xC8); // 设置列扫描方向反转,c0
LCD_C_D(1,0x2F); // 电源供电操作模式boosting on/ regulator on/follower ON
LCD_C_D(1,0x81); // 设置电量值寄存器
LCD_C_D(1,0x64); // V5 as 1/7
LCD_C_D(1,0x23); // 内部电阻比例模式23,27
LCD_C_D(1,0xAD); // 静态指示常亮模式//cancle
LCD_C_D(1,0x03); // cancle
LCD_C_D(1,0xAF); // 设置显示模式ON
//LCD_DispStr("RotateSpeed",MainShowAddr,30);
disp_chn_str("抽油机转速仪",5,20,16,1);
//LCD_DispStr("Beijing Goldentime",MainShowAddr+30,10);
disp_chn_str("北京金时",40,35,16,1);
Display_Data();
Delay_ms(3000);
}
//**************************************************************************************************************************
void LCD_CLEAR(void)
{
xdata unsigned char i,j;
for (j = 0 ; j < 8 ; j ++)
{
for (i = 0 ; i< 128 ; i ++)
{
disp_ram[j][i] = 0x00;
}
}
Display_Data();
}
//**************************************************************************************************************************
void LCD_Cursor_Show(unsigned char lay_y,unsigned char lay_x)
{
draw_line(lay_x-2,lay_y+8,lay_x+4,lay_y+8);
Display_Data();
}
//**************************************************************************************************************************
//送显示缓冲区到显示屏 此液晶屏分左右半屏送显示缓冲区到显示屏是要分别写LCS2选通左半屏LCS1选通右半屏
void Display_Data(void)
{
xdata unsigned char i,j,disp_page;
disp_page = 0xB4;
for(i =0 ; i < 8; i++)
{
LCD_C_D(1,disp_page);
LCD_C_D(1,0x10); // 设置列地址高位
LCD_C_D(1,0x02); // 设置列地址低位0
for (j = 0;j < 128; j++)
{
LCD_C_D(0,disp_ram[i][j]) ;
}
disp_page ++;
if(disp_page > 0xB7)
disp_page = 0xB0;
}
ChangeV(RTUaddress4[33]);
}
//**************************************************************************************************************************
unsigned char LcdDataChange(unsigned char datas)
{
xdata unsigned char i,tempd;
xdata unsigned char bb[8];
tempd=datas;
for(i=0;i<8;i++)
{
if((tempd & 0x01)==0x01)
bb[i]=1;
else
bb[i]=0;
tempd>>=1;
}
tempd=bb[0]*0x80+bb[1]*0x40+bb[2]*0x20+bb[3]*0x10+bb[4]*0x08+bb[5]*0x04+bb[6]*0x02+bb[7]*0x01;
return tempd;
}
//**************************************************************************************************************************
void draw_line(unsigned char x1, unsigned char y1,unsigned char x2, unsigned char y2)
{
xdata unsigned char i,line,page;
xdata float add_step,temp_step;
if(x1 > 126){x1 = x1 - 114;}
if(x2 > 126){x2 = x2 - 114;}
if(y1 > 64){y1 = y1 - 64;}
if(y2 > 64){y2 = y2 - 64;}
if((x1 == x2) && (y1 == y2))
{
line = y1 & 0x07; page = y1 >> 3;
disp_ram[page][x1] |= (0x01 << line);
}
else if(x1 == x2 )
{
if( y1 > y2 ) {i = y2; y2 = y1; y1 = i;}
for(i = y1; i <= y2 ;i++ )
{
line = i & 0x07; page = i >> 3;
disp_ram[page][x1] |= (0x01 << line);
}
}
else if(y1 == y2 )
{
if( x1 > x2 ) {i = x2; x2 = x1; x1 = i;}
line = 0x01 << (y1 & 0x07); page = y1 >> 3;
for(i = x1; i <= x2 ;i++ )
{
disp_ram[page][i] |= line;
}
}
else
{
if((abs)(y2-y1) >= abs(x2-x1))
{
temp_step = x1;
add_step = ((float)x2-(float)x1)/abs((float)y2-(float)y1);
if(y1 > y2) i = 1; else i = 0;
do
{
x1 = temp_step;
line = y1 & 7; page = y1 >> 3;
disp_ram[page][x1] |= (0x01 << line);
temp_step += add_step;
if(i) y1--; else y1++;
}while(y1 != y2);
line = y2 & 0x07; page = y2 >> 3;
disp_ram[page][x2] |= (0x01 << line);
}
else
{
temp_step = y1;
add_step = ((float)y2-(float)y1)/abs((float)x2-(float)x1);
if(x1 > x2) i = 1; else i = 0;
do
{
y1 = temp_step;
line = y1 & 0x07;
page = y1 >> 3;
disp_ram[page][x1] |= (0x01 << line);
temp_step += add_step;
if(i) x1 -- ; else x1 ++;
}while(x1 != x2);
line = y2 & 0x07; page = y2 >> 3;
disp_ram[page][x2] |= (0x01 << line);
}
}
}
//**************************************************************************************************************************
//入口为井名字符代码串指针,显示行值,列值,间隔
void LCD_DispStr(unsigned char *addr_da, char disp_x, char disp_y)
{
xdata unsigned char ia;
xdata unsigned char StrLong;
ia = *addr_da++;
//StrLong=lenth;
StrLong=strlen(addr_da)+1;
while((ia)&&(StrLong))
{
if(ia >= 97 && ia <= 122)//"a-z"
{
display_asc8x8((ia - 0x2A - 32), disp_x , disp_y, 1,1);//换成大写的字母
}
else if(ia == 0x20)
{
display_asc8x8(49, disp_x , disp_y, 1,1);//空格
}
else if (ia > 125 || ia < 27)
{
display_asc8x8(0 , disp_x , disp_y, 1,1);
}//如果不是asc2码,用*表示
else
{
display_asc8x8((ia - 0x2A), disp_x, disp_y, 1,1);
}
disp_y += 6;
ia = *addr_da++;
StrLong --;
}
}
//**************************************************************************************************************************
//显示一个字符程序,asc_position为在ASC8X8的一维次序,
void display_asc8x8(char asc_position,unsigned char page, unsigned char column, char val,unsigned char fx)
{
xdata unsigned char *ptr;
ptr = ASC8X8[asc_position];
display_asc8x6(ptr, page, column, val,fx);
}
//**************************************************************************************************************************
//显示8*6asc字符,将要显示的字符放在显示缓冲区中。asc字符可以选择是否覆盖原有显示,当val = 1时清除原有内容,
void display_asc8x6(unsigned char *data_ptr,unsigned char page, unsigned char column, char val,unsigned char fx)
{
xdata unsigned char i,j,k,st_data,page1,column1;
xdata unsigned char ii,ij;
xdata unsigned char hzdata[8];
xdata unsigned char hz_temp[8];
unsigned char code *ptr;
ptr = data_ptr;
page1 = page;
column1 = column;
if(column1 > 122) column1 = 0;//列数到尾
for (i=0;i<8;i++)
{
if(fx == 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -