基于华虹SHC1411芯片的液晶显示与键盘开发
上海华虹集成电路有限责任公司 施 燕
摘要:SHC1411是上海华虹集成电路有限责任公司针对网银USBKEY应用开发的一款 安全类芯片,自带12个IO口支持多功能扩展应用,本文主要介绍通过IO口驱动的LCD液晶显示和键盘开发。
关键词:SHC1411 LCD液晶 键盘
随着网上银行业务的不断发展,USBKEY的应用也迅速发展,除了普通KEY的应用外,从安全性角度出发,各大银行提出了更高要求的USBKEY应用,如增加LCD液晶显示,在USBKEY上增加键盘方便用户观察和操作USBKEY。在这种市场需求背景下,华虹设计推出了新一代安全芯片SHC1411。
1 SHC1411简要介绍
SHC1411芯片是一款8位CPU安全芯片,具有高安全、低功耗、可扩展性强的特点,可用于USBKEY、接触式智能卡、安全产品等领域。芯片集成8位微处理器、256字节IRAM、4K字节XRAM、一片160K字节的大页面Flash和一片8K字节的小页面Flash,提供总线加密功能,提供多种安全算法协处理器,提供高安全机制的防攻击功能,提供符合USB1.1规范的USB接口,提供符合ISO/IEC7816规范的串行I/O接口,提供主从SPI接口,外部工作电压为3.0V至5.5V,工作环境-25°C至+85°C,MCU工作频率范围1MHz-16MHz。自带12个IO口,可以支持多功能的扩展应用。
在USBKEY上增加LCD显示屏及键盘,可以将PC端传输到USBKEY的关键数据,如帐号、交易金额等信息在LCD屏上显示出来,再通过客户自己操作键盘来完成交易过程,这样可以降低此过程中数据被恶意篡改的风险,提高交易的安全性。
2 带LCD液晶显示和键盘的网银解决方案
传统的网银使用的USBKEY上没有LCD液晶和键盘,USBKEY仅是一个产生签名的工具。但随着网银业务的发展,越来越多的安全性方面的需求被提出,USBKEY在交易过程中的角色也不断丰富,功能也不断增强,除了传统的签名功能外,还将LCD液晶显示和键盘集成进来,担负起更多的安全保护的角色。
2.1传统的网银业务的缺点
传统的网银业务流程如图1所示:
图1:网银客户端认证流程示意图
在图示的A,B,C环节都会产生安全风险,A环节存在黑客从客户端篡改交易信息(如交易账号和交易金额等)的风险,B环节存在黑客从客户端窃取用户口令的风险,C环节存在黑客从“客户端与USBKEY间通讯总线”上截取或篡改交易信息和用户口令的风险。上面三个环节的问题可以归纳为两大类:伪造签名和篡改数据,一方面黑客可以通过窃取用户口令获取USBKEY的访问权限,伪造签名,另一方面黑客可以在用户不知情的情况下篡改交易账号,交易金额等交易数据。
2.2带LCD和键盘的USBKEY解决方案
带LCD和键盘的USBKEY在硬件上集成了LCD液晶显示屏和键盘,用户信息经PC机USB端口传给USBKEY,USBKEY会将接收到的信息中的一些重要信息,如交易账号,交易金额在LCD显示屏上显示出来,用户在观察到LCD显示的信息后通过操作按键来确认或取消本次交易。一些重要的信息在硬件设备上显示出来,再由用户进行确认操作,如果LCD上显示的信息不正确,用户就不会进行接下来的确认操作。这种设计可以有效的降低篡改数据的风险。
2.3 SHC1411上的LCD+键盘方案实现
SHC1411共有12个IO口可使用,其中有4个IO口与硬件SPI接口的四个信号复用,分别是IO2(SCK),IO3(MOSI),IO4(MISO),IO6(CS),另外12个IO口中有四个IO口支持外部中断功能。我们的设计目标是一个带AutoRun功能的LCD+键盘的解决方案。按照设计的需求,除了驱动一个SPI接口的LCD液晶和一个4×4的键盘外还需外挂一块SPI接口的Flash,SPI接口的Flash需要占用四个IO口,而SPI接口的LCD液晶也需要占用四个IO口作为SPI接口的四根信号线,其中选通信号CS不能复用,其余三个信号可以复用,所以外挂Flash和LCD共占用到5个IO口,那么4×4键盘只有7个IO口可以使用。图2是一个带LCD和键盘的USBKEY示意图。
图2:带LCD和键盘的USBKEY示意图
3 基于SHC1411的LCD液晶显示开发
3.1 液晶模块介绍
选用飞格达电子的一款LCD,型号为FGD13232-7565R-18P2,内嵌LCD控制器ST的ST7565R,分辨率为132×32,汉字点阵为16x16,字符点阵为16x8,可显示2行8列的汉字或者2行16列字符。
MCU通过SPI接口与LCD连接,实际应用中可以采用硬件SPI控制,也可以用软件驱动IO口来模拟SPI控制。这里我们采用硬件SPI控制。
3.2硬件连接图
图3:MCU与LCD连接图
图3给出了SHC1411与LCD的连接示意图,SHC1411的SPI接口中的三根信号线CLK,MOSI,MISO分别与LCD的SCK,SAD,A0相连,用IO7来作为LCD的选通信号,LCD的RES信号上电后会自动复位保证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×8的ASCII字符,参数line表示显示的行地址,范围0-3,column表示显示的列地址,范围0-127,Order表示要显示字符在字库表中的首地址。其中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的硬件特点以及只有7个IO供驱动4×4键盘的情况,我们采用矩阵式定时扫描的方法。
SHC1411的IO8,IO9,IO10,IO11四个IO口支持外部中断功能,可以实现上升沿或下降沿中断。设计把这四根线作为行线,设为上拉输入模式,另外三个IO口,IO1,IO0,IO5作为列线,设为低电平输出模式,这样行线与列线的交叉点共有12个,支持12个按键,另外一根列线用接地来 。这样实现了用7个IO口支持16个按键的设计。
扫描原理如下,行线默认为上拉输入,当有按键按下时,按键所在位置的行线会产生外部中断,检测到中断可以确定哪根行线有按键按下,此时,将IO0,IO1,IO5由原来的输出低电平改为输出高电平,然后再检测行线的状态,如果仍然为低,说明连接地线的那根有按键按下,如不为低再进行如下操作:IO0,IO1,IO5依次输出低电平,如IO0输出低电平时,行线变低,则说明IO0与行线的交叉点上的按键有按下,依次类推。
4.2 硬件连接图
图4: 键盘连接图
图4 是SHC1411用7个IO口驱动4×4键盘的硬件连接图。
4.3 软件实现
软件实现 要对IO口进行设置,设置IO的输入输出方向,输出值等。根据实现方案,要将IO8,IO9,IO10,IO11设为上拉输入模式,要将IO0,IO1,IO5设为低电平输出模式,使能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键盘的软、硬件实现方案。实际应用中,我们可以通过SHC1411的12个IO口实现更多的扩展应用。