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

📄 main.c

📁 用单片机控制触摸屏
💻 C
📖 第 1 页 / 共 2 页
字号:
 #include<reg51.h>
/**************************************************************************************/
/*工程名称:final.Uv2*/
/*文件名称:main.c*/
/*机构名称:大连民族学院创新教育中心电子设计部(公司/单位/学校)*/
/*模块名:MAIN函数程序*/
/*创建人:韦作凯 日期:2008-6-1*/
/*修改人:韦作凯 日期:2008-6-7*/
/*功能描述:定义全局变量、数组、调用初始化函数、功能函数*/
           /*实现在线画图、计算器功能*/ 
/*其他说明:没有上位机程序*/
/*版本:V1.0版*/
/**************************************************************************************/
 #include <stdio.h>
 #include <intrins.h>
 #define uchar unsigned char
 #define uint unsigned int

 uchar code word[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39} ;
 uchar temp_f[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} ;

 /*-------------------------------函数声明---------------------------------*/
 
 /*液晶程序声明*/
 void write_word ( uchar word ) ;
 void check_busy ( void ) ;
 void write_command ( uchar command ) ;
 uchar read_word ( void ) ;
 void init_lcd ( void ) ;
 void display_word ( uchar address , uchar *list , uchar a ) ;
 void write_GDRAM ( uchar x , uchar y , uchar dat1 , uchar dat2 ) ;
 void clr_DDRAM (void) ;
 void clr_GDRAM ( void ) ;
 void drawn_point ( uchar x , uchar y ) ;
 void display_value ( int x , uchar addr ) ;
 void Read_ADS7843() ;
 void start() ; //SPI开始
 WriteCharTo7843(unsigned char num) ; //SPI写数据
 unsigned int ReadFromCharFrom7843 ( void ) ; //SPI 读数据

 /*--------------------------------接口连接---------------------------------*/
 
 /*液晶接口*/
 sbit lcd_rs = P1^0 ;
 sbit lcd_rw = P1^1 ;
 sbit lcd_e = P1^2 ;

 //按键定义 

 sbit key_A = P1^4 ;  //清屏
 sbit key_B = P1^5 ;
 sbit key_C = P1^3 ;
 sbit key_D = P1^6 ;

 #define lcd_db  P2 

 //ADS7843控制口定义
 sbit DCLK = P3^7 ;  //根据用户自己的定义
 sbit CS = P3^6 ;
 sbit DIN = P3^5 ;
 sbit BUSY = P3^4 ;
 sbit DOUT = P3^3 ;
 sbit PENIR = P3^2 ; //   clear 0 when tounch else set 1
 unsigned int X=0,Y=0 ;

 /*--------------------------------变量声明---------------------------------*/
 int d_x ;
 int d_y ;
 int flag = 0 ;
 int key_flag = 0 ;
 int key_value = 0 ;
 int value_pas = 0 ;
 int value_act = 0 ;
 int value ;
 int value_flag = 0 ;
 int operator = 0 ; 

 /*延时*/
 void delay ( uint i )
 {
  while ( i-- );
 }

 /*--------------------------------按键扫描---------------------------------*/
 void scan_key ( void )
 {
    if ( key_A==0 )
	   flag = 0 ;
	if ( key_B==0 )
	{
	   flag = 1 ;
	   clr_DDRAM () ;
    }
   	if ( key_C==0 )
	   flag = 2 ;
 }

 void check_busy ( void )
 {
    uchar busy ;
	lcd_db = 0xff ;
	lcd_rs = 0 ;
	lcd_rw = 1 ;
	do
	{
	   lcd_e = 1 ;
	   busy = lcd_db ;
	   delay (2) ;
	   lcd_e = 0 ;
	}while( busy>0x7f ) ;
 }
 
 /*--------------------------------------------------------------------------*/

 /*                                 液晶程序                                 */
 
 /*--------------------------------------------------------------------------*/
 
 /*********************************液晶写命令*****************************/
 void write_command ( uchar command )
 {
    check_busy () ;
	lcd_db = command ;
    lcd_rs = 0 ;
	lcd_rw = 0 ;
	lcd_e = 1 ;
    delay (100) ;
	lcd_e = 0 ;
	//delay (100) ;
 }

 /**********************************液晶写数据****************************/
 void write_word ( uchar word)
 {
    check_busy () ;
	lcd_db = word ;
	lcd_rs = 1 ;
	lcd_rw = 0 ;
	lcd_e = 1 ;
    delay (100) ;
	lcd_e = 0 ;
	//delay (100) ;
 }

 /*************************************液晶读数据**************************/
 uchar read_word ( void )
 {
    uchar temp ;
    check_busy () ;
	lcd_db = 0xff ;
	lcd_rs = 1 ;
	lcd_rw = 1 ;
	lcd_e = 1 ;
	temp = lcd_db ;
    delay (10) ;
	lcd_e = 0 ;
	return ( temp ) ;
	//delay (100) ;
 }

 /*******************************液晶程序初使化****************************/
 void init_lcd ( void )
 {
    delay (1) ;
    write_command ( 0x30 ) ;  /*设置功能*/
    write_command ( 0x01 ) ;  /*开显示*/
    delay (100) ;
    write_command ( 0x06 ) ;  /*清屏*/
    write_command ( 0x0c ) ;  /*设置模式*/
 }

 /***********************************清GDRAM*******************************/
 void clr_GDRAM ( void )
 {
    uchar i,j;
	uchar dx,dy;
	for ( i=0;i<32;i++ )
	{
	   for ( j=0;j<16;j++)
	   {
	      dy = 0x80 + i ;
		  dx = 0x80 + j ;
		  write_GDRAM ( dx,dy,0x00,0x00 ) ;
	   }
	}
    write_command ( 0x36 ) ;
}

 /**********************************清DDRAM*********************************/
 void clr_DDRAM (void)
 {
    write_command ( 0x30 ) ;
    write_command ( 0x01 ) ;     //清除显示指令。
    delay (180);
 }

 /*********************************液晶GDRAM写数据*************************/
 void write_GDRAM ( uchar x , uchar y , uchar dat1 , uchar dat2 )
 {
	write_command ( 0x34 ) ;
	write_command ( y ) ;
	write_command ( x ) ;
	write_command ( 0x30 ) ;
	write_word ( dat1 ) ;
	write_word ( dat2 ) ;
 }

 /*******************************显示字符串********************************/
 void display_word ( uchar address , uchar *list , uchar a )
 {
    uchar i,j ;
	write_command ( 0x30 ) ;
    write_command (address) ;
    for( i=0;i<2*a;i++ )
    {
       j = *list ;
       write_word (j) ;
       list++ ;
    }
 }

 /********************************显示点***********************************/
 void drawn_point ( uchar x , uchar y )
 {
    uchar dx , dy ;
	uchar dat1 , dat2 ;
	dy = 63-y ;
	dx = x ;
	if ( dy > 31 )
	{
	   dy = dy - 32 ;
	   dx = dx + 128 ;
	}
	write_command ( 0x34 ) ;
	write_command ( dy|0x80 ) ;
	write_command ( (dx/16)|0x80 ) ;
	write_command ( 0x30 ) ;
	dat1 = read_word () ;
	dat1 = read_word () ;
	dat2 = read_word () ;
	if ( (dx%16)>7 )
	   dat2 = dat2|(0x80>>((dx%16)-8)) ;
	else
	   dat1 = dat1|(0x80>>(dx%16)) ;
	write_command ( 0x36 ) ;
	dy = dy|0x80 ;
	dx = (dx/16)|0x80 ;
	write_GDRAM ( dx,dy,dat1,dat2 ) ;
	write_command ( 0x36 ) ;
 }

 /*******************************显示值********************************/
 void display_value ( int x , uchar addr )
 {
    uchar i,j ;
	uint flag1=1 ;
	int t_x ;
	if ( x>=0 )
	{
	   t_x = x ;
	   j = 0 ;
	}	
	else
	{
	   t_x = 0-x ;
	   j = 1 ;
	}
	write_command ( 0x30 ) ;
	write_command ( addr ) ;
	for ( i=0;i<6;i++ )
	{
	   temp_f[i] = 0x20 ;
	}
	i = 5 ;
	while ( 1 )
	{
	   if ( t_x>0 )
	   {
		  temp_f[i] = word[t_x%10] ;
		  t_x /= 10 ;
	   }
	   else
	      break ;
	   i-- ;
	   if ( i<0 )
	      break ;
	}
	if ( x==0 )
	{
	   temp_f[5] = word[0] ;
	}
	if ( j==1 )
	   temp_f[0] = 0x2d ;
	for ( i=0;i<6;i++ )
	{
	   write_word ( temp_f[i] ) ;
	}
 }

 /*--------------------------------------------------------------------------*/

 /*                               触摸屏程序                                 */
 
 /*--------------------------------------------------------------------------*/
 /*------------------------------计算器键值判断------------------------------*/
 void calculator_key ( void )
 {
    key_flag = ((X/760)<<4)|((Y/900)&0x0f) ;
	switch ( key_flag )
    {
	   case 0x00: key_value = 0 ; break ; //对键值赋值
	   case 0x10: key_value = 1 ; break ;
	   case 0x20: key_value = 2 ; break ; 
	   case 0x30: key_value = 3 ; break ;
	   case 0x40: key_value = 4 ; break ;
	   case 0x01: key_value = 5 ; break ;
	   case 0x11: key_value = 6 ; break ;
	   case 0x21: key_value = 7 ; break ;
	   case 0x31: key_value = 8 ; break ;
	   case 0x41: key_value = 9 ; break ;
	   case 0x02: key_value = 10 ; break ;
	   case 0x12: key_value = 11 ; break ;
	   case 0x22: key_value = 12 ; break ;
	   case 0x32: key_value = 13 ; break ;
	   case 0x42: key_value = 14 ; break ;
	   case 0x03: key_value = 15 ; break ;
	   case 0x13: key_value = 16 ; break ;
	   case 0x23: key_value = 17 ; break ;
	   case 0x33: key_value = 18 ; break ;
	   case 0x43: key_value = 19 ; break ;
	}
 }

 /*--------------------------------计算器函数--------------------------------*/
 void calculator_main ( void )
 {
    switch ( key_value )
	{
	   case 19:                                       //按键0
	      if( value_flag==0 )
		  {
		     if( value_act<0 )
			    value_act=value_act*10-0 ; 
			 else
			    value_act=value_act*10+0 ; 
		  }
	      else
		  {
		     if( value_pas<0 )
			    value_pas=value_pas*10-0 ; 
			 else
			    value_pas=value_pas*10+0 ; 
		  }
		  break ;
       case 14:                                       //按键1
	      if( value_flag==0 )
		  {
		     if( value_act<0 )
			    value_act=value_act*10-1 ; 
			 else
			    value_act=value_act*10+1 ; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -