📄 160104_s6b0719.c.bak
字号:
/*液晶160104_S6B0719驱动*/
/*驱动时序 6800*/
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#include "zm.h"
#define uchar unsigned char
#define uint unsigned int
/*端口定义
d7-d0=P 7-P 0
E=PD7;
R/W=PD6;
D/I=PD2;
/RESET=PD4;
/CS=PD3;
*/
#define LCD_PORT PORTC
#define LCD_PORT_DDR DDRC
#define LCD_PORT_PIN PINC
#define set_E asm("sbi 0x12,7")// E=pd7
#define clr_E asm("cbi 0x12,7")
//#define set_RW asm("sbi 0x12,6")// RW=pd6 测试板上已被拉底,与地短接
//#define clr_RW asm("cbi 0x12,6")
#define set_DI asm("sbi 0x12,2")// DI=pd2
#define clr_DI asm("cbi 0x12,2")
#define set_RESET asm("sbi 0x12,4")// RESET=p4
#define clr_RESET asm("cbi 0x12,4")
#define set_CS asm("sbi 0x12,3")// cs=pd3
#define clr_CS asm("cbi 0x12,3")
uchar lcd_status;
uchar lcd_data;
uchar lcd_currentX;
uchar lcd_currentY;
#define xtal 4
void delay_1ms(void)
{ unsigned int i;
for(i=1;i<(unsigned int)(xtal*143-2);i++)
;
}
void delay_nms(unsigned int n)
{
unsigned int i=0;
while(i<n)
{delay_1ms();
i++;
}
}
//uchar asc[4];
/*void read_status(void)
{
LCD_PORT_DDR = 0x00;
LCD_PORT = 0xff;
DDRD = 0xff;
//clr_E;
clr_CS;
clr_DI;
set_RW;
set_E;
//NOP();
LCD_status = LCD_PORT_PIN;
//NOP();
//NOP();
clr_E;
clr_RW;
set_DI;
NOP();
//set_CS;
} */
/*void read_data(void)
{
LCD_PORT_DDR = 0x00;
DDRD = 0xff;
clr_CS;
set_DI;
set_RW;
set_E;
NOP();
LCD_data = LCD_PORT_PIN;
NOP();
clr_E;
clr_RW;
clr_DI;
NOP();
//set_CS;
} */
void write_comm(uchar comm)//6800
{
LCD_PORT_DDR = 0xff;
DDRD = 0xff;
LCD_PORT = comm;
clr_DI;
set_E;
NOP();
clr_E;
NOP();
}
void write_data(uchar data)
{
LCD_PORT_DDR = 0xff;
DDRD = 0xff;
LCD_PORT = data;
set_DI;
set_E;
NOP();
clr_E;
NOP();
}
void set_page_add(uchar page)//page =0-13
{
write_comm( 0xB0|page );
}
void set_column_add(uchar column)//column =0-159
{
uchar msb_column;
uchar lsb_column;
msb_column = column>>4;
lsb_column = column&0x0f;
write_comm( 0x10|msb_column );
write_comm( lsb_column );
}
void display_on(uchar on)//on=1开显示 on=0关显示
{
write_comm( 0xAE|on );
}
void set_init_line(uchar line)
{
write_comm( 0x40 );
write_comm( line );
}
void set_com0( uchar com )
{
write_comm( 0x44 );
write_comm( com );
}
void set_display_duty(uchar duty)//duty=1/105
{
write_comm( 0x48 );
write_comm( duty );
}
void set_nline_inver( uchar n)
{
write_comm( 0x4C );
write_comm( n );
}
void rel_nline_inver( void )
{
write_comm( 0xE4 );
}
void reve_display_on(uchar rev)//反显 rev=1开反显 rev=0关反显
{
write_comm( 0xA6|rev );
}
void entir_display_on(uchar eon)//强制显示 eon=1开强显 eon=0关强显
{
write_comm( 0xA4|eon );
}
void power_control(uchar vc,uchar vr,uchar vf)
{
uchar control = 0;
control |= (vc<<2)|(vr<<1)|vf;
write_comm( 0x28|control);
}
void dc_setup()//dc=3
{
write_comm( 0x67 );
}
void resistor_sel(uchar r)//r=0-7,内部电阻设置
{
write_comm( 0x20|r );
}
void set_ref(uchar ev)//ev=0-63内部参考电压设置
{
write_comm( 0x81 );
write_comm( ev );
}
void sel_LCD_bias(void)//设置偏压,bias=1/11
{
write_comm( 0x57 );
}
void sel_shl(uchar shl)//shl=0 normal;shl=1 reverse
{
shl = shl<<3;
write_comm( 0xC0|shl );
}
void sel_adc(uchar adc)//adc=0 normal;adc=1 reverse
{
write_comm( 0xA0|adc );
}
void set_static_indicator(uchar sm,uchar s )//静态指令模式
{
if (sm==0) s=0;
write_comm( 0xAC|sm );
write_comm( s );
}
void osc_start(void )//打开内部振荡器
{
write_comm( 0xAB );
}
void lcd_reset(void )//lcd复位
{
write_comm( 0xE2 );
}
void lcd_power_save(uchar p)//P=1 sleep mode;p=0 standby
{
write_comm( 0xA8|p );
}
void lcd_rel_power_save(void)
{
write_comm( 0xE1 );
}
void lcd_clear(void)
{
uchar a,b;
for (a=0;a<14;a++)
{ set_page_add( a );//set page
set_column_add( 0 );
for (b=0;b<160;b++)
{ write_data(0x00); }
}
}
void lcd_clear_part(uchar add_x,uchar add_y,uchar w,uchar h)
{ uchar i,j;
for (i=0;i<h;i++)
{ set_page_add(add_y);
set_column_add(add_x);
for (j=0;j<w;j++)
{ write_data(0x00);
}
add_y++;
}
}
void init_160104(void)
{
DDRD = 0xff;
delay_nms( 500 );
clr_RESET;
delay_nms(100);
set_RESET;
set_display_duty(105);//display duty select
sel_adc( 0 );//adc select
sel_shl( 1 );//shl select
set_com0( 0 );//com0 register select
osc_start();//oscillator on
dc_setup();//DC-DC Step-up Register Select,6times boosting
power_control( 1, 0, 0 );//VC on
delay_nms(30);//delay 30ms
resistor_sel(7);//Regulator Resistor Select
set_ref(63);//Electronic Volume Register Select
power_control( 1, 1, 0 );//VR on
delay_nms(5);//delay 5ms
sel_LCD_bias();//设置偏压//LCD Bias Register Select
power_control( 1, 1, 1 );//VF on
delay_nms(40);//delay 40ms
display_on(1);//开显示
set_init_line(0);
lcd_clear();//清屏
resistor_sel(5);
set_ref(40);
}
/*======================================
显示ascii码字符串
add_x 0-13 add_y 0-159
======================================*/
void wri_asc_8x16_s(uchar add_x,uchar add_y,uchar *ascii_s)
{ uchar i=0;
uchar const *P;
lcd_currentX = add_x;
lcd_currentY = add_y;
while (*ascii_s != 0)
{ i=0;
while(i != ASCII_8x16_NUMBER)//查找字模
{
if(*ascii_s == ascii_8x16_code[i])
break;
i++;
}
P = ascii_8x16_dot +i*16;
wri_image(lcd_currentX,lcd_currentY,8,2,P);
lcd_currentX+=8;
ascii_s++;
}
}
/*======================================
显示汉字(16x16)字符串
add_x 0-159 add_y 0-13
======================================*/
void wri_chinese_s(uchar add_x,uchar add_y,uchar *chinese_s)
{ uchar i=0;
uchar const *P;
uint hz;
lcd_currentX = add_x;
lcd_currentY = add_y;
while (*chinese_s != 0)
{ i=0;
hz=*chinese_s;
chinese_s++;
hz= (hz<<8)+*chinese_s;
while(i != CHINESE_CHAR_NUMBER)//查找字模
{
if(hz == chinese_16x16_code[i])
break;
i++;
}
P = chinese_16x16_dot +i*32;
wri_image(lcd_currentX,lcd_currentY,16,2,P);
lcd_currentX+=16;
chinese_s++;
}
}
void wri_asc_4x8_s(uchar add_x,uchar add_y,uchar *ascii_s)
{ uchar i=0;
uchar const *P;
lcd_currentX = add_x;
lcd_currentY = add_y;
while (*ascii_s != 0)
{ i = *ascii_s-48;
P = ascii_4x8_dot +i*4;
wri_image(lcd_currentX,lcd_currentY,4,1,P);
lcd_currentX+=4;
ascii_s++;
}
}
/*======================================
add_x 0-159列地址; add_y 0-13页地址;
w 宽度,像素为单位; h 显示高度,字节为单位;
*data 显示数据;
=======================================*/
void wri_image(uchar add_x,uchar add_y,uchar w,uchar h,const uchar *data)
{ uchar i,j;
for (i=0;i<h;i++)
{ set_page_add(add_y);
set_column_add(add_x);
for (j=0;j<w;j++)
{ write_data(*data);
data++;
}
add_y++;
}
}
/*======================================
图标显示函数
x 坐标
data 0 暗; 1 亮
=======================================*/
void wri_ico(uchar x,uchar data)
{ uchar i;
set_page_add(13);
set_column_add(x);
write_data(data);
}
/*======================================
用图标显示数值
add_ico 段地址;data 显示数据,先送低位
======================================*/
void wri_led(uchar add_ico,uchar data_ico)
{ uchar i;
uchar add,data;
add = add_ico;
for (i=0;i<7;i++)
{ data = data_ico&0x01;
wri_ico(add,data);
data_ico = data_ico>>1;
add++;
}
}
/*======================================
用图标显示压力值
选ico段地址55-75
======================================*/
void wri_led_pressure(uint data_pressure)
{ uchar i,j;
uchar add;
add = 69;
for (i=0;i<3;i++)
{ j = data_pressure%10;
data_pressure /= 10;
wri_led(add,LED7Code[j]);
add -= 7;
}
}
/*======================================
画横线函数
add_x 行坐标0-104
add_y 列坐标0-160
length 长度
======================================*/
void wri_line_h(uchar add_x,uchar add_y,uchar length)
{ uchar page,line_data;
uchar l,j;
page = add_y>>3;//取页地址
l = add_y%8;
line_data=1<<l;
set_page_add(page);
set_column_add(add_x);
for (j=0;j<length;j++)
{ write_data(line_data);
}
}
/*======================================
画纵线函数
add_x 行坐标0-104
add_y 列坐标0-160
high 高度
======================================*/
void wri_line_v(uchar add_x,uchar add_y,uchar high)
{ uchar page_start,page_end;
uchar data_start,data_end;
uchar i,j,page;
page_start = add_y>>3;//取页地址
page_end = (add_y+high-1)>>3;//取页地址
data_start = 0xff<<( (add_y)%8 );
data_end = 0xff>> (8-(add_y+high)%8);
j = page_end-page_start+1;
page = page_start;
for (i=0;i<j;i++,page++)
{ set_page_add(page);
set_column_add(add_x);
if(page==page_start) write_data(data_start);
else if(page==page_end) write_data(data_end);
else write_data(0xff);
}
}
void hex_to_ascii(uchar hex,uchar *asc)
{ int i;
for (i=2;i>=0;i--)
{ asc[i]=hex%10+48;
hex = hex/10;
}
asc[3]=0;
}
void wri_hex(uchar add_x,uchar add_y,uchar hex)
{ uchar asc_temp[4];
hex_to_ascii(hex,asc_temp);
wri_asc_8x16_s(add_x,add_y,asc_temp);
}
void menu_main(void)
{ uchar i;
wri_chinese_s(44,1,"收缩压");
wri_hex(100,1,Systolic);
wri_asc_8x16_s(124,1,"mmHg");
wri_image(30,1,14,2,round);
wri_chinese_s(44,4,"舒张压");
wri_hex(100,4,Diastolic);
wri_asc_8x16_s(124,4,"mmHg");
wri_chinese_s(44,7,"心率");
wri_hex(100,7,Pulse_rate);
wri_asc_8x16_s(124,7,"/Min");
wri_chinese_s(44,11,"高级设置");
wri_line_h(16,7,10);
wri_line_h(16,103,10);
wri_line_v(16,7,96);
wri_line_v(26,7,96);
wri_asc_4x8_s(4,0,"300");
wri_asc_4x8_s(4,2,"250");
wri_asc_4x8_s(4,4,"200");
wri_asc_4x8_s(4,6,"150");
wri_asc_4x8_s(4,8,"100");
wri_asc_4x8_s(8,10,"50");
wri_asc_4x8_s(12,12,"0");
}
void main(void)
{
init_160104();
menu_main();
wri_ico(0,1);
wri_led_pressure(158);
}
#define xtal 4
void delay_1ms(void)
{ unsigned int i;
for(i=1;i<(unsigned int)(xtal*143-2);i++)
;
}
void delay_nms(unsigned int n)
{
unsigned int i=0;
while(i<n)
{delay_1ms();
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -