📄 main.c
字号:
#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 + -