电子信息工程技术专业《外围电路模块设计》 显示与按键
{
case 0xed: return '4';//P1^3 低返回'4' case 0xdd: return '5';//P1^2 低返回'5' case 0xbd: return '6';//P1^1 低返回'6' case 0x7d: return '7';//P1^0 低返回'7'
default: break;//没有本行的键按下继续下面扫描 }
//---------------------------------------------------- //-------------3-------------------------------------- P2=0XFB;
switch (P2)//测P1^0~~~P1^3 有没有低的 {
case 0xeb: return '8';//P1^3 低返回'8' case 0xdb: return '9';//P1^2 低返回'9' case 0xbb: return 'A';//P1^1 低返回'A' case 0x7b: return 'B';//P1^0 低返回'B'
default: break;//没有本行的键按下继续下面扫描 }
//---------------------------------------------------- //-------------4-------------------------------------- P2=0XF7;
switch (P2)//测P1^0~~~P1^3 有没有低的 {
case 0xe7: return 'C';//P1^3 低返回'C' case 0xd7: return 'D';//P1^2 低返回'D' case 0xb7: return 'E';//P1^1 低返回'E' case 0x77: return 'F';//P1^0 低返回'F' default: break;//没有键按下继续下面 } }
return 0; }
/*LCD 模块初始化*/ void initial_lcd() {
lcd_cs1=0; Rom_CS = 1;
lcd_reset=0; /*低电平复位*/ delay(20);
lcd_reset=1; /*复位完毕*/ delay(20);
transfer_command_lcd(0xe2); /*软复位*/ delay(5);
transfer_command_lcd(0x2c); /*升压步聚 1*/
16
电子信息工程技术专业《外围电路模块设计》 显示与按键
delay(5);
transfer_command_lcd(0x2e); /*升压步聚 2*/ delay(5);
transfer_command_lcd(0x2f); /*升压步聚 3*/ delay(5);
transfer_command_lcd(0x23); /*粗调对比度,可设置范围 0x20~0x27*/ transfer_command_lcd(0x81); /*微调对比度*/
transfer_command_lcd(0x1f); /*0x28,微调对比度的值,可设置范围 0x00~0x3f*/ transfer_command_lcd(0xa2); /*1/9 偏压比(bias)*/ transfer_command_lcd(0xc8); /*行扫描顺序:从上到下*/ transfer_command_lcd(0xa0); /*列扫描顺序:从左到右*/ transfer_command_lcd(0x40); /*起始行:第一行开始*/ transfer_command_lcd(0xaf); /*开显示*/ lcd_cs1=1; }
void lcd_address(uint page,uint column) {
column=column-0x01;
transfer_command_lcd(0xb0+page-1); /*设置页地址*/
transfer_command_lcd(0x10+(column>>4&0x0f)); /*设置列地址的高4 位*/ transfer_command_lcd(column&0x0f); /*设置列地址的低4 位*/ }
/*全屏清屏*/
void clear_screen() {
uchar i,j; lcd_cs1=0; Rom_CS = 1; for(i=0;i<9;i++) {
transfer_command_lcd(0xb0+i); transfer_command_lcd(0x10); transfer_command_lcd(0x00); for(j=0;j<132;j++) {
transfer_data_lcd(0x00); } }
lcd_cs1=1; }
/*显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标*/
17
电子信息工程技术专业《外围电路模块设计》 显示与按键
void display_graphic_16x16(uint page,uint column,uchar *dp) {
uint i,j; lcd_cs1=0; Rom_CS = 1; for(j=0;j<2;j++) {
lcd_address(page+j,column); for (i=0;i<16;i++) {
transfer_data_lcd(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/ dp++; } }
lcd_cs1=1; }
/*显示 8x16 点阵图像、ASCII, 或 8x16 点阵的自造字符、其他图标*/ void display_graphic_8x16(uint page,uchar column,uchar *dp) {
uint i,j; lcd_cs1=0;
for(j=0;j<2;j++) {
lcd_address(page+j,column); for (i=0;i<8;i++) {
transfer_data_lcd(*dp); /*写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1*/ dp++; } }
lcd_cs1=1; }
/*显示 5*7 点阵图像、ASCII, 或 5x7 点阵的自造字符、其他图标*/ void display_graphic_5x7(uint page,uchar column,uchar *dp) {
uint col_cnt;
uchar page_address;
uchar column_address_L,column_address_H; page_address = 0xb0+page-1; lcd_cs1=0;
column_address_L =(column&0x0f)-1;
column_address_H =((column>>4)&0x0f)+0x10;
transfer_command_lcd(page_address); /*Set Page Address*/
transfer_command_lcd(column_address_H); /*Set MSB of column Address*/
18
电子信息工程技术专业《外围电路模块设计》 显示与按键
transfer_command_lcd(column_address_L); /*Set LSB of column Address*/ for (col_cnt=0;col_cnt<6;col_cnt++) {
transfer_data_lcd(*dp); dp++; }
lcd_cs1=1; }
/****送指令到晶联讯字库 IC***/
void send_command_to_ROM( uchar datu ) {
uchar i;
for(i=0;i<8;i++ ) {
if(datu&0x80) Rom_IN = 1; else
Rom_IN = 0; datu = datu<<1; Rom_SCK=0; Rom_SCK=1; } }
/****从晶联讯字库 IC 中取汉字或字符数据(1 个字节)***/ static uchar get_data_from_ROM( ) {
uchar i;
uchar ret_data=0; Rom_SCK=1; for(i=0;i<8;i++) {
Rom_OUT=1; Rom_SCK=0;
ret_data=ret_data<<1; if( Rom_OUT )
ret_data=ret_data+1; else
ret_data=ret_data+0; Rom_SCK=1; }
return(ret_data); }
/*从相关地址(addrHigh:地址高字节,addrMid:地址中字节,addrLow:地址低字节)中连续读出 DataLen 个字节的数据到 pBuff 的地
19
电子信息工程技术专业《外围电路模块设计》 显示与按键
址*/
/*连续读取*/
void get_n_bytes_data_from_ROM(uchar addrHigh,uchar addrMid,uchar addrLow,uchar *pBuff,uchar DataLen ) {
uchar i;
Rom_CS = 0; lcd_cs1=1; Rom_SCK=0;
send_command_to_ROM(0x03); send_command_to_ROM(addrHigh); send_command_to_ROM(addrMid); send_command_to_ROM(addrLow); for(i = 0; i < DataLen; i++ )
*(pBuff+i) =get_data_from_ROM(); Rom_CS = 1; }
/******************************************************************/ ulong fontaddr=0;
void display_GB2312_string(uchar y,uchar x,uchar *text) {
uchar i= 0;
uchar addrHigh,addrMid,addrLow ; uchar fontbuf[32]; while((text[i]>0x00)) {
if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1)) {
/*国标简体(GB2312)汉字在晶联讯字库 IC 中的地址由以下公式来计算:*/ /*Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0*/ /*由于担心 8 位单片机有乘法溢出问题,所以分三部取地址*/ fontaddr = (text[i]- 0xb0)*94; fontaddr += (text[i+1]-0xa1)+846; fontaddr = (ulong)(fontaddr*32);
addrHigh = (fontaddr&0xff0000)>>16; /*地址的高 8 位,共 24 位*/ addrMid = (fontaddr&0xff00)>>8; /*地址的中 8 位,共 24 位*/ addrLow = fontaddr&0xff; /*地址的低 8 位,共 24 位*/
get_n_bytes_data_from_ROM(addrHigh,addrMid,addrLow,fontbuf,32 );/*取 32 个字节的数据,存到\
display_graphic_16x16(y,x,fontbuf);/*显示汉字到 LCD 上,y 为页地址,x 为列地址,fontbuf[]为数据*/ i+=2; x+=16; }
20