📄 触摸屏实验_2.c
字号:
/****************************************************
* TOPWAY 使用商务通触摸屏的测试程序 *
* Date:2006/07/26 *
* By :Zhangke *
****************************************************/
#include <iom16v.h>
#include <macros.h>
#define BusyCheck (PIND&0x40) //Busy,PD6,忙标志
#define CS PORTD &= (~0x20) //_CS,PD5,片选
#define CNS PORTD |= 0x20
#define DisplayRegister PORTD |= 0x10 //RS,PD4,寄存器选择
#define CommandRegister PORTD &= (~0x10)
#define WriteEnable PORTD &= (~0x08) //_RW,PD3,写使能
#define WriteDisable PORTD |= 0x08
#define ReadEnable PORTD &= (~0x04) //_RD,PD0,读使能
#define ReadDisable PORTD |= 0x04
#define RST PORTD &= (~0x02) //_RST,PD1,复位
#define NotRST PORTD |= 0x02
#define LCDBUS PORTC
#define X_Touch PORTA = 0xE0;DDRA = 0x5F;//PORTA = 0x40;DDRA = 0x5F;
#define Y_Touch PORTA = 0x70;DDRA = 0xAF;//PORTA = 0x20;DDRA = 0xAF;
#define Touch_Detect PORTA = 0x50;DDRA = 0xAF;
#define CLS_Key (PINB&0x10) //清屏按键
char ReadData = 0;
char Wave[255] = {0};
char ii = 0;
char Cachefull = 0;
char VoltageX = 0;
char VoltageY = 0;
char DetectVoltage = 0;
char TouchState = 0;
void PORT_Init(void)
{
X_Touch;
PORTB = 0xFF;
DDRB = 0xEB;
PORTC = 0xFF;
DDRC = 0xFF;
PORTD = 0xFF;
DDRD = 0xBF;
}
void Delay(char DelayTimes)
{
char i,k;
for (i=0;i<DelayTimes;i++)
{
for (k=0;k<250;k++)
{
asm("nop");
}
}
}
void Delay2(int DelayTimes)
{
int i,k;
for (i=0;i<DelayTimes;i++)
{
for (k=0;k<2000;k++)
{
asm("nop");
}
}
}
/****************************************************
* 发送指令数据 *
****************************************************/
void SdCmd(char Command)
{
CommandRegister;
LCDBUS = Command;
asm("nop");asm("nop");asm("nop");asm("nop");
WriteEnable;
asm("nop");asm("nop");asm("nop");asm("nop");
WriteDisable;
}
/****************************************************
* 发送显示数据 *
****************************************************/
void SdData (char DisplayData)
{
DisplayRegister;
LCDBUS = DisplayData;
WriteEnable;
asm("nop");asm("nop");asm("nop");asm("nop");
WriteDisable;
}
/****************************************************
* 显示文本信息 *
* 输入: X :横坐标。8个半角字符为单位 0-16*
* Y :列坐标。纵向1个像素为单位 0-64*
* TextData:需要显示的数据。 <[240*64]*
****************************************************/
void DisplayTextScreen(char X,char Y,char *TextData)
{
char i = 0;
char j = 0;
SdCmd(0x60);SdCmd(X); //设置X地址为
SdCmd(0x70);SdCmd(Y); //设置Y地址为
SdCmd(0x00);SdCmd(0xcd); //正常供电模式,文本显示,显示开,正常显示
while(*TextData)
{
SdData(*(TextData++));
Delay(1);
}
}
void DEC_Num_Disp(char X,char Y,unsigned int Num,char Bit)
{
char i = 0;
static char LCD_Buff[3] = {0};
SdCmd(0x60);SdCmd(X); //设置X地址为
SdCmd(0x70);SdCmd(Y); //设置Y地址为
SdCmd(0x00);SdCmd(0xcd); //正常供电模式,文本显示,显示开,正常显示
for (i=0;i<Bit;i++)
{
LCD_Buff[i] = Num%10;
Num = Num/10;
}
for (i=0;i<Bit;i++)
{
SdData(LCD_Buff[Bit-1-i]+0x30);
Delay(1);
}
}
void Point_Disp(char X,char Y,unsigned int Num,char Bit,char Point)
{
unsigned char i = 0;
char LCD_Buff[4] = {0};
SdCmd(0x60);SdCmd(X); //设置X地址为
SdCmd(0x70);SdCmd(Y); //设置Y地址为
SdCmd(0x00);SdCmd(0xcd); //正常供电模式,文本显示,显示开,正常显示
for (i=0 ; i<Bit ; i++) //依次把数据写入缓冲区中
{
if(i==Point) //插入小数点
{
LCD_Buff[i] = 0xfe;
i++;
}
LCD_Buff[i] = Num%10;
Num = Num/10;
}
for (i=0 ; i<Bit ; i++) //依次将缓冲区的数据显示
{
SdData(LCD_Buff[Bit-1-i]+0x30);
}
}
/****************************************************
* 显示图象信息 *
****************************************************/
void DisplayGraphyScreen(flash char *GraphyData)
{
char TempData = 0;
char i = 0;
char j = 0;
SdCmd(0x60);SdCmd(0x00); //设置X地址为0
SdCmd(0x70);SdCmd(0x00); //设置Y地址为0
SdCmd(0x00);SdCmd(0xc5); //正常供电模式,图形模式,显示开,正常显示
for (j=0;j<64;j++)
{
for (i=0;i<30;i++)
{
TempData = (*(GraphyData+(j*30)+i));
SdData(TempData);
}
}
}
/****************************************************
* 清屏 *
****************************************************/
void CLS(void)
{
int j = 0;
SdCmd(0x60);SdCmd(0x00); //设置X地址为0
SdCmd(0x70);SdCmd(0x00); //设置Y地址为0
SdCmd(0x00);SdCmd(0xc5); //正常供电模式,图形模式,显示开,正常显示
for (j=0;j<1920;j++)
{
SdData(0);
}
}
void Refresh(void)
{
char i = 0;
char j = 0;
SdCmd(0x00);SdCmd(0xcd); //正常供电模式,文本显示,显示开,正常显示
for (i=0;i<8;i++)
{
SdCmd(0x70);SdCmd(i<<3); //设置Y地址
for (j=14;j<30;j++)
{
SdCmd(0x60);SdCmd(j); //设置X地址
SdData(0x20);
}
}
}
/****************************************************
* 读取指定坐标的数据 *
* 返回:指定坐标显示的8位数据 *
****************************************************/
void RdData(char X,char Y_Point)
{
SdCmd(0x60);SdCmd(X); //设置X地址
SdCmd(0x70);SdCmd(Y_Point); //设置Y地址
DDRC = 0x00;
WriteDisable;
DisplayRegister;
ReadDisable;
ReadEnable;
asm("nop");asm("nop");asm("nop");asm("nop");
ReadData = PINC&0xff;
DDRC = 0xff;
ReadDisable;
}
/****************************************************
* 绘点函数 *
* 输入: X :点的横坐标 0-240 *
* Y :点的纵坐标 0-64 *
* State:0-绘点/1-清除 *
****************************************************/
void Point (char X,char Y,char State)
{
char X_Position = 0;
while (X>7)
{
X_Position++;
X = X-8;
}
RdData(X_Position,Y);
SdCmd(0x60);SdCmd(X_Position); //设置X地址
SdCmd(0x70);SdCmd(Y); //设置Y地址
SdCmd(0x00);SdCmd(0xc5); //正常供电模式,图形模式,显示开,正常显示
if (State == 1)
{
SdData((0x80>>X)|ReadData);
}
else
{
SdData((~(0x80>>X))&ReadData);
}
}
void Clear (char X,char Y)
{
char X_Position = 0;
while (X>7)
{
X_Position++;
X = X-8;
}
if (++X_Position>19)
{
X_Position = 0;
}
SdCmd(0x60);SdCmd(X_Position); //设置X地址
SdCmd(0x70);SdCmd(Y); //设置Y地址
SdData(0);
}
/****************************************************
* LCD模块初始化 *
****************************************************/
void InitLCDModule(void)
{
CS;
NotRST;
Delay(250);
RST;
Delay(250);
Delay(250);
NotRST;
Delay(250);
SdCmd(0x00);SdCmd(0xc5); //LCD控制寄存器
SdCmd(0x08);SdCmd(0x73); //通用寄存器
SdCmd(0x10);SdCmd(0xe9); //光标控制寄存器
SdCmd(0x18);SdCmd(0x20); //光标大小控制寄存器
SdCmd(0x20);SdCmd(0x1d); //活动窗右边界寄存器
SdCmd(0x28);SdCmd(0x1d); //显示窗右边界寄存器
SdCmd(0x30);SdCmd(0x3f); //活动窗底部边界寄存器
SdCmd(0x38);SdCmd(0x3f); //显示窗底部边界寄存器
SdCmd(0x40);SdCmd(0x00); //活动窗左边界寄存器
SdCmd(0x50);SdCmd(0x00); //活动窗顶边界寄存器
SdCmd(0x48);SdCmd(0x00); //显示窗左边界寄存器
SdCmd(0x58);SdCmd(0x00); //显示窗顶部寄存器
SdCmd(0x60);SdCmd(0x00); //X方向光标寄存器
SdCmd(0x70);SdCmd(0x00); //Y方向光标寄存器
SdCmd(0x80);SdCmd(0x2a); //闪烁时间寄存器
SdCmd(0x90);SdCmd(0x3e); //移位时钟控制寄存器
SdCmd(0xe0);SdCmd(0x00); //数据模式寄存器
SdCmd(0xf0);SdCmd(0xa0); //字体控制寄存器
Delay(20);
}
// Conversion time: 104uS
void adc_init(void)
{
ADCSR = 0x00; //disable adc
ADMUX = 0x27; //select adc input 2
ACSR = 0x80;
ADCSR = 0xEF;
}
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
static char i = 0;
static char k = 0;
unsigned int AverageVoltage = 0;
static char SampleVoltage[18] = {0};
if(TouchState == 0)
{
if (k == 0)
{
Touch_Detect;
ADMUX = 0x24;
}
k++;
if(k > 3)
{
DetectVoltage = ADCH;
if(DetectVoltage>20)
{
TouchState = 0; //未被触摸
}
else
{
TouchState = 1; //检测到被触摸
}
k=0;
}
}
if(TouchState == 1)
{
switch (i)
{
case 0:
Y_Touch;
break;
case 4:
ADMUX = 0x27; //select adc input 7
SampleVoltage[i] = ADCH;
X_Touch;
break;
case 9:
ADMUX = 0x24; //select adc input 4
SampleVoltage[i] = ADCH;
break;
default:
break;
}
i++;
if(i>9)
{
TouchState = 0;
VoltageY = SampleVoltage[4]>>2;
VoltageX = SampleVoltage[9]>>1;
i = 0;
}
}
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
PORT_Init();
adc_init();
MCUCR = 0x00;
GICR = 0x00;
SEI();
InitLCDModule();
}
void main(void)
{
char X_Pixel = 0;
char Stick = 0;
char X_Disappear = 0;
char Y0 = 0;
char Y1 = 0;
char OldState = 0;
char OldKeyNum = 0;
init_devices();
CLS();
DisplayTextScreen(0,13," By E=mC2 ");
DisplayTextScreen(0,0, "触摸屏测试实验");
DisplayTextScreen(0,32,"X-");
DisplayTextScreen(0,48,"Y-");
for (Stick=0;Stick<=64;Stick++)
{
Point(111,Stick,1);
}
while(1)
{
Point((VoltageX+111),VoltageY,1);
DEC_Num_Disp(3,32,VoltageX,3);
DEC_Num_Disp(3,48,VoltageY,3);
DEC_Num_Disp(10,48,DetectVoltage,3);
if(TouchState)
{
if (TouchState != OldState)
{
SdCmd(0x60);SdCmd(10);
SdCmd(0x70);SdCmd(32);
SdCmd(0x00);SdCmd(0xcd);
SdData(0xa1);SdData(0xf6); //Touched Signal
}
}
else
{
if (TouchState != OldState)
{
SdCmd(0x60);SdCmd(10);
SdCmd(0x70);SdCmd(32);
SdCmd(0x00);SdCmd(0xcd);
SdData(0xa1);SdData(0xf5); //Untouched Signal
}
}
OldState = TouchState;
if((CLS_Key == 0x00)&&(CLS_Key != OldKeyNum))
{
Refresh();
VoltageX = 0;
VoltageY = 0;
}
OldKeyNum = CLS_Key;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -