⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 160104_s6b0719.c.bak

📁 160104S6B0719(iccavr) form ouravr.com
💻 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 + -