历史上的今天
返回首页

历史上的今天

今天是:2025年07月06日(星期日)

2020年07月06日 | mini2440裸机试炼之—计算器(LCD显示,触摸屏中断)

2020-07-06 来源:eefocus

关于Pait_Bmp(x0, y0, x, y, BMPaddr);函数


像素图在屏幕左上角为(0,0),Pait_Bmp中的x0,y0分别像素点初始位置,x,y为BMP图片的X,Y的大小,BMPaddr为BMP图片转换的数组地址


基于T35 TFT LCD屏实现功能:


1. 在屏幕上画一个计算器界面,包括0-9,+,-,*,/;


2. 实现触摸选择界面上的数字和运算符,


3. 并计算出结果显示在显示框内。


注意,只实现整数功能,没涉及小数,只实现一次运算,不保存上次运算结果。


实现界面:

实现过程:


开启LCD电源,初始化LCD>>>LCD填充界面图片>>>开启触摸屏中断>>>获取键值>>>区分数字和功能来调用数字图片显示。


数字图片:


空白图: 除数为零提示图:

数字图像:                                                                                                                        


数值过长提示图:     


1、开启LCD电源,初始化LCD

其中:时序发生器(TIMEGEN)


TIMEGEN产生LCD驱动器的控制信号,如VFRAME、VLINE、VCLK和VM。这些控制信号与REGBANK中的LCDCON1/2/3/4/5寄存器配制有着紧密关系。基于这些可编程的REGBANK中LCD控制寄存器的配制,TIMEGEN可以产生合适的可编程控制信号来支持多种不同类型的LCD驱动器.


TFT屏的工作时序:

                              

VSYNC为帧同步信号,每发出一个脉冲表示新的一屏图像数据开始传输。


VSF=HSF÷[(VSPW+1)+(VBPD+1)+(VFPD+1)+(LINEVAL+1)]


HSYNC为行同步信号,每发出一个脉冲表示新的一行图像数据开始传输。


HSF=VCLK÷[(HSPW+1)+(HSPD+1)+(HFPD+1)+(HOZVAL+1)]


VCLK为像素同步信号,每发出一个脉冲表示新的一个点图像数据开始传输。


VCLK=HCLK÷[(CLKVAL+1)×2]


LCD显示是一帧一帧(一个画面)的,每一帧里显示又是从上到下一行一行的,每一行显示又是从左到右一个点一个点的。


而VSYNC,HSYNC,VCLK这些决定了他们的显示速度。


图中的VSPW,HSPW等决定相应脉冲的宽度,VBPD,HBPD决定了延时时间。 


这些参数的设置都是由LCDCONn决定的。


初始化LCD:(设置TIMEGEN)

/**************************************************************

 TFT LCD功能模块初始化//此函数没开启屏蔽功能

**************************************************************/

void LCD_Init(void)

{

#define M5D(n) ((n)&0x1fffff)

#define LCD_ADDR ((U32)LCD_BUFFER)

     //con1[6:5]显示模式选择为 TFT LCD面板 模式  [4:1]选择为 TFT的16bpp 像素模式

rLCDCON1 = (LCD_PIXCLOCK << 8) | (3 <<  5) | (12 << 1);

//con2[23:14]设置高度320  VSPW[5:0]决定相应脉冲的宽度; VFPD[13:6]、VBPD[31:24]决定了延时时间;  选择option.h文件中T35定义参数

    rLCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0);

    //con3[18:8]设置高度240   HFPD、HBPD决定了延时时间;  选择option.h文件中T35定义参数

    rLCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH  - 1) <<  8) | (LCD_LEFT_MARGIN << 0);

    //con4  HSPW[8:0]决定相应脉冲的宽度; 选择option.h文件中T35定义参数

    rLCDCON4 = (13 <<  8) | (LCD_HSYNC_LEN << 0);

 

#if !defined(LCD_CON5)

#    define LCD_CON5 ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0))

#endif

    rLCDCON5   =  LCD_CON5;

    rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) <<  0);

    rLCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1);

    rLCDSADDR3 = LCD_WIDTH;        

 

    rLCDINTMSK |= 3;   //中断屏蔽

  rTCONSEL   &= (~7);

 

 

    rTPAL     = 0x0;

    rTCONSEL &= ~((1<<4) | 1);

 

    

}


使能LCD


/**************************************************************

LCD视频和控制信号输出或者停止,1开启视频输出

**************************************************************/

void Lcd_EnvidOnOff(int onoff)

{

    if(onoff==1)

    rLCDCON1|=1; // ENVID=ON

    else

    rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off

}


开启LCD电源


/**************************************************************

TFT LCD 电源控制引脚使能

**************************************************************/

void Lcd_PowerEnable(int invpwren,int pwren)

{

    //GPG4 is setted as LCD_PWREN

    rGPGUP = rGPGUP|(1<<4); // Pull-up disable

    rGPGCON = rGPGCON|(3<<8); //GPG4=LCD_PWREN

    

    //Enable LCD POWER ENABLE Function

    rLCDCON5 = rLCDCON5&(~(1<<3))|(pwren<<3);   // PWREN

    rLCDCON5 = rLCDCON5&(~(1<<5))|(invpwren<<5);   // INVPWREN

}


2、开启触摸屏中断

/**************************************************************

 TFT LCD *触摸屏中断函数*

**************************************************************/

 

  

void __irq Adc_Tc_Handler(void)  

{  

  

    rADCTSC|=(1<<3)|(1<<2); //XP上拉电阻无效, 自动连续测量X坐标和Y坐标.  

    rADCCON|=(1<<0);//ADC转换开始  

  

    while(rADCCON&(1<<0));//检测ADC转换是否开始且ADCCON[0]自动清0  

    while(!(rADCCON&(0x1<<15))); //检测ADCCON[15]是否为1,ADC转换是否结束,(必须)  

    while(!(rINTPND&((U32)0x1<<31)));//检测ADC中断是否已请求  

      

    xdata=rADCDAT0&0x3ff;//读x坐标 >>xdata并不是像素点,而是模拟信号 0-1000 

    ydata=rADCDAT1&0x3ff;//读y坐标  

      

    Uart_Printf("n       Xdata=%04d, Ydata=%04dn", xdata, ydata);  

  

    rSUBSRCPND|=(0x1<<9);   //清除中断

    rSRCPND|=((U32)0x1<<31);  

    rINTPND|=((U32)0x1<<31);  

      

    rADCTSC =0xd3;     //ADC等待中断模式    

    rADCTSC|=(0x1<<8);  //ADCTSC[8]=1,设置抬起中断信号  

      

    while(!(rSUBSRCPND&(0x1<<9)));  //检测触屏抬起中断是否已请求   

  

    rADCTSC &=~(0x1<<8);//ADCTSC[8]=0光标按下中断信号  

    

    //  由于下面这段代码和上面这段代码是看到大神们都会加上去的,调试得到

    //  现象:上面的清除中断实现触屏中断,而下面这段则是加快中断后的响应

    //  (我的实验结果是:没下面的时候,触屏后的数值显示时间变长,蜂鸣器的

    //  响声也变长,有种慢一拍的感觉)

   

    rSUBSRCPND|=(0x1<<9);     

    rSRCPND|=((U32)0x1<<31);  

    rINTPND|=((U32)0x1<<31);    

}   

  

void Touch_Init(void)  

{  

    rADCCON=((1<<14)|(9<<6));    //A/D分频时钟有效,其值为9  

    rADCTSC=0xd3;  //光标按下中断信号,YM有效,YP无效,XM有效,XP无效,XP上拉电阻,普通ADC转换,等待中断模式  

    rADCDLY=50000; //正常转换模式转换延时大约为(1/3.6864M)*50000=13.56ms  

      

    rINTSUBMSK &=~(0x1<<9);//TC中断使能  

    rINTMSK &=~((U32)0x1<<31);//ADC总中断使能  

      

    pISR_ADC=(U32)Adc_Tc_Handler;//指向中断向量表  

      

}  



3、获取键值

并定义变量botten1存储键值,flag1按键标记,flag2运算标记


/**************************************************************

             ------------获取键值--------------

**************************************************************/ 

void get_key(void){

    //数字块

    if( xdata >= 70 && xdata <= 285 && ydata >= 100 && ydata < 262 )       //0

    {   Beep(2000, 100);botten1 = 0;flag1=1;xdata = ydata = 0;  }

    else if( xdata >= 70 && xdata <= 285 && ydata >= 263 && ydata < 425 )    //1 

    {   Beep(2000, 100);botten1 = 1;flag1=1;xdata = ydata = 0;  }

    else if( xdata >= 285 && xdata <= 500 && ydata >= 263 && ydata < 425 )    //2 

    {   Beep(2000, 100);botten1 = 2;flag1=1;xdata = ydata = 0;  }

    else if( xdata >= 500 && xdata <= 715 && ydata >= 263 && ydata < 425 )     //3

    {   Beep(2000, 100);botten1 = 3;flag1=1;xdata = ydata = 0;  }

    else if( xdata >= 70 && xdata <= 285 && ydata >= 425 && ydata < 587 )     //4  

    {   Beep(2000, 100);botten1 = 4;flag1=1;xdata = ydata = 0;  }

    else if( xdata >= 285 && xdata <= 500 && ydata >= 425 && ydata < 587 )     //5

    {   Beep(2000, 100);botten1 = 5;flag1=1;xdata = ydata = 0;  }

    else if( xdata >= 500 && xdata <= 715 && ydata >= 425 && ydata < 587 )     //6

    {   Beep(2000, 100);botten1 = 6;flag1=1;xdata = ydata = 0;  }

    else if( xdata >= 70 && xdata <= 285 && ydata >= 587 && ydata < 750 )     //7

    {   Beep(2000, 100);botten1 = 7;flag1=1;xdata = ydata = 0;  }

    else if( xdata >= 285 && xdata <= 500 && ydata >= 587 && ydata < 750 )     //8

    {   Beep(2000, 100);botten1 = 8;flag1=1;xdata = ydata = 0;  }

    else if( xdata >= 500 && xdata <= 715 && ydata >= 587 && ydata < 750 )     //9

    {   Beep(2000, 100);botten1 = 9;flag1=1;xdata = ydata = 0;  }

    else

    //功能运算块

    if( xdata >= 715 && xdata <= 930 && ydata >= 100 && ydata < 262 )          //除

    {   Beep(2000, 100);botten1 = '/';flag1=1;flag2=1;xdata = ydata = 0;  }

    else if( xdata >= 715 && xdata <= 930 && ydata >= 263 && ydata < 425 )     //乘以

    {   Beep(2000, 100);botten1 = '*';flag1=1;flag2=2;xdata = ydata = 0;  }

    else if( xdata >= 715 && xdata <= 930 && ydata >= 425 && ydata < 587 )     //减法

推荐阅读

史海拾趣

Custom Electronics Inc公司的发展小趣事

随着公司规模的扩大和产品质量的提升,CEI开始寻求更广阔的市场空间。通过与全球知名电子产品制造商建立合作关系,CEI的产品逐渐进入国际市场。同时,CEI还积极参与国际电子行业的交流与合作,不断引进先进的生产技术和管理经验,为公司的长远发展奠定了坚实基础。

APX Technologies公司的发展小趣事

APX Technologies在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,致力于研发和生产低能耗、低污染的电子产品。此外,APX Technologies还积极参与社会公益活动,为社会的和谐发展贡献自己的力量。这些举措不仅提升了公司的品牌形象,也赢得了社会各界的广泛赞誉。

以上五个故事均基于虚构的APX Technologies公司的发展情况,旨在展示一个电子行业公司可能经历的不同发展阶段和面临的挑战。这些故事并不代表任何真实情况,仅供参考和启发。

Hifn Inc公司的发展小趣事

随着电子行业的快速发展,技术更新换代的速度越来越快。APX Technologies面临着来自同行的激烈竞争和不断变化的市场需求。为了应对这些挑战,公司不断调整战略方向,加大研发投入,优化产品结构。在稳中求进的过程中,APX Technologies逐渐巩固了自己的市场地位。

GTE Microcircuits公司的发展小趣事
减少噪声的方法包括选用低噪声系数的放大器、优化电路布局以减少电磁干扰(EMI)、以及在关键信号路径上使用屏蔽和滤波技术。同时,合理设计电源去耦网络,避免电源噪声对电路的影响也是关键。
HM International公司的发展小趣事
故障排查通常从检查电源开始,确认电源电压和电流是否正常。然后逐步检查各级放大器的输入输出信号,使用示波器或万用表等工具观察信号波形和幅值是否正常。此外,还可以利用替换法来排除故障元件。
启臣微(Chip)公司的发展小趣事

在产品质量方面,启臣微始终坚持严格的标准和精细的工艺流程。公司建立了一套完善的质量管理体系,从原材料采购到产品出厂,每一个环节都经过严格把关。这种对品质的执着追求,让启臣微的产品在市场上赢得了良好的口碑,也为公司赢得了众多客户的信赖。

问答坊 | AI 解惑

贴片三极管型号查询

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 直插 贴片 9011 1T 9012 2T 9013 J3 9014 J6 9015 M6 9016 Y6 9018 J8 S8050 J3Y S8550 2TY 8050 Y1 8550 Y2 2SA1015 BA 2SC1 ...…

查看全部问答>

无线传感器

SDW-003 无线传感器信号采集模块 产品特点: ● 低成本、小体积模块化设计 ● 模拟信号采集,隔离转换 RS-485/232输出 ● 测量精度优于0.05% ● RS-485/232无线信号输出,可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ...…

查看全部问答>

请教几个芯片的功能和特性

Intel P80c321 Maxim ICM7212 Dallas ds1225Y-150+ MatsushitaAE5641 ADC 0804 Maxim max232cpe…

查看全部问答>

我大力推一个计算机学习网站,欢迎大家来注册!

网址:[url=http://www.rupeng.com/forum/jian-2472.html][/url] 说明:许多学生就是通过这个网站找到个自己的好工作!我相信,它也不会让你失望!!!…

查看全部问答>

phoneMakeCall拨电话的问题

请教各位高手,我用phoneMakeCall拨电话,程序会自动调用系统的电话程序,但是当我关掉电话程序后,我的程序可以正常运行,但是当我要退出程序时,机器就会死掉,请问这是什么原因呢?我怀疑是什么没释放,但是怎么释放呢,或者有什么其它的更好的 ...…

查看全部问答>

关于16位AD的基线问题

从AD得到一个int类型的整数,AD出来的是16路的信号。 我现在想把数据画在屏幕上,画成曲线,由于数据太大,我都减去个32768, 但基线很乱,有的路的通道跑的很远,有的不怎么跑,不知怎么使基线稳定?…

查看全部问答>

异地购买电子电子元器件,始终是我们无法回避的购买途径

要购买电子元器件样品的种类太多,何止千种、万种型号,一般搞电子维修和科研的在自己所在城市很难找全自己想要的电子元器件,毕竟不专业的电子元器件市场,是没办法吸引到大批有现货的供应商驻扎的,异地购买是无法回避的购买途径,目前国内最大的 ...…

查看全部问答>

关于assert_param的疑惑

最近调试程序,发现ST的固件库中到处都是assert_param(),不清楚其编译结果,感觉这个“校参”过程很影响效率 在stm32f10x_conf.h中找到其源代码: /* Exported macro ------------------------------------------------------------*/ #ifdef D ...…

查看全部问答>

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第五十六章 USB声卡实验

第五十六章 USB声卡实验      上一章我们向大家介绍了如何利用STM32的USB来做一个USB读卡器,本章我们将利用STM32的USB来做一个声卡。本章分为如下几个部分:56.1 USB读卡器简介56.2 硬件设计56.3 软件设计56.4 下载验证 56.1 ...…

查看全部问答>