中文版 / ENGLISH 
华虹首页 关于我们 产品中心 解决方案 服务支持 人力资源 新闻中心 联系我们
SOLUTION 解决方案
公交一卡通
身份识别
移动支付
社会保障
电信智能卡
解决方案 首页 >> 解决方案 >> 

基于华虹SHC1411芯片的液晶显示与键盘开发

发布时间: 2011/3/21

基于华虹SHC1411芯片的液晶显示与键盘开发

                                                                             上海华虹集成电路有限责任公司

 

摘要:SHC1411是上海华虹集成电路有限责任公司针对网银USBKEY应用开发的一款 安全类芯片,自带12IO口支持多功能扩展应用,本文主要介绍通过IO口驱动的LCD液晶显示和键盘开发。

关键词:SHC1411 LCD液晶 键盘

 

       随着网上银行业务的不断发展,USBKEY的应用也迅速发展,除了普通KEY的应用外,从安全性角度出发,各大银行提出了更高要求的USBKEY应用,如增加LCD液晶显示,在USBKEY上增加键盘方便用户观察和操作USBKEY。在这种市场需求背景下,华虹设计推出了新一代安全芯片SHC1411

1   SHC1411简要介绍

       SHC1411芯片是一款8CPU安全芯片,具有高安全、低功耗、可扩展性强的特点,可用于USBKEY、接触式智能卡、安全产品等领域。芯片集成8位微处理器、256字节IRAM4K字节XRAM、一片160K字节的大页面Flash和一片8K字节的小页面Flash,提供总线加密功能,提供多种安全算法协处理器,提供高安全机制的防攻击功能,提供符合USB1.1规范的USB接口,提供符合ISO/IEC7816规范的串行I/O接口,提供主从SPI接口,外部工作电压为3.0V5.5V,工作环境-25°C+85°CMCU工作频率范围1MHz-16MHz。自带12IO口,可以支持多功能的扩展应用。

       USBKEY上增加LCD显示屏及键盘,可以将PC端传输到USBKEY的关键数据,如帐号、交易金额等信息在LCD屏上显示出来,再通过客户自己操作键盘来完成交易过程,这样可以降低此过程中数据被恶意篡改的风险,提高交易的安全性。

2 LCD液晶显示和键盘的网银解决方案

       传统的网银使用的USBKEY上没有LCD液晶和键盘,USBKEY仅是一个产生签名的工具。但随着网银业务的发展,越来越多的安全性方面的需求被提出,USBKEY在交易过程中的角色也不断丰富,功能也不断增强,除了传统的签名功能外,还将LCD液晶显示和键盘集成进来,担负起更多的安全保护的角色。

21传统的网银业务的缺点

       传统的网银业务流程如图1所示:


                                         
1:网银客户端认证流程示意图

 

       在图示的ABC环节都会产生安全风险,A环节存在黑客从客户端篡改交易信息(如交易账号和交易金额等)的风险,B环节存在黑客从客户端窃取用户口令的风险,C环节存在黑客从“客户端与USBKEY间通讯总线”上截取或篡改交易信息和用户口令的风险。上面三个环节的问题可以归纳为两大类:伪造签名和篡改数据,一方面黑客可以通过窃取用户口令获取USBKEY的访问权限,伪造签名,另一方面黑客可以在用户不知情的情况下篡改交易账号,交易金额等交易数据。

22LCD和键盘的USBKEY解决方案

       LCD和键盘的USBKEY在硬件上集成了LCD液晶显示屏和键盘,用户信息经PCUSB端口传给USBKEYUSBKEY会将接收到的信息中的一些重要信息,如交易账号,交易金额在LCD显示屏上显示出来,用户在观察到LCD显示的信息后通过操作按键来确认或取消本次交易。一些重要的信息在硬件设备上显示出来,再由用户进行确认操作,如果LCD上显示的信息不正确,用户就不会进行接下来的确认操作。这种设计可以有效的降低篡改数据的风险。

23 SHC1411上的LCD+键盘方案实现

       SHC1411共有12IO口可使用,其中有4IO口与硬件SPI接口的四个信号复用,分别是IO2SCK),IO3MOSI),IO4MISO),IO6CS),另外12IO口中有四个IO口支持外部中断功能。我们的设计目标是一个带AutoRun功能的LCD+键盘的解决方案。按照设计的需求,除了驱动一个SPI接口的LCD液晶和一个4×4的键盘外还需外挂一块SPI接口的FlashSPI接口的Flash需要占用四个IO口,而SPI接口的LCD液晶也需要占用四个IO口作为SPI接口的四根信号线,其中选通信号CS不能复用,其余三个信号可以复用,所以外挂FlashLCD共占用到5IO口,那么4×4键盘只有7IO口可以使用。图2是一个带LCD和键盘的USBKEY示意图。

      

                            2:带LCD和键盘的USBKEY示意图

3   基于SHC1411LCD液晶显示开发

3.1 液晶模块介绍

       选用飞格达电子的一款LCD,型号为FGD13232-7565R-18P2,内嵌LCD控制器STST7565R,分辨率为132×32,汉字点阵为16x16,字符点阵为16x8,可显示28列的汉字或者216列字符。

       MCU通过SPI接口与LCD连接,实际应用中可以采用硬件SPI控制,也可以用软件驱动IO口来模拟SPI控制。这里我们采用硬件SPI控制。   

3.2硬件连接图

      

                                   3MCULCD连接图

      

       3给出了SHC1411LCD的连接示意图,SHC1411SPI接口中的三根信号线CLKMOSIMISO分别与LCDSCKSADA0相连,用IO7来作为LCD的选通信号,LCDRES信号上电后会自动复位保证LCD正常工作。

3.3软件实现

       需要对LCD进行复位初始化操作,代码如下:

       void LCDInit(void)

       {

              DelayMs(30);                                                                                                                 LCDWriteCommand(0xae);    //Display Off

              LCDWriteCommand (0xa2);   //lcd bias select  1/9 BIAS

              LCDWriteCommand (0xa1);   //ADC  select,REVERSE                                              LCDWriteCommand (0xc8);   //com                                                                           LCDWriteCommand (0x26);   //RESISTOR RATIO

              LCDWriteCommand (0x81);   //ELECTRONIC VOLUME mode setting

              LCDWriteCommand (0x10);   //Set reference voltagel register                                                                             LCDWriteCommand (0x2f);   //power control(VB,VR,VF=1,1,1)

              DelayMs(50);

              LCDWriteCommand (0xaf);   //set display on

              LCDWriteCommand (0xf8);   //set booster ratio

              LCDWriteCommand (0x00);  

       }

       其中LCDWriteCommand()函数功能是将一个命令字通过SPI接口发送给LCD。初试化函数的功能主要是对LCD做一些硬件属性的配置,如设置对比度,设置分辨率,设置显示页面地址等等。具体可以参考这款液晶的手册。

       对于英文字符的处理,我们是将一个ASCII码的字符库写入内存,再根据字符的ASCII码在字符库中查找,找到对应的字模,提取后发送给LCD进行显示。液晶显示单个字符的函数代码如下:

       void LcmPutChar(unsigned char line,unsigned char column,unsigned char Order)

       {

           unsigned char i;

          unsigned int x;

          x = (Order-0x20)*0x10;                   //ASICC字符从0x20开始,每个16 byte

           LCDSetXY(line,column);

            for(i=0;i<8;i++)

          {

             LCDWriteByte(ASCIIchardot[x]);

             x++;

          }

          LCDSetXY(line+1,column);

          for(i=0;i<8;i++)

          {

             LCDWriteByte( ASCIIchardot[x]);

             x++;

          }      

       }

       LcmPutChar()函数的功能是显示一个16×8ASCII字符,参数line表示显示的行地址,范围03column表示显示的列地址,范围0127Order表示要显示字符在字库表中的首地址。其中LCDWriteByte()函数功能是将一个字节数据通过SPI接口发送给LCD

LCDSetXY()函数功能是定位LCD显示的行列位置。数组ASCIIchardot[]是自定义的字符库。

       对于中文字的处理,由于在我们的应用中汉字显示不常用,因此采用直接将要显示汉字的编码存放于内存中,函数直接调用的方式,这种方式比较简单,适用于显示汉字不多的情况。但如果要大量显示汉字的话,需要将一个标准的汉字字库放到内置或是扩展的存储器中,这会增加硬件成本,因此如何使用要根据实际情况来确定。   

4   基于SHC1411的键盘开发

4.1 键盘实现方案
4.1.1键盘分类

       键盘可以区分为两类:

1.  独立式按键

       独立式按键是直接用I/O线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。

2.  矩阵式按键

       矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。行,列线分别连接到按键的开关的两端,行线设为上拉输入状态,列线设为低电平输出状态,当无按键按下时,行线处于高电平状态;当有按键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定,这是识别按键是否按下的关键。矩阵键盘中的行线、列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,因此,必须将行线、列线信号配合起来做适当处理,才能确定按键的位置。

       矩阵式键盘识别按键的软件方法可以归纳为三种,编程扫描,定时扫描和中断扫描。编程扫描是利用CPU完成其他工作的空余时间,调用键盘扫描子程序来响应键盘输入的要求,在执行键功能程序时,CPU不再响应按键输入要求,直到CPU重新扫描键盘为止。定时扫描是每隔一段时间对键盘扫描一次,利用单片机内部的定时器产生一定的定时,当定时时间到就产生定时器溢出中断,CPU响应中断后对键盘进行扫描,并在有按键按下时识别出该键,再执行该键的功能程序。上述两种方式无论是否按键,CPU都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入,因此,CPU经常处于空扫描状态。为提供CPU工作效率,可采用中断扫描工作方式:当无键按下时,CPU处理自己的工作,当有按键按下时,产生中断请求,CPU立即执行键盘扫描子程序,识别按键号。

4.1.2实现方案 

       根据SHC1411的硬件特点以及只有7IO供驱动4×4键盘的情况,我们采用矩阵式定时扫描的方法。

       SHC1411IO8IO9IO10IO11四个IO口支持外部中断功能,可以实现上升沿或下降沿中断。设计把这四根线作为行线,设为上拉输入模式,另外三个IO口,IO1IO0IO5作为列线,设为低电平输出模式,这样行线与列线的交叉点共有12个,支持12个按键,另外一根列线用接地来 。这样实现了用7IO口支持16个按键的设计。

       扫描原理如下,行线默认为上拉输入,当有按键按下时,按键所在位置的行线会产生外部中断,检测到中断可以确定哪根行线有按键按下,此时,将IO0IO1IO5由原来的输出低电平改为输出高电平,然后再检测行线的状态,如果仍然为低,说明连接地线的那根有按键按下,如不为低再进行如下操作:IO0IO1IO5依次输出低电平,如IO0输出低电平时,行线变低,则说明IO0与行线的交叉点上的按键有按下,依次类推。

4.2 硬件连接图


4 键盘连接图

       4 SHC14117IO口驱动4×4键盘的硬件连接图。

4.3 软件实现

       软件实现 要对IO口进行设置,设置IO的输入输出方向,输出值等。根据实现方案,要将IO8IO9IO10IO11设为上拉输入模式,要将IO0IO1IO5设为低电平输出模式,使能IO口的外部中断。

       以扫描IO11行线为例,给出了一段扫描按键的代码。

void IOIsrProcess(void)

{

       unsigned char temp;

       I_EX_MASK0 = 0x00;                                           //关中断 

       temp = I_EX_EVENT0;                                          //读取中断源扩展寄存器

       I_EX_EVENT0 = 0;                                   //清中断源扩展寄存器

      

       if((temp>>5)&0x01)                                        //如果IO11有下降沿中断发生

       {

              if(!((IO_DATA1>>3)&0x01))                            //如果IO11为低

              {

                     IO_DATA0 |= 0x22;                       //set IO1=1, IO5=1

                    IO_BUF_SW |= 0x01;                    //set IO0=1

                     DelayMs(10);

                     if((IO_DATA1>>3)&0x01)                 //如果IO11为高

                     {

                            IO_DATA0 &= ~0x20;                //set IO5=0

                            if(!((IO_DATA1>>3)&0x01))              //如果IO11为低

                            {

                                   KEY = 10;

                                   IO_DATA0 &= ~0x22;      //set IO1=0,IO5=0 

                                   IO_BUF_SW &= ~0x01;    //set IO0=0

                                   I_EX_MASK0 = 0x3C;        //开中断

                                   return;

                            }

                            IO_DATA0 &=~0x02; //set IO1=0

                            if(!((IO_DATA1>>3)&0x01))              //如果IO11为低

                            {

                                   KEY = 2;

                                   IO_DATA0 &= ~0x22;      //set IO1=0,IO5=0 

                                   IO_BUF_SW &= ~0x01;    //set IO0=0

                                   I_EX_MASK0 = 0x3C;        //开中断

                                   return;

                            }

                            IO_BUF_SW &= ~0x01;         //set IO0=0

                            if(!((IO_DATA1>>3)&0x01))      //如果IO11为低

                            {

                                   KEY = 6;

                                   IO_DATA0 &= ~0x22;      //set IO1=0,IO5=0

                                   IO_BUF_SW &= ~0x01;   //set IO0=0

                                   I_EX_MASK0 = 0x3C;        //开中断

                                   return;

                            }

                     }

                     Else               //IO11为低

                     {

                            KEY = 14;

                            IO_DATA0 &= ~0x22;            //set IO1=0,IO5=0 

                            IO_BUF_SW &= ~0x01;          //set IO0=0

                            I_EX_MASK0 = 0x3C;               //开中断

                            return;

                     }

              }

       }

       else if((temp>>4)&0x01)                                  //如果IO10有下降沿中断

       {

              。。。。。。

       }

       else if((temp>>3)&0x01)                                  //如果IO9有下降沿中断

       {

              。。。。。。

       }

       else if((temp>>2)&0x01)                                  //如果IO8有下降沿中断

       {

              。。。。。。

       }

}

5结语

       本文介绍了华虹SHC1411芯片的一些功能特点和基于此芯片设计的LCD液晶显示和4×4键盘的软、硬件实现方案。实际应用中,我们可以通过SHC141112IO口实现更多的扩展应用。

              沪ICP备19002321号-1 公安全国联网备案编号 备案编号:31011502008572