|
包括点、线、圆、矩形、反显、任意位置的读写、汉字字符的写,内容丰富,很有用 ,在产品中已经应用
- #include "stm32f10x.h"
- #include "lcd.h"
- #include "delay.h"
- #include "wdg.h"
- //////////////////////////////////////////////////////////////////////////////////
- // STM32F103RB控制LCD19264
- // LCD数据接口 DB0-DB7 PA0--PA7 写:推挽输出,读:上拉输入
- // LCD_CS1 PC9 CS1 CS2:00:左1/3屏,01:中1/3,10:右1/3 推挽输出
- /// LCD_CS2 PB11 推挽输出
- // LCD_E PB0 推挽输出
- // LCD_RW PB1 推挽输出
- // LCD_RS PB10 推挽输出
- //////////////////////////////////////////////////////////////////////////////////
-
- GPIO_InitTypeDef GPIO_InitStructure;
- /*****************************************************************
- 字库函数
- *******************************************************************/
- void SPI_init(void) // SPI初始化
- {
- SPI_InitTypeDef SPI_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
-
- //初始化CS
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- //初始化SCK 推挽复用输出
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- //初始化MISO 输入 上拉输入
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- //初始化MOSI 输出 推挽复用输出
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- //SPI初始化
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 双线全双工
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // 主模式
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 8位数据帧
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // 波特率预分频值
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // 数据传输从高位开始
- SPI_InitStructure.SPI_CRCPolynomial = 7; //
- SPI_Init(SPI2, &SPI_InitStructure);
-
- GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15);
- SPI_Cmd(SPI2, ENABLE);
- }
- //SPI 读写一个字节
- //TxData: 要写入的字节
- //返回值:要读取的字节
- u8 SPI_Send_byte(u8 dataa)
- {
- u8 retry=0;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != SET)
- {
- retry++;
- if(retry>200)return 0;
- }
- SPI_I2S_SendData(SPI2, dataa);
- retry=0;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) != SET)
- {
- retry++;
- if(retry>200)return 0;
- }
- return SPI_I2S_ReceiveData(SPI2);
- }
- u8 SPI_Receive_byte(void)
- {
- u8 retry=0;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != SET)
- {
- retry++;
- if(retry>200)return 0;
- }
- SPI_I2S_SendData(SPI2, 0x00);
-
- retry=0;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)
- {
- retry++;
- if(retry>200)return 0;
- }
- return SPI_I2S_ReceiveData(SPI2);
- }
- ////////////////////////////////////////////////////
- // 从字库芯片中读取len字节长度的数据 地址为24位
- //////////////////////////////////////////////////////
- void read_bytes_fromZIC(u8 *pbuffer,u32 addr,u16 len)
- {
- u8 highaddr,middaddr,lowaddr;
- u8 i;
- u8 res;
- highaddr=(u8)((addr)>>16)&0xff;
- middaddr=(u8)((addr)>>8)&0xff;
- lowaddr=(u8)(addr)&0xff;
- # if read_fast_ic==0
- ZIC_CS=0;
- // ZIC_SCK=0;
- SPI_Send_byte(0x03);
- SPI_Send_byte(highaddr);
- SPI_Send_byte(middaddr);
- SPI_Send_byte(lowaddr);
- for(i=0;i<len;i++)
- {
- res = (u8)SPI_Receive_byte();
- pbuffer[i] = res;
- }
- ZIC_CS=1;
- # else
- ZIC_CS=0;
- // ZIC_SCK=0;
- SPI_Send_byte(0x0B);
- SPI_Send_byte(highaddr);
- SPI_Send_byte(middaddr);
- SPI_Send_byte(lowaddr);
- SPI_Send_byte(0XFF);
- for(i=0;i<len;i++)
- {
- res = (u8)SPI_Receive_byte();
- *pbuffer = res;
- pbuffer+=1;
- }
- ZIC_CS=1;
- #endif
- }
- /**************************************************
- LCD函数
- ****************************************************/
- void LCD_Init(void) //LED IO初始化
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); //使能PA端口时钟
- ////////////////////////////////////////////////////////////////////
- ///数据口初始化为推挽输出
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
- GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //LED0-->PA. 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- //////////////////////////////////////////////////////////////////////
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //LCD-->PC.10 背光控制
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_SetBits(GPIOC,GPIO_Pin_10); //PD.2 输出高
- /////////////////////////////////////////////////
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //LCD控制口
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9); //输出高
- }
- void LCD_confing(void)
- {
- LCD_Init();
- LCD_clear();
- LCD_CS1=0;
- LCD_CS2=0;
- LCD_write_command(BEGIN_ROW) ;
- LCD_write_command(LCD_ON);
- LCD_CS1=0;
- LCD_CS2=1;
- LCD_write_command(BEGIN_ROW) ;
- LCD_write_command(LCD_ON);
- LCD_CS1=1;
- LCD_CS2=0;
- LCD_write_command(BEGIN_ROW) ;
- LCD_write_command(LCD_ON);
- SPI_init();
- }
- //////////////////////////////////////////////////
- // 函数名 Light_control()
- // 功能 背光控制 0 关背光 1 开背光
- /////////////////////////////////////////////////
- void Light_control(u8 light_flag)
- {
- PCout(10) = light_flag;
- }
- //////////////////////////////////////////////////
- //查询状态位
- void checkbusy(void)
- {
- u8 kk;
- /* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
- GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7 ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
- GPIO_Init(GPIOA, &GPIO_InitStructure); */
- /* GPIO_SetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
- GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);*/
- GPIOA->CRL = 0x44444444;
- GPIOA->BSRR=0X00FF;
- while(1)
- {
- LCD_RW=1;
- LCD_RS=0;
- LCD_E=1;
- delay_us(7);
- kk = (GPIOA->IDR&0xff)&0x80;
- delay_us(3);
- LCD_E=0;
- if(kk!=0x80)break;
- }
- // while(kk==0x80) ;
- GPIOA->CRL = 0x33333333;
-
- /* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
- GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure);*/
-
- }
- /////////////////////////////////////////写命令
- void LCD_write_command(u8 command)
- {
- checkbusy();
- LCD_RW=0;
- LCD_RS=0;
- delay_us(1);
- // GPIOA->ODR = GPIOA->ODR&0xff00;
- GPIOA->ODR = command;
-
- LCD_E=1;
- delay_us(3);
- LCD_E=0;
- }
- ////////////////////////////////////////写数据
- void LCD_write_data(u8 datt)
- {
- checkbusy();
- LCD_RW=0;
- LCD_RS=1;
- delay_us(1);
- // GPIOA->ODR = GPIOA->ODR&0xff00 ;
- GPIOA->ODR = datt;
- LCD_E=1;
- delay_us(3);
- LCD_E=0;
- }
- //////////////////////////////////////读数据
- u8 LCD_read_data(void)
- {
- u8 aa;
- /* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
- GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //LED0-->PA.8 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
- GPIO_Init(GPIOA, &GPIO_InitStructure);*/
- delay_us(6);
- GPIOA->CRL = 0x88888888; //初始化为上拉输入 PA0-7
- GPIOA->BSRR=0X00FF; //假读一次
- LCD_RW=1;
- LCD_RS=1;
- LCD_E=1;
- LCD_E=0;
-
- GPIOA->BSRR=0X00FF;
- LCD_RW=1;
- LCD_RS=1;
- LCD_E=1;
- delay_us(3); //
- aa=(u8)(GPIOA->IDR&0xff);
- delay_us(2);
- LCD_E=0;
-
- /* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
- GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; //LED0-->PA.8 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure);*/
- GPIOA->CRL = 0x33333333; //////推挽输出
- GPIOA->BSRR=0X00FF;
- return aa;
- }
- ///////////////////////////////////////////////连续读
- // 函数名:LCD_read_n_dat()
- // 功能 :在指定的位置读取n列数据
- //
- //
- ///////////////////////////////////////////////
- void LCD_read_n_dat(u8 *buffer,u8 page,u8 y,u8 n)
- {
- u8 i;
-
- LCD_write_command(BEGIN_PAGE+page);
- LCD_write_command(BEGIN_Y+y);
- delay_us(6);
- GPIOA->CRL = 0x88888888; //初始化为上拉输入 PA0-7
- GPIOA->BSRR=0X00FF;
- LCD_RW=1;
- LCD_RS=1;
- LCD_E=1;
- // delay_us(1);
- LCD_E=0;
-
- GPIOA->BSRR=0X00FF;
- LCD_RW=1;
- LCD_RS=1;
- for(i=0;i<n;i++)
- {
- LCD_E=1;
- delay_us(3);
- buffer[i] =~((u8)(GPIOA->IDR&0x00ff));
- // buffer[i] = ~buffer[i];
- delay_us(2);
- LCD_E=0;
- delay_us(3);
- }
- GPIOA->CRL = 0x33333333; //////推挽输出
- GPIOA->BSRR=0X00FF;
- }
- void LCD_read_zheng_dat(u8 *buffer,u8 page,u8 y,u8 n)
- {
- u8 i;
- LCD_write_command(BEGIN_PAGE+page);
- LCD_write_command(BEGIN_Y+y);
- delay_us(6);
- GPIOA->CRL = 0x88888888; //初始化为上拉输入 PA0-7
- GPIOA->BSRR=0X00FF;
- LCD_RW=1;
- LCD_RS=1;
- LCD_E=1;
- LCD_E=0;
-
- GPIOA->BSRR=0X00FF;
- LCD_RW=1;
- LCD_RS=1;
- for(i=0;i<n;i++)
- {
- LCD_E=1;
- delay_us(3);
- buffer[i] =(u8)(GPIOA->IDR&0x00ff);
- delay_us(2);
- LCD_E=0;
- delay_us(3);
- }
- GPIOA->CRL = 0x33333333; //////推挽输出
- GPIOA->BSRR=0X00FF;
- }
- ///////////////////////////////////////////////////////////
- // 函数名 :display_onepage_reverse_cor
- // 功能 :在指定的页反色显示
- //
- //
- ///////////////////////////////////////////////////////////
- void display_onepage_reverse_cor(u8 onepage,u8 y1,u8 len)
- {
- u8 y2;
- u8 andy;
- u8 oddy;
- u8 strdata[190];
- y2 =y1+len-1;
- if((y1<64)&&(y2<64))
- {
- LCD_CS1 =0;
- LCD_CS2 =0;
- LCD_read_n_dat(strdata,onepage,y1,len);
- write_page_8bit(strdata,onepage,y1, len);
- }
- else if((y1<64)&&(y2>=64)&&(y2<128))
- {
- oddy =64-y1;
- andy =len-oddy;
- LCD_CS1 =0;
- LCD_CS2 =0;
- LCD_read_n_dat(strdata,onepage,y1,oddy);
- write_page_8bit(strdata,onepage,y1, oddy);
-
-
- LCD_CS1 =0;
- LCD_CS2 =1;
- LCD_read_n_dat(strdata,onepage,0,andy);
- write_page_8bit(strdata,onepage,0, andy);
-
- }
- else if((y1<64)&&(y2>=128)) //1、2、3屏中
- {
- oddy =64-y1;
- andy =y2-127;
- // andy = len-64-oddy;
- LCD_CS1 =0;
- LCD_CS2 =0;
- LCD_read_n_dat(strdata,onepage,y1,oddy);
- write_page_8bit(strdata,onepage,y1, oddy);
-
- LCD_CS1 =0;
- LCD_CS2 =1;
- LCD_read_n_dat(strdata,onepage,0,64);
- write_page_8bit(strdata,onepage,0, 64);
-
- LCD_CS1 =1;
- LCD_CS2 =0;
- LCD_read_n_dat(strdata,onepage,0,andy);
- write_page_8bit(strdata,onepage,0, andy);
-
- }
- else if((y1>63)&&(y1<128)&&(y2<128))
- {
- LCD_CS1 =0;
- LCD_CS2 =1;
- LCD_read_n_dat(strdata,onepage,y1-64,len);
- write_page_8bit(strdata,onepage,y1-64, len);
- }
- else if((y1>63)&&(y1<128)&&(y2>=128))
- {
- oddy =128-y1;
- andy =len-oddy;
- LCD_CS1 =0;
- LCD_CS2 =1;
- LCD_read_n_dat(strdata,onepage,y1-64,oddy);
- write_page_8bit(strdata,onepage,y1-64, oddy);
-
- LCD_CS1 =1;
- LCD_CS2 =0;
-
- LCD_read_n_dat(strdata,onepage,0,andy);
- write_page_8bit(strdata,onepage,0, andy);
-
- }
- else
- {
- LCD_CS1 =1;
- LCD_CS2 =0;
- LCD_read_n_dat(strdata,onepage,y1-128,len);
- write_page_8bit(strdata,onepage,y1-128, len);
- }
- }
- ///////////////////////////////////////////////////
- // 函数名 :Set_byte_reverse()
- // 功能 :单字节取反
- /////////////////////////////////////////////////
- u8 Set_low_byte_reverse(u8 datt,u8 len) //从低位开始取反
- {
- static u8 aa;
- u8 i;
- aa =datt;
- for(i=0;i<len;i++)
- {
- if(datt&0x01)aa &= (u8)(~(1<<i)); //取反
- else aa |= (u8)(1<<i);
- datt=datt>>1;
- }
- return aa;
- }
- u8 Set_high_byte_reverse(u8 datt,u8 len) //从高位开始取反
- {
- static u8 aa;
- u8 i;
- aa =datt;
- for(i=0;i<len;i++)
- {
- if(datt&0x80)aa &= (u8)(~(1<<(7-i)));
- else aa |= (u8)(1<<(7-i));
- datt=datt<<1;
- }
- return aa;
- }
- ////////////////////////////////////////////////////////////////////
- // 函数名:display_lossonepage_revcor
- // 功能 :不足一页的反显
- // corflag表示一页中向上取还是向下取值 0:上 1:下
- ////////////////////////////////////////////////////////////////////
- void display_lossonepage_revcor(u8 onepage,u8 onerow,u8 y1,u8 ylen,u8 corflag)
- {
- u8 i;
- u8 y2;
- u8 oddy,andy;
- u8 strdata[70];
- u8 strdata1[70];
- u8 strdata2[70];
- y2 =y1+ylen-1;
- if((y1<64)&&(y2<64)) ///////第一屏
- {
- LCD_CS1 =0;
- LCD_CS2 =0;
- IWDG_Feed();
- LCD_read_zheng_dat(strdata,onepage, y1,ylen);
- if(corflag==0)
- {
- for(i=0;i<ylen;i++)
- {
- strdata[i] =Set_high_byte_reverse(strdata[i], onerow);
- }
- }
- else
- {
- for(i=0;i<ylen;i++)
- {
- strdata[i] =Set_low_byte_reverse(strdata[i], onerow);
- }
- }
- IWDG_Feed();
- write_page_8bit(strdata,onepage,y1, ylen);
- }
- else if((y1<64)&&(y2>=64)&&(y2<128)) /////第一 屏和第二屏
- {
- oddy =64-y1; //di yi ping
- andy =ylen-oddy;
- LCD_CS1 =0;
- LCD_CS2 =0;
- IWDG_Feed();
- LCD_read_zheng_dat(strdata,onepage, y1,oddy);
- if(corflag==0)
- {
- for(i=0;i<oddy;i++)
- {
- strdata[i] =Set_high_byte_reverse(strdata[i], onerow);
- }
- }
- else
- {
- for(i=0;i<oddy;i++)
- {
- strdata[i] =Set_low_byte_reverse(strdata[i], onerow);
- }
- }
- write_page_8bit(strdata,onepage,y1, oddy);
- LCD_CS1 =0;
- LCD_CS2 =1;
- LCD_read_zheng_dat(strdata1,onepage, 0,andy);
- if(corflag==0)
- {
- for(i=0;i<andy;i++)
- {
- strdata1[i] =Set_high_byte_reverse(strdata1[i], onerow);
- }
- }
- else
- {
- for(i=0;i<andy;i++)
- {
- strdata1[i] =Set_low_byte_reverse(strdata1[i], onerow);
- }
- }
- IWDG_Feed();
- write_page_8bit(strdata1,onepage,0, andy);
- }
- else if((y1<64)&&(y2>=128)) /////////////第123屏
- {
- oddy =64-y1;
- andy =y2-127;
- LCD_CS1 =0;
- LCD_CS2 =0;
- IWDG_Feed();
- LCD_read_zheng_dat(strdata,onepage, y1,oddy);
- if(corflag==0)
- {
- for(i=0;i<oddy;i++)
- {
- strdata[i] =Set_high_byte_reverse(strdata[i], onerow);
- }
- }
- else
- {
- for(i=0;i<oddy;i++)
- {
- strdata[i] =Set_low_byte_reverse(strdata[i], onerow);
- }
- }
- write_page_8bit(strdata,onepage,y1, oddy);
- IWDG_Feed();
- LCD_CS1 =0;
- LCD_CS2 =1;
- LCD_read_zheng_dat(strdata1,onepage, 0,64);
- if(corflag==0)
- {
- for(i=0;i<64;i++)
- {
- strdata1[i] =Set_high_byte_reverse(strdata1[i], onerow);
- }
- }
- else
- {
- for(i=0;i<64;i++)
- {
- strdata1[i] =Set_low_byte_reverse(strdata1[i], onerow);
- }
- }
- write_page_8bit(strdata1,onepage,0, 64);
- IWDG_Feed();
- LCD_CS1 =1;
- LCD_CS2 =0;
- LCD_read_zheng_dat(strdata2,onepage, 0,andy);
- if(corflag==0)
- {
- for(i=0;i<andy;i++)
- {
- strdata2[i] =Set_high_byte_reverse(strdata2[i], onerow);
- }
- }
- else
- {
- for(i=0;i<andy;i++)
- {
- strdata2[i] =Set_low_byte_reverse(strdata2[i], onerow);
- }
- }
- write_page_8bit(strdata2,onepage,0, andy); ///////////////////////////////////
- IWDG_Feed();
-
- }
- else if((y1>63)&&(y1<128)&&(y2<128)) ///////第 2 屏
- {
- LCD_CS1 =0;
- LCD_CS2 =1;
- LCD_read_zheng_dat(strdata,onepage, y1-64,ylen);
- if(corflag==0)
- {
- for(i=0;i<ylen;i++)
- {
- strdata[i] =Set_high_byte_reverse(strdata[i], onerow);
- }
- }
- else
- {
- for(i=0;i<ylen;i++)
- {
- strdata[i] =Set_low_byte_reverse(strdata[i], onerow);
- }
- }
- write_page_8bit(strdata,onepage,y1-64, ylen); //先把一整页字节取出来 后再处理
- IWDG_Feed();
- }
- else if((y1>63)&&(y1<128)&&(y2>=128)) //////2 3
- {
- oddy =128-y1;
- andy =ylen-oddy;
- LCD_CS1 =0;
- LCD_CS2 =1;
- LCD_read_zheng_dat(strdata,onepage, y1-64,oddy);
- if(corflag==0)
- {
- for(i=0;i<oddy;i++)
- {
- strdata[i] =Set_high_byte_reverse(strdata[i], onerow);
- }
- }
- else
- {
- for(i=0;i<oddy;i++)
- {
- strdata[i] =Set_low_byte_reverse(strdata[i], onerow);
- }
- }
- write_page_8bit(strdata,onepage,y1-64, oddy);
-
- LCD_CS1 =1;
- LCD_CS2 =0;
- LCD_read_zheng_dat(strdata1,onepage, 0,andy);
- if(corflag==0)
- {
- for(i=0;i<andy;i++)
- {
- strdata1[i] =Set_high_byte_reverse(strdata1[i], onerow);
- }
- }
- else
- {
- for(i=0;i<andy;i++)
- {
- strdata1[i] =Set_low_byte_reverse(strdata1[i], onerow);
- }
- }
- write_page_8bit(strdata1,onepage,0, andy);
- IWDG_Feed();
- }
- else
- {
- LCD_CS1 =1;
- LCD_CS2 =0;
- LCD_read_zheng_dat(strdata,onepage, y1-128,ylen);
- if(corflag==0)
- {
- for(i=0;i<ylen;i++)
- {
- strdata[i] =Set_high_byte_reverse(strdata[i], onerow);
- }
- }
- else
- {
- for(i=0;i<ylen;i++)
- {
- strdata[i] =Set_low_byte_reverse(strdata[i], onerow);
- }
- }
- write_page_8bit(strdata,onepage,y1-128, ylen);
- IWDG_Feed();
- }
- }
- ////////////////////////////////////////
- // 函数名 :display_reverse_cor
- // 功能 :反色显示
- // display_onepage_reverse_cor(u8 onepage,u8 y1,u8 len)
- // LCD_read_n_dat(u8 *buffer,u8 page,u8 y,u8 n)
- // display_lossonepage_revcor(u8 onepage,u8 onerow,u8 y1,u8 ylen,u8 corflag)
- ///////////////////////////////////////
- void display_reverse_cor(u8 x1,u8 y1,u8 x2,u8 y2)
- {
- u8 i;
- int xlen; // x长度
- int ylen; //y 长度
- u8 temp;
- u8 wholepage1; // 是否是处在整页的开始
- u8 wholepage2;
- u8 wholepage;
- u8 remainrow1;
- // u8 remainrow2;
- u8 whererow1;
- u8 whererow2;
- u8 temppage;
-
- if(y1>y2)
- {
- temp =y1;
- y1 =y2;
- y2 =temp;
- }
- if(x1>x2)
- {
- temp =x1;
- x1 =x2;
- x2 =temp;
- }
- xlen = x2-x1+1;
- ylen = (y2-y1)+1;
- wholepage1 =x1/8; //
- wholepage2 =x2/8; //
- whererow1 =x1%8; //是否是整页的起始
- whererow2 =(x2+1)%8;
- if(xlen==8) // 如果是一个字节
- {
- if(whererow1==0) //如果是整页
- {
- IWDG_Feed();
- display_onepage_reverse_cor(wholepage1,y1, ylen);
- }
- else //如果不是
- {
- IWDG_Feed();
- remainrow1 = 8-whererow1;
- display_lossonepage_revcor( wholepage1, remainrow1,y1, ylen, 0);
- display_lossonepage_revcor( wholepage2, whererow2, y1,ylen, 1);
- }
- } //多余一个字节
- else if(xlen>8)
- {
-
- if((whererow1==0)&&(whererow2==0))
- {
- wholepage = xlen/8;
- for(i=0;i<wholepage;i++)
- {
- display_onepage_reverse_cor(wholepage1+i,y1, ylen);
- }
- }
- else
- {
- remainrow1 = 8-whererow1; ////首页行数 末页行数是whererow2
- // remainrow2 = 8-whererow2;
- temppage = xlen-(remainrow1+whererow2); //判断有几个整页
- if(temppage>=8)
- wholepage = temppage/8;
- else wholepage=0;
- IWDG_Feed();
- display_lossonepage_revcor( wholepage1, remainrow1,y1, ylen, 0); //上半部分
-
- for(i=0;i<wholepage;i++) //中间整页部分
- {
- display_onepage_reverse_cor(wholepage1+1+i,y1, ylen);
- }
- IWDG_Feed();
- display_lossonepage_revcor( wholepage2, whererow2, y1,ylen, 1); //下半部分
- ///////////////////////////////////////////////////////////////
- }
- }
- }
- ////////////////////////////////////////清屏
- //
- // write_wherepage_8bit(u8 data,u8 page,u8 y)
- /////////////////////////////////////////
- void LCD_clear(void)
- {
- u16 count;
- u8 page,temp=1,num;
- LCD_CS1=LCD_CS2=0;
- for(num=0;num<3;num++)
- {
- // LCD_write_command(0xc0); ////////////行显示
- for(page=0xb8;page<0xc0;page++)
- {
- LCD_write_command(0xc0);
- LCD_write_command(page);
- for(count=64;count>0;count--)
- {
- LCD_write_data(0x00);
- }
- }
- LCD_CS1=LCD_CS2;
- LCD_CS2=temp;
- temp=LCD_CS1;
-
- }
- }
- ///////////////////////////////////////////////////////
- // 在一屏内指定的页指定的列写n列数据
- //函数名: write_page_8bit
- ///////////////////////////////////////////////////////
- void write_page_8bit(u8 *buffer,u8 page,u8 y,u8 n)
- {
- u8 i;
- LCD_write_command(BEGIN_PAGE+page);
- LCD_write_command(BEGIN_Y+y);
- for(i=0;i<n;i++)
- {
- LCD_write_data(*buffer);
- buffer++;
- }
- }
- ////////////////////////////////////////////////////////
- // 函数名:write_xy_piont
- // 功能: 在指定的行和列 画一个点或者删除一个点
- // flag: 0 删除一个点 ,1 画一个点
- // CS1 CS2 :00 ,01 ,10
- ////////////////////////////////////////////////////////
- void write_xy_point(u8 x,u8 y,u8 flag)
- {
- u8 oddwei;
- u8 wholepage;
- u8 rowdata;
- rowdata=0;
- wholepage=x/8; //行所在的页数
- oddwei=x%8; //所在页数的第几页
- if(y<64)
- {
- LCD_CS1=0;
- LCD_CS2=0;
- LCD_write_command(BEGIN_PAGE+wholepage);
- LCD_write_command(BEGIN_Y+y);
- // checkbusy();
- rowdata= LCD_read_data();
- if(flag==1)
- rowdata |= 1<<oddwei;
- else
- rowdata &=~(1<<oddwei);
- write_page_8bit(&rowdata,wholepage,y,1);
- // LCD_write_data(rowdata);
-
- }
- else if((y>=64)&&(y<128))
- {
- LCD_CS1=0;
- LCD_CS2=1;
- LCD_write_command(BEGIN_PAGE+wholepage);
- LCD_write_command(BEGIN_Y+y-64);
- // checkbusy();
- rowdata= LCD_read_data();
- if(flag==1)
- rowdata |= 1<<oddwei;
- else
- rowdata &=~(1<<oddwei);
- write_page_8bit(&rowdata,wholepage,y-64,1);
- // LCD_write_data(rowdata);
-
- }
- else
- {
- LCD_CS1=1;
- LCD_CS2=0;
- LCD_write_command(BEGIN_PAGE+wholepage);
- LCD_write_command(BEGIN_Y+y-128);
- // checkbusy();
- rowdata= LCD_read_data();
- if(flag==1)
- rowdata |= 1<<oddwei;
- else
- rowdata &=~(1<<oddwei);
- write_page_8bit(&rowdata,wholepage,y-128,1);
- // LCD_write_data(rowdata);
- }
- }
- /////////////////////////////////////////////////////////////////
- // 画圆
- //
- //
- ///////////////////////////////////////////////////////////////
- void draw_circle(u8 x0,u8 y0,u8 r,u8 flagg)
- {
- int a,b;
- int di;
- a=0;b=r;
- di=3-(r<<1); //
- while(a<=b)
- {
- write_xy_point(x0-b,y0-a,flagg); //3
- write_xy_point(x0+b,y0-a,flagg); //0
- write_xy_point(x0-a,y0+b,flagg); //1
- write_xy_point(x0-b,y0-a,flagg); //7
- write_xy_point(x0-a,y0-b,flagg); //2
- write_xy_point(x0+b,y0+a,flagg); //4
- write_xy_point(x0+a,y0-b,flagg); //5
- write_xy_point(x0+a,y0+b,flagg); //6
- write_xy_point(x0-b,y0+a,flagg);
- a++;
- //Bresenham
- if(di<0)di +=4*a+6;
- else
- {
- di+=10+4*(a-b);
- b--;
- }
- write_xy_point(x0+a,y0+b,flagg);
- }
- }
- ////////////////////////////////////////////////////////////////
- // 函数名: draw_line
- // 功能 : 在任意两点间画一条直线或者删除一条直线
- //Bresenham算法-直线光栅法算法 flag : 0 删除,1 画一条直线
- ////////////////////////////////////////////////////////////////
- void draw_line(u8 x0,u8 y0,u8 x1,u8 y1,u8 flag)
- {
- u16 t;
- int nowrow,nowcol; // 行 列
- int incx,incy; // 基准
- int distance_x,distance_y,distance;
- int xerr=0,yerr=0;
-
- nowrow=x0;
- nowcol=y0;
- distance_x=(int)x1-(int)x0+1;
- distance_y=(int)y1-(int)y0+1;
- if(distance_x>0)incx=1; // 判断x1 yu x0 大小,然后给基准x赋值
- else if(distance_x==0)incx=0;
- else
- {
- incx=-1;
- distance_x=(-distance_x)+2;
- }
- if(distance_y>0)incy=1; //判断y1 与 y0 大小,然后给基准x赋值
- else if(distance_y==0)incy=0;
- else
- {
- incy=-1;
- distance_y=(-distance_y)+2;
- }
- if(distance_x>distance_y)distance=distance_x;
- else distance=distance_y;
- for(t=0;t<distance+1;t++)
- {
- write_xy_point(nowrow,nowcol,flag);
- xerr+=distance_x;
- yerr+=distance_y;
- if(xerr>distance)
- {
- xerr-=distance;
- nowrow+=incx;
- }
- if(yerr>distance)
- {
- yerr-=distance;
- nowcol+=incy;
- }
- }
- }
- //////////////////////////////////////////////////////
- // 函数名: draw_dect
- // 功能 : 画一个矩形(x1,y1)(x2,y2)或者删除一个矩形
- ////////////////////////////////////////////////////////
- void draw_dect(u8 x1,u8 y1,u8 x2,u8 y2,u8 flag)
- {
- draw_line(x1,y1,x1,y2,flag);
- draw_line(x1,y2,x2,y2,flag);
- draw_line(x2,y1,x2,y2,flag);
- draw_line(x1,y1,x2,y1,flag);
- }
- /////////////////////////////////////////////////////
- // 函数名:fill_rect
- // 功能 :填充指定的矩形区域
- ////////////////////////////////////////////////////
- void fill_rect(u8 x0,u8 y0,u8 x1,u8 y1,u8 flag)
- {
- u8 i;
- u8 distance_x;
- if(x0>x1)
- {
- distance_x=x0-x1;
- for(i=0;i<=distance_x;i++)
- {
- draw_line(x1+i,y0,x1+i,y1,flag);
- }
- }
- else
- {
- distance_x=x1-x0;
- for(i=0;i<=distance_x;i++)
- {
- draw_line(x0+i,y0,x0+i,y1,flag);
- }
- }
- }
- ////////////////////////////////////////////////////////
- // 函数名: write_xy_8bit
- // 功能 :在任意的x,y点写一列数据
- // 为在任意的位置写字符和汉字做准备
- ////////////////////////////////////////////////////////
- void write_xy_8bit(u8 datt,u8 x,u8 y)
- {
- static u8 tempdat;
- static u8 read_datt;
- u8 wholepage,frontpage_wei,nextpage_wei,whererow;
- read_datt=0;
- tempdat=datt;
- wholepage=x/8; ////// 行所在的当前页
- whererow=x%8; /////// x所在页的第几行
- frontpage_wei=8-whererow; /////// 当前页需要用到几行
- nextpage_wei=8-frontpage_wei; //////下一页需要用到几行
- LCD_write_command(BEGIN_PAGE+wholepage); /////读当前页数据前先写入地址
- LCD_write_command(BEGIN_Y+y);
- read_datt= LCD_read_data(); ////// 读取当前页数据
- read_datt&=0xff>>frontpage_wei;
- tempdat=tempdat<<whererow;
- tempdat|= read_datt;
- write_page_8bit(&tempdat,wholepage,y,1);
- tempdat=0;
- read_datt=0;
- tempdat=datt;
- LCD_write_command(BEGIN_PAGE+wholepage+1); /////读取下一页数据
- LCD_write_command(BEGIN_Y+y);
- read_datt= LCD_read_data(); ////// 读取数据
- read_datt &= 0xff<<nextpage_wei;
- tempdat=tempdat>>frontpage_wei;
- tempdat |=read_datt;
- write_page_8bit(&tempdat,wholepage+1,y,1);
- }
- ///////////////////////////////////////////////////////////////
- // 函数名: write_xy_nbit
- // 功 能 :在任意的位置写 N 列数据
- // LCD_read_zheng_dat(u8 *buffer,u8 page,u8 y,u8 n)
- //////////////////////////////////////////////////////////////
- void write_xy_n8bit(u8 *pbuff,u8 x,u8 y,u8 len)
- {
- static u8 i;
- u8 tempdat[35];
- u8 read_datt[35];
- u8 wholepage,frontpage_wei,nextpage_wei,whererow;
- wholepage=x/8; ////// 行所在的当前页
- whererow=x%8; /////// x所在页的第几行
- frontpage_wei=8-whererow; /////// 当前页需要用到几行
- nextpage_wei=8-frontpage_wei; //////下一页需要用到几行
-
- /* for(i=0;i<35;i++)
- {
- read_datt[i]=0;
- tempdat[i]=0;
- }*/
- for(i=0;i<len;i++)
- tempdat[i]=pbuff[i];
- LCD_read_zheng_dat(read_datt,wholepage,y,len);
- for(i=0;i<len;i++)
- {
- read_datt[i]&=0xff>>frontpage_wei;
- tempdat[i]=tempdat[i]<<whererow;
- tempdat[i]|= read_datt[i];
- }
- // LCD_write_command(BEGIN_ROW);
- write_page_8bit(tempdat,wholepage,y,len);
- /* for(i=0;i<len;i++)
- {
- read_datt[i]=0;
- tempdat[i]=0;
- }*/
- for(i=0;i<len;i++)
- {
- tempdat[i]=pbuff[i];
- }
- LCD_read_zheng_dat(read_datt,wholepage+1,y,len);
- for(i=0;i<len;i++)
- {
- read_datt[i]&=0xff<<nextpage_wei;
- tempdat[i]=tempdat[i]>>frontpage_wei;
- tempdat[i]|= read_datt[i];
- }
- // LCD_write_command(BEGIN_ROW);
- write_page_8bit(tempdat,wholepage+1,y,len);
- }
- ///////////////////////////////////////////////////////////////
- // 函数名:write_angwhere_English
- // 功能 :在任意的(x,y) 的位置处写一个字符
- // 一个字符占16个字节,上下8个字节(8*16)
- ////////////////////////////////////////////////////////////////
- void write_8x16_English(u8 *pps,u8 x,u8 y)
- {
- u8 i;
- u8 andwei; // y行加上8个字节后新的行数
- u8 oddwei;
- u8 oddwei1;
- u8 tempwei;
- u8 tempwei1;
- andwei=y+7;
- if(andwei<64) //位于第一屏
- {
- LCD_CS1=0;
- LCD_CS2=0;
- for(i=0;i<8;i++)
- {
- write_xy_8bit(*pps,x,y+i);
- write_xy_8bit(*(pps+8),x+8,y+i);
- pps++;
- }
-
- }
- else if((y<64)&&(andwei>=64)) //位于第一屏和第二屏之间
- {
- oddwei=andwei-63; // 位于第2屏的位数
- tempwei=8-oddwei; // 位于第1屏的位数
- LCD_CS1=0;
- LCD_CS2=0;
- for(i=0;i<tempwei;i++) //位于第1屏
- {
- write_xy_8bit(*pps,x,y+i);
- write_xy_8bit(*(pps+8),x+8,y+i);
- pps++;
- }
-
- LCD_CS1=0;
- LCD_CS2=1;
- for(i=0;i<oddwei;i++) //位于第2屏
- {
- write_xy_8bit(*(pps),x,i);
- write_xy_8bit(*(pps+8),x+8,i);
- pps++;
- }
-
- }
- else if((y>=64)&&(andwei<128)) //位于第二屏中
- {
- LCD_CS1=0;
- LCD_CS2=1;
- for(i=0;i<8;i++)
- {
- write_xy_8bit(*pps,x,y+i-64);
- write_xy_8bit(*(pps+8),x+8,y+i-64);
- pps++;
- }
- }
- else if((y>63)&&(y<128)&&(andwei>=128)) //位于第2屏和第3屏之间
- {
- oddwei1=andwei-127; //位于第3屏的位数
- tempwei1=8-oddwei1; //位于第2屏
- LCD_CS1=0;
- LCD_CS2=1;
- for(i=0;i<tempwei1;i++) //位于第2屏
- {
- write_xy_8bit(*pps,x,y+i-64);
- write_xy_8bit(*(pps+8),x+8,y+i-64);
- pps++;
- }
- LCD_CS1=1;
- LCD_CS2=0;
- for(i=0;i<oddwei1;i++) //位于第3屏
- {
- write_xy_8bit(*pps,x,i);
- write_xy_8bit(*(pps+8),x+8,i);
- pps++;
- }
- }
- else if((y>=128)&&(andwei<192)) //位于第3屏
- {
- LCD_CS1=1;
- LCD_CS2=0;
- for(i=0;i<8;i++)
- {
- write_xy_8bit(*pps,x,y+i-128);
- write_xy_8bit(*(pps+8),x+8,y+i-128);
- pps++;
- }
-
- }
- else if((y<192)&&(andwei>=192))
- {
- LCD_CS1=0;
- LCD_CS2=0;
- for(i=0;i<8;i++)
- {
- write_xy_8bit(*pps,x+16,i);
- write_xy_8bit(*(pps+8),x+24,i);
- pps++;
- }
- }
- }
- ////////////////////////////////////////////////////////////
- // 函数名:write_7x8_English
- // 共能 :在任意的位置显示一个字符(大小为7x8)
- // 共占用8个字节
- // write_page_8bit(u8 *buffer,u8 page,u8 y,u8 n)
- ////////////////////////////////////////////////////////////
- void write_7x8_English(u8 *pps,u8 x,u8 y)
- {
- u8 andwei; // y行加上8个字节后新的行数
- u8 oddwei;
- u8 tempwei;
- u8 oddpage;
- u8 wholepage;
-
- oddpage = x%8;
- wholepage = x/8;
- andwei=y+7;
- if(oddpage==0)
- {
- if(andwei<64) //位于第一屏
- {
- LCD_CS1=0;
- LCD_CS2=0;
- write_page_8bit(pps,wholepage,y,8);
-
- }
- else if((y<64)&&(andwei>=64)) //位于第一屏和第二屏之间
- {
- oddwei=andwei-63; // 位于第2屏的位数
- tempwei=8-oddwei; // 位于第1屏的位数
- LCD_CS1=0;
- LCD_CS2=0;
- write_page_8bit(pps,wholepage,y,tempwei);
- LCD_CS1=0;
- LCD_CS2=1;
- write_page_8bit(pps+tempwei,wholepage,0,oddwei);
- }
- else if((y>=64)&&(andwei<128)) //位于第二屏中
- {
- LCD_CS1=0;
- LCD_CS2=1;
- write_page_8bit(pps,wholepage,y-64,8);
- }
- else if((y<128)&&(andwei>=128)) //位于第2屏和第3屏之间
- {
- oddwei=andwei-127; //位于第3屏的位数
- tempwei=8-oddwei; //位于第2屏
- LCD_CS1=0;
- LCD_CS2=1;
- write_page_8bit(pps,wholepage,y-64,tempwei);
-
- LCD_CS1=1;
- LCD_CS2=0;
- write_page_8bit(pps+tempwei,wholepage,0,oddwei);
- }
- else //位于第3屏
- {
- LCD_CS1=1;
- LCD_CS2=0;
- write_page_8bit(pps,wholepage,y-128,8);
- }
- }
- else //write_xy_nbit(u8 *pbuff,u8 x,u8 y,u8 len)
- {
- if(andwei<64) //位于第一屏
- {
- LCD_CS1=0;
- LCD_CS2=0;
- write_xy_n8bit(pps,x,y,8);
- /* for(i=0;i<8;i++)
- {
- write_xy_8bit(*pps,x,y+i);
- pps++;
- }*/
- }
- else if((y<64)&&(andwei>=64)) //位于第一屏和第二屏之间
- {
- oddwei=andwei-63; // 位于第2屏的位数
- tempwei=8-oddwei; // 位于第1屏的位数
- LCD_CS1=0;
- LCD_CS2=0;
- write_xy_n8bit(pps,x,y,tempwei);
- /* for(i=0;i<tempwei;i++) //位于第1屏
- {
- write_xy_8bit(*pps,x,y+i);
- pps++;
- }*/
-
- LCD_CS1=0;
- LCD_CS2=1;
- write_xy_n8bit(pps+tempwei,x,0,oddwei);
- /* for(i=0;i<oddwei;i++) //位于第2屏
- {
- write_xy_8bit(*(pps),x,i);
- pps++;
- }*/
-
- }
- else if((y>=64)&&(andwei<128)) //位于第二屏中
- {
- LCD_CS1=0;
- LCD_CS2=1;
- write_xy_n8bit(pps,x,y-64,8);
- /* for(i=0;i<8;i++)
- {
- write_xy_8bit(*pps,x,y+i-64);
- pps++;
- }*/
- }
- else if((y<128)&&(andwei>=128)) //位于第2屏和第3屏之间
- {
- oddwei=andwei-127; //位于第3屏的位数
- tempwei=8-oddwei; //位于第2屏
- LCD_CS1=0;
- LCD_CS2=1;
- write_xy_n8bit(pps,x,y-64,tempwei);
- /* for(i=0;i<tempwei;i++) //位于第2屏
- {
- write_xy_8bit(*pps,x,y+i-64);
-
- pps++;
- }*/
- LCD_CS1=1;
- LCD_CS2=0;
- write_xy_n8bit(pps+tempwei,x,0,oddwei);
- /* for(i=0;i<oddwei;i++) //位于第3屏
- {
- write_xy_8bit(*pps,x,i);
-
- pps++;
- }*/
- }
- else if(y>=128) //位于第3屏
- {
- LCD_CS1=1;
- LCD_CS2=0;
- write_xy_n8bit(pps,x,y-128,8);
- /* for(i=0;i<8;i++)
- {
- write_xy_8bit(*pps,x,y+i-128);
-
- pps++;
- }*/
-
- }
- }
- }
- ////////////////////////////////////////////////////////////
- // 函数名:display_str_en
- // 功能 :在任意地址显示字符串 7*8
- // read_bytes_fromZIC(u8 *pbuffer,u32 addr,u16 len)
- // tiao shi cheng gong
- ////////////////////////////////////////////////////////////
- void display_str_en8(u8 *text,u8 x,u8 y)
- {
- u8 i=0;
- u32 address;
- u8 pbuffer[10];
- u8 temp_y;
- while(text[i]>0) //先判断字符的ASCII码是否为0,
- {
- /* LCD_CS1 = 0;
- LCD_CS2 = 0;
- LCD_write_command(0xc0);
- LCD_CS1 = 0;
- LCD_CS2 = 1;
- LCD_write_command(0xc0);
- LCD_CS1 = 1;
- LCD_CS2 = 0;*/
- LCD_write_command(0xc0);
- temp_y=y+8; //判断剩余列数是否可以写完一个字符
- if(temp_y>192) //如果剩余列数小于8
- {
- x+=8; // 行地址增加一页,列地址为0
- y=0;
- }
- address=(text[i]-0x20)*8+0x66c0; //取点阵地址
- read_bytes_fromZIC(pbuffer,address,8); //取点阵数据,存储在 pbuffer
- write_7x8_English(pbuffer, x, y); //xian shi
- i+=1; //字符地址加1,
- y+=8; // 列数加8
- IWDG_Feed();
- }
- }
- /////////////////////////////////////////////////////////
- // 函数名: display_str_en16
- // 功能 : 显示 8*16字符
- // tiaoshi cheng gong
- ///////////////////////////////////////////////////
- void display_str_en16(u8 *text,u8 x,u8 y)
- {
- u8 i=0;
- u32 address;
- u8 pbuffer[18];
- u8 temp_y;
- while(text[i]>0) //先判断字符的ASCII码是否为0,
- {
- temp_y=y+16; //判断剩余列数是否可以写完一个字符
- if(temp_y>191) //如果剩余列数小于8
- {
- x+=8; // 行地址增加一页,列地址为0
- y=0;
- }
- address=(u32)((text[i]-0x20)*16+0x3b7c0); //取点阵地址
- read_bytes_fromZIC(pbuffer,address,16); //取点阵数据,存储在 pbuffer
- write_8x16_English(pbuffer, x, y); //xian shi
- i+=1; //字符地址加1,
- y+=8; // 列数加8
- }
- }
- ////////////////////////////////////////////////////////////
- // 函数名:write_xy_ch
- // 功能 :在任意的行和列写一个汉字
- // 1个汉字占用32个字节,占16行16列
- // tiao shi cheng gong
- // write_page_8bit(u8 *buffer,u8 page,u8 y,u8 n)
- ////////////////////////////////////////////////////////////
- void write_xy_15x16_ch(u8 *p,u8 x,u8 y)
- {
- u8 wholepage;
- u8 oddpage;
- u8 andwei=0;
- u8 oddwei=0;
- u8 tempwei=0;
- oddpage = x%8;
- wholepage = x/8;
- andwei=y+15;
- if(oddpage==0)
- {
- if(andwei<64) //在第1屏中
- {
- LCD_CS1=0;
- LCD_CS2=0;
- write_page_8bit(p,wholepage,y,16); //上左字节
- write_page_8bit(p+16,wholepage+1,y,16); //下左字节
- }
- else if((y<64)&&(andwei>=64)) //在第1屏和第2屏之间
- {
- oddwei=andwei-63;
- tempwei=16-oddwei;
- LCD_CS1=0;
- LCD_CS2=0;
- write_page_8bit(p,wholepage,y,tempwei);
- write_page_8bit(p+16,wholepage+1,y,tempwei);
- LCD_CS1=0;
- LCD_CS2=1;
- write_page_8bit(p+tempwei,wholepage,0,oddwei);
- write_page_8bit((p+16+tempwei),wholepage+1,0,oddwei);
- }
- else if((y>=64)&&(andwei<128)) //位于第2屏中
- {
- LCD_CS1=0;
- LCD_CS2=1;
- write_page_8bit(p,wholepage,y-64,16);
- write_page_8bit(p+16,wholepage+1,y-64,16);
- }
- else if((y<128)&&(andwei>=128)) //位于第2屏和第3屏之间
- {
- oddwei=andwei-127;
- tempwei=16-oddwei;
- LCD_CS1=0;
- LCD_CS2=1;
- write_page_8bit(p,wholepage,y-64,tempwei);
- write_page_8bit(p+16,wholepage+1,y-64,tempwei);
- LCD_CS1=1;
- LCD_CS2=0;
- write_page_8bit(p+tempwei,wholepage,0,oddwei);
- write_page_8bit(p+16+tempwei,wholepage+1,0,oddwei);
- }
- else if(y>=128) //位于第3屏中
- {
- LCD_CS1=1;
- LCD_CS2=0;
- write_page_8bit(p,wholepage,y-128,16);
- write_page_8bit(p+16,wholepage+1,y-128,16);
- }
- }
- else
- {
- if(andwei<64) //在第1屏中
- {
- LCD_CS1=0;
- LCD_CS2=0;
- write_xy_n8bit(p,x,y,16);
- write_xy_n8bit(p+16,x+8,y,16);
- /* for(i=0;i<8;i++)
- {
- write_xy_8bit(*p,x,y+i); //上左字节
- write_xy_8bit(*(p+8),x,y+8+i); //上右字节
- write_xy_8bit(*(p+16),x+8,y+i); //下左字节
- write_xy_8bit(*(p+24),x+8,y+8+i); //下右字节
- p++;
- }*/
-
- }
- else if((y<64)&&(andwei>=64)) //在第1屏和第2屏之间
- {
- oddwei=andwei-63;
- tempwei=16-oddwei;
- LCD_CS1=0;
- LCD_CS2=0;
- write_xy_n8bit(p,x,y,tempwei);
- write_xy_n8bit(p+16,x+8,y,tempwei);
- /* for(i=0;i<tempwei;i++)
- {
- write_xy_8bit(*p,x,y+i);
- write_xy_8bit(*(p+16),x+8,y+i);
- p++;
- }*/
- LCD_CS1=0;
- LCD_CS2=1;
- write_xy_n8bit(p+tempwei,x,0,oddwei);
- write_xy_n8bit(p+16+tempwei,x+8,0,oddwei);
- /* for(i=0;i<oddwei;i++)
- {
- write_xy_8bit(*p,x,i);
- write_xy_8bit(*(p+16),x+8,i);
- p++;
- }*/
- }
- else if((y>=64)&&(andwei<128)) //位于第2屏中
- {
- LCD_CS1=0;
- LCD_CS2=1;
- write_xy_n8bit(p,x,y-64,16);
- write_xy_n8bit(p+16,x+8,y-64,16);
- /* for(i=0;i<8;i++)
- {
- write_xy_8bit(*p,x,y+i-64);
- write_xy_8bit(*(p+8),x,y+i-56);
- write_xy_8bit(*(p+16),x+8,y+i-64);
- write_xy_8bit(*(p+24),x+8,y+i-56);
- p++;
- } */
- }
- else if((y<128)&&(andwei>=128)) //位于第2屏和第3屏之间
- {
- oddwei=andwei-127;
- tempwei=16-oddwei;
- LCD_CS1=0;
- LCD_CS2=1;
- write_xy_n8bit(p,x,y-64,tempwei);
- write_xy_n8bit(p+16,x+8,y-64,tempwei);
- /* for(i=0;i<tempwei;i++)
- {
- write_xy_8bit(*p,x,y+i-64);
- write_xy_8bit(*(p+16),x+8,y+i-64);
- p++;
- }*/
- LCD_CS1=1;
- LCD_CS2=0;
- write_xy_n8bit(p+tempwei,x,0,oddwei);
- write_xy_n8bit(p+16+tempwei,x+8,0,oddwei);
- /* for(i=0;i<oddwei;i++)
- {
- write_xy_8bit(*p,x,i);
- write_xy_8bit(*(p+16),x+8,i);
- p++;
- } */
- }
- else if((y>=128)&&(andwei<192)) //位于第3屏中
- {
- LCD_CS1=1;
- LCD_CS2=0;
- write_xy_n8bit(p,x,y-128,16);
- write_xy_n8bit(p+16,x+8,y-128,16);
- /* for(i=0;i<8;i++)
- {
- write_xy_8bit(*p,x,y+i-128);
- write_xy_8bit(*(p+8),x,y+i-120);
- write_xy_8bit(*(p+16),x+8,y+i-128);
- write_xy_8bit(*(p+24),x+8,y+i-120);
- p++;
- } */
- }
- }
- }
- /////////////////////////////////////////////////////
- // 函数名:write_xy_11x12_ch
- // 功能 :在任意的地址写1个11x12的汉字
- // 1个汉字占11列12行,24个字节
- // tiao shi cheng gong
- //////////////////////////////////////////////////////
- void write_xy_11x12_ch(u8 *p,u8 x,u8 y)
- {
- u8 i;
- u8 andwei;
- u8 oddwei;
- u8 oddwei_1;
- u8 tempwei;
- u8 tempwei_1;
- andwei=y+11;
-
- if(andwei<64) //在第1屏中
- {
- LCD_CS1=0;
- LCD_CS2=0;
- for(i=0;i<12;i++)
- {
- write_xy_8bit(*p,x,y+i); //上字节
- write_xy_8bit(*(p+12),x+8,y+i); //下字节
- p++;
- }
-
- }
- else if((y<64)&&(andwei>=64)) //在第1屏和第2屏之间
- {
- oddwei=andwei-63;
- tempwei=12-oddwei;
- LCD_CS1=0;
- LCD_CS2=0;
- for(i=0;i<tempwei;i++)
- {
- write_xy_8bit(*p,x,y+i);
- // writedata_8bit(*(p+8),x,y+8+i);
- write_xy_8bit(*(p+12),x+8,y+i);
- // writedata_8bit(*(p+24),x+8,y+8+i);
- p++;
- }
- LCD_CS1=0;
- LCD_CS2=1;;
- for(i=0;i<oddwei;i++)
- {
- // writedata_8bit(*p,x,y+i);
- write_xy_8bit(*p,x,i);
- // writedata_8bit(*(p+16),x+8,y+i);
- write_xy_8bit(*(p+12),x+8,i);
- p++;
- }
- }
- else if((y>=64)&&(andwei<=128)) //位于第2屏中
- {
- LCD_CS1=0;
- LCD_CS2=1;
- for(i=0;i<12;i++)
- {
- write_xy_8bit(*p,x,y+i-64);
- write_xy_8bit(*(p+12),x+8,y+i-64);
- p++;
- }
- }
- else if((y<128)&&(andwei>=128)) //位于第2屏和第3屏之间
- {
- oddwei_1=andwei-127;
- tempwei_1=12-oddwei_1;
- LCD_CS1=0;
- LCD_CS2=1;
- for(i=0;i<tempwei_1;i++)
- {
- write_xy_8bit(*p,x,y+i-64);
- // writedata_8bit(*(p+8),x,y+8+i);
- write_xy_8bit(*(p+12),x+8,y+i-64);
- // writedata_8bit(*(p+24),x+8,y+8+i);
- p++;
- }
- LCD_CS1=1;
- LCD_CS2=0;;
- for(i=0;i<oddwei_1;i++)
- {
- // writedata_8bit(*p,x,y+i);
- write_xy_8bit(*p,x,i);
- // writedata_8bit(*(p+16),x+8,y+i);
- write_xy_8bit(*(p+12),x+8,i);
- p++;
- }
- }
- else if((y>=128)&&(andwei<192)) //位于第3屏中
- {
- LCD_CS1=1;
- LCD_CS2=0;
- for(i=0;i<12;i++)
- {
- write_xy_8bit(*p,x,y+i-128);
- write_xy_8bit(*(p+12),x+8,y+i-128);
- p++;
- }
- }
- /* else if((y<192)&&(andwei>=192))
- {
- LCD_CS1=0;
- LCD_CS2=0;
- for(i=0;i<12;i++)
- {
- write_xy_8bit(*p,x+12,i);
- write_xy_8bit(*(p+12),x+20,i);
- p++;
- }
- }*/
- }
- /////////////////////////////////////////////////////////////
- // 函数名: display_str_gb2312
- // 功能 :显示文本,字符 (7x8)汉字(11x12)
- // 一个汉字占用两个ASCII码
- // tiao shi cheng gong
- /////////////////////////////////////////////////////////////
- void display_str_gb2312(u8 *text,u8 x,u8 y)
- {
- u8 i=0;
- u8 buffer1[26];
- u8 buffer2[10];
- u8 temp_y;
- u32 address;
- while(text[i]>0)
- {
- if((text[i] >=(0xA1-0xa0)) && (text[i] <= (0Xa3-0xa0)) && (text[i+1] >=(0xA1-0xa0)))
- {
- temp_y=y+12;
- if(temp_y>191)
- {
- x+=12;
- y=0;
- }
- text[i] = text[i] + 0xa0 ;
- address =(u32)(((text[i]-0xA1)*94 +(text[i+1] - 0xA1))*24+ 0x3cf80);
- read_bytes_fromZIC(buffer1,address,24);
- write_xy_11x12_ch(buffer1, x, y);
- i+=2;
- y+=12;
- }
- else if((text[i] == (0Xa9-0xa0)) && (text[i+1] >=(0xA1-0xa0)))
- {
- temp_y=y+12;
- if(temp_y>191)
- {
- x+=12;
- y=0;
- }
- text[i] = text[i] + 0xa0 ;
- address =(u32)((282 + (text[i+1] - 0xA1))*24+ 0x3cf80);
- read_bytes_fromZIC(buffer1,address,24);
- write_xy_11x12_ch(buffer1, x, y);
- i+=2;
- y+=12;
- }
- else if((text[i] >=(0xB0-0xa0)) && (text[i] <= (0xF7-0xa0)) && (text[i+1] >=(0xA1-0xa0)))
- {
- temp_y=y+12;
- if(temp_y>191)
- {
- x+=12;
- y=0;
- }
- text[i] = text[i] + 0xa0 ;
- address = (u32)(((text[i] - 0xB0) * 94 + (text[i+1] - 0xA1)+ 376)*24+ 0x3cf80);
- read_bytes_fromZIC(buffer1,address,24);
- write_xy_11x12_ch(buffer1, x, y);
- i+=2;
- y+=12;
- }
- else if ((text[i] >= 0x20) && (text[i] <= 0x7E))
- {
- temp_y=y+8; //判断剩余列数是否可以写完一个字符
- if(temp_y>191) //如果剩余列数小于8
- {
- x+=12; // 行地址增加一页,列地址为0
- y=0;
- }
- address=(u32)((text[i]-0x20)*8+0x66c0); //取点阵地址
- read_bytes_fromZIC(buffer2,address,8); //取点阵数据,存储在 pbuffer
- write_7x8_English(buffer2, x, y); //xian shi
- i+=1; //字符地址加1,
- y+=8; // 列数加8
- }
- else
- break;
- }
- }
- ///////////////////////////////////////////////////////////////
- // 函数名:display_str_15x16_ch
- // 功能 :显示15x16汉字串
- // 调试成功
- ///////////////////////////////////////////////////////////////
- void display_str_15x16_ch(u8 *text,u8 x,u8 y)
- {
- u8 i=0;
- u8 buffer[34];
- u8 temp_y;
- u32 address;
-
- while(text[i]>0)
- {
- LCD_write_command(0xc0);
- IWDG_Feed();
-
- if((text[i] >=0xA4) && (text[i] <= 0Xa8) && (text[i+1] >=0xA1))
- {
- temp_y=y+16;
- if(temp_y>192)
- {
- x+=16;
- y=0;
- }
- address=0;
- read_bytes_fromZIC(buffer,address,32);
- write_xy_15x16_ch( buffer, x, y);
- i+=2;
- y+=16;
- }
- else if((text[i] >=0xA1) && (text[i] <= 0Xa9) && (text[i+1] >=0xA1))
- {
- temp_y=y+16;
- if(temp_y>192)
- {
- x+=16;
- y=0;
- }
- address =((text[i] - 0xA1) * 94 + (text[i+1] - 0xA1))*32;
- read_bytes_fromZIC(buffer,address,32);
- write_xy_15x16_ch( buffer, x, y);
- i+=2;
- y+=16;
- }
- else if((text[i] >=0xB0 )&& (text[i] <= 0xF7) && (text[i+1] >=0xA1))
- {
- temp_y=0;
- temp_y=y+16;
- if(temp_y>192)
- {
- x+=16;
- y=0;
- }
- address = ((text[i] - 0xB0) * 94 + (text[i+1] - 0xA1)+ 846)*32;
- read_bytes_fromZIC(buffer,address,32);
- write_xy_15x16_ch( buffer, x, y);
- i+=2;
- y+=16;
- }
- else
- {
- break;
- }
-
- }
- }
- ///////////////////////////////////////////////////////////////////////////
- // 函数名 :write_wherepage_8bit
- // 功能 :在一页的指定地址写1列数据
- //
- ///////////////////////////////////////////////////////////////////////////
- void write_wherepage_8bit(u8 data,u8 page,u8 y)
- {
- if(y<64)
- {
- LCD_CS1 = 0;
- LCD_CS2 = 0;
- LCD_write_command(0xc0);
- write_page_8bit(&data,page,y,1);
- }
- else if((y>=64)&&(y<128))
- {
- LCD_CS1 = 0;
- LCD_CS2 = 1;
- LCD_write_command(0xc0);
- write_page_8bit(&data,page,y-64,1);
- }
- else
- {
- LCD_CS1 = 1;
- LCD_CS2 = 0;
- LCD_write_command(0xc0);
- write_page_8bit(&data,page,y-128,1);
- }
-
- }
- ///////////////////////////////////////////////////////////////////////////
- // 函数名 :write_wherepage_nbit
- // 功能 :在一页的指定地址写n列数据 ,数据不超过一页
- //
- ///////////////////////////////////////////////////////////////////////////
- void write_wherepage_nbit(u8 *ps,u8 page,u8 y,u8 len)
- {
- u8 i;
- for(i=0;i<len;i++)
- {
- write_wherepage_8bit(*ps,page,y+i) ;
- ps++;
- }
- }
- ///////////////////////////////////////////////////////////////
- // 函数名: write_string_dat
- // 功能 :在指定的地址写入n列数据串
- // write_xy_8bit(u8 datt,u8 x,u8 y)
- // write_page_8bit(u8 *buffer,u8 page,u8 y,u8 n)
- ////////////////////////////////////////////////////////////////
- void write_string_dat(u8 h_addr,u8 l_addr,u8 *ps,u16 len)
- {
- u8 where_page,where_y;
- u8 remain_y;
- u16 Address;
- Address = (u16)(h_addr<<8);
- Address = Address + l_addr;
- where_page = Address/192 ; //把总的地址变为 页地址 和 列地址
- where_y = Address%192 ;
- remain_y = 192 - where_y ; //在起始页中剩余的列数
- if(len<=remain_y) remain_y = len ; //如果要写入的数据长度小于起始页中剩余的列数,则把长度字节赋予列数字节
- while(1)
- {
- write_wherepage_nbit(ps,where_page,where_y,remain_y) ; //在指定的页指定的列写入remain_y个数据
- if(len==remain_y) break; //如果 len 与 remain_y 相等,则退出循环
- else //len > remain_y
- {
- ps += remain_y ; //数组数据地址加remain_y
- where_page += 1; //页地址加一
- where_y = 0; //列地址归零
-
- len = len - remain_y; //数据长度减去remain_y
- if(len>=192)remain_y=192 ; //如果剩余的数据长度大于192,则把192赋予remain_y
- else remain_y = len ; //否则,把len 赋予remain_y
- }
- }
- }
复制代码
|
-
-
LCD.rar
18.15 KB, 下载次数: 266, 下载积分: 黑币 -5
19264屏
评分
-
查看全部评分
|