|
刚调通了LCD12864 芯片为ST7920带中文字库的屏的驱动,串行驱动,贴出来让大家挑挑刺,顺便开源备份一下
功能:说白了,其实就3个
1、显示字符串
2、显示数字
3、反白显示
说明:
1、先说字符串,因为屏幕自带了字库16*16的,支持中文,只能显示4行,每行16字节,特别是中英文混合显示,处理不好会乱码,所以这部分也没特别好的办法,直接由用户控制了。支持反白显示
2、数字显示支持十进制和十六进制,左对齐、右对齐和中间对齐,支持全部显示或者只显示一部分空白部分支持自定义字符(当然是字库要有才行),支持反白显示。
3、反白显示可以单独控制,用0x00和0xff就可以适应大部分应用,也就是透明和不透明之分。当然,改一下也可以支持图形,这个目前没做。。
效果: LCD_ShowNumber(2,0,0x567890,FORMAT_H|DISP_ALL,' ',0xff);
LCD_ShowNumber(2,1,-12345,FORMAT_D|ALIGN_R|10,'*',0x00);
LCD_ShowNumber(2,2,12345,FORMAT_D|ALIGN_M|7,' ',0xff);
LCD_ShowNumber(5,3,tick,FORMAT_D|ALIGN_M|DISP_ALL,' ',0xff);
以上。。
以下是头文件
- #ifndef __LCD12864_ZK_H
- #define __LCD12864_ZK_H
- #include "main.h"
- //数据显示长度
- #define DISP_MASK 0x1F
- #define DISP_ALL 0x00
- //进制格式
- #define FORMAT_MASK 0x80
- #define FORMAT_D 0x00 //十进制Decimal
- #define FORMAT_H 0x80 //十六进制Hexadecimal
- //对齐方式
- #define ALIGN_MASK 0x60
- #define ALIGN_R 0x00 //右对齐
- #define ALIGN_L 0x20 //左对齐
- #define ALIGN_M 0x40 //中间对齐
- void LCD_Init(void);
- void LCD_ShowString(unsigned char x,unsigned char y,const char *pStr,unsigned char bg);
- void LCD_ShowNumber(unsigned char x,unsigned char y,long num,unsigned char param,char fill,unsigned char bg);
- void LCD_SetWhite(unsigned char x,unsigned char y,unsigned char width);
- void LCD_SetBG(unsigned char x,unsigned char y,unsigned char w,unsigned char bg);
- void LCD_Process(void);
-
- #endif
复制代码
以下是C文件
- #include "main.h"
- #define LCD_RST_1 P20 = 1
- #define LCD_RST_0 P20 = 0
- #define LCD_CS_1 P26 = 1
- #define LCD_CS_0 P26 = 0
- #define LCD_CLK_1 P24 = 1
- #define LCD_CLK_0 P24 = 0
- #define LCD_SID_1 P25 = 1
- #define LCD_SID_0 P25 = 0
- static void write(char cmd, unsigned char dat) //写指令或数据 数据cmd=1:0xfa 命令cmd=0:0xf8
- { unsigned char i,j,Temp;
-
- LCD_CS_1;
- LCD_CLK_0;
-
- for(j=0;j<3;j++){
- if (j==0){ Temp =( cmd? 0xfa:0xf8);}
- else if (j==1){ Temp =((dat<<0) & 0xf0);}
- else if (j==2){ Temp =((dat<<4) & 0xf0);}
- for(i=0;i<8;i++){
- (Temp&0x80)?(LCD_SID_1):(LCD_SID_0); Temp<<=1; delay_us(1); //左移
- LCD_CLK_1; //delay_us(1); //_nop_();_nop_();//移入
- LCD_CLK_0; //delay_us(1); //_nop_();_nop_();_nop_(); //读出
- }
- }
- LCD_CS_0;
- }
- unsigned char SetWdat[64];//反白显示缓存
- unsigned char SetWdat_bak[64];//反白显示缓存
- //设置反白区域
- void LCD_SetBG(unsigned char x,unsigned char y,unsigned char w,unsigned char bg)
- {
- unsigned char i;
- if(x>15||y>3||w==0) return; //超出范围
- if(w+x>16) w = 16-x;
- for(i=0;i<w;i++){
- SetWdat[(y<<4)+x+i] = bg;
- }
- }
- //反白显示2字节
- void LCD_ShowBG2Byte(unsigned char n)
- {
- unsigned char Ax[] = {0x80,0x80,0x88,0x88};
- unsigned char Ay[] = {0x80,0x90,0x80,0x90};
- unsigned char j;
- unsigned char x = ((n&0x0f)>>1);
- unsigned char y = (n>>4);
-
- write(0,0x34); write(0,0x36); //打开GGRAM
- for(j=0;j<16;j++){
- write(0,Ay[y]+j); //y
- write(0,Ax[y]+x); //x
- write(1,SetWdat[n]);
- write(1,SetWdat[n+1]);
- }
- write(0,0x30); //关闭GGRAM
- }
- void LCD_BGProcess(void) //反白显示
- {
- unsigned char i;
- for(i=0;i<64;i+=2){
- if((SetWdat_bak[i]!=SetWdat[i])||(SetWdat_bak[i+1]!=SetWdat[i+1])){ SetWdat_bak[i] = SetWdat[i]; SetWdat_bak[i+1] = SetWdat[i+1];
- LCD_ShowBG2Byte(i);
- }
- }
- }
- unsigned char LCDdat[64];//显示缓存
- unsigned char LCDdat_bak[64];//显示缓存备份
- void LCD_Process(void) //模拟刷屏12864
- {
- unsigned char Addr[] = {0x80,0x90,0x88,0x98};
- unsigned char i;
-
- for(i=0;i<64;i+=2){
- if((LCDdat_bak[i]!=LCDdat[i])||(LCDdat_bak[i+1]!=LCDdat[i+1])){LCDdat_bak[i] = LCDdat[i];LCDdat_bak[i+1] = LCDdat[i+1];
- write(0,Addr[i>>4]+((i&0x0f)>>1)); //写地址 控制光标
- write(1,LCDdat[i]); //数据一次要连写两个
- write(1,LCDdat[i+1]); //数据一次要连写两个
- }
- }
- LCD_BGProcess();
- }
- //void LCD_RefreshALL(void) //模拟刷屏12864
- //{
- // unsigned char Addr[] = {0x80,0x90,0x88,0x98};
- // unsigned char i,j;
- //
- // for(i=0;i<4;i++){ //送四行汉字 //一次送一个汉字 (两个字节)
- // write(0,Addr[i]); //先送地址后送16个字符
- // for(j=0;j<16;j++){write(1,LCDdat[(i*16)+j]);}
- // }
- //}
- void LCD_ClearGM(void)
- {
- unsigned char i,j;
- write(0,0x34);
- write(0,0x36);
- for(j=0;j<32;j++)
- {
- write(0,0x80+j);
- write(0,0x80);
- for(i=0;i<16;i++)
- {
- write(1,0x00);
- }
- }
- for(j=0;j<32;j++)
- {
- write(0,0x80+j);
- write(0,0x88);
- for(i=0;i<16;i++)
- {
- write(1,0x00);
- }
- }
- write(0,0x30);
- }
- //******************** 显示字符串 ***********************//
- //** x:横坐标(0~15) y:纵坐标(0~3) 显示中文时注意从x坐标偶数写,否则乱码
- void LCD_ShowString(unsigned char x,unsigned char y,const char *pStr,unsigned char bg)
- {
- unsigned char i;
- unsigned int strLen = strlen(pStr); //字符串长度用 strlen(); 类型长度 sizeof();
- if(strLen<=0||x>15||y>3) return; //超出范围
-
- if(strLen+x>16) strLen = 16-x;
- for(i=0;i<strLen;i++){ //只在一行显示,超出部分丢弃
- LCDdat[16*y+x+i] = pStr[i];
- }
- LCD_SetBG(x,y,strLen,bg);
- }
- //******************** 显示数字 ***********************//
- //** x:横坐标(0~15) y:纵坐标(0~3)
- //** param:
- //** (bit(7) 0:十进制显示 1:十六进制显示)
- //** (bit(6~5) 00:右对齐 01:左对齐 10:中间对齐)
- //** (bit(4~0)显示的长度0~31 0:显示全部)
- //** fill: 空白处填充的字符,注意转义字符
- void LCD_ShowNumber(unsigned char x,unsigned char y,long num,unsigned char param,char fill,unsigned char bg)
- {
- unsigned char i;
- char strBuff[32]; //一行字符缓存
- char disBuff[32]; //一行字符缓存用于显示
- int strLen = 0;
- unsigned char disLen = (param&DISP_MASK);
-
- if((x>15)||(y>3)) return; //超出范围
-
- if(param&FORMAT_MASK){ //十六进制显示
- strLen = sprintf(strBuff,"%lX",num);
- }
- else{ //十进制显示
- strLen = sprintf(strBuff,"%ld",num);
- }
-
- if(strLen<=0) return; //错误
-
- if(disLen==DISP_ALL) disLen = strLen; //数据长度为0则全部显示
-
- if((param&ALIGN_MASK)==ALIGN_R){//右对齐
- for(i=0;i<disLen;i++){
- if(i<strLen) disBuff[disLen-1-i] = strBuff[strLen-1-i];
- else disBuff[disLen-1-i] = fill;
- }
- }
- else if((param&ALIGN_MASK)==ALIGN_L){//左对齐
- for(i=0;i<disLen;i++){
- if(i<strLen) disBuff[i] = strBuff[i];
- else disBuff[i] = fill;
- }
- }
- else if((param&ALIGN_MASK)==ALIGN_M){//中间对齐
- uint8_t disM = (disLen>>1); //显示窗口的中间位置
- uint8_t strM = (strLen>>1); //数据的中间位置
- for(i=0;i<disM;i++){ //前半部分 右对齐
- if(i<strM) disBuff[disM-1-i] = strBuff[strM-1-i];
- else disBuff[disM-1-i] = fill;
- }
- for(i=disM;i<disLen;i++){ //后半部分 左对齐
- if(strM+i-disM<strLen) disBuff[i] = strBuff[strM+i-disM];
- else disBuff[i] = fill;
- }
- }
- disBuff[disLen] = '\0'; //末尾加结束符
- LCD_ShowString(x,y,disBuff,bg);
- }
- /**********************************
- LCD初始化
- **********************************/
- void LCD_Init(void)
- {
- memset(LCDdat,' ',sizeof(LCDdat));
- memset(LCDdat_bak,0x00,sizeof(LCDdat_bak));
- memset(SetWdat,0x00,sizeof(SetWdat));
- memset(SetWdat_bak,0x00,sizeof(SetWdat_bak));
-
- LCD_RST_0; delay_ms(100);
- LCD_RST_1; //delay_ms(100);//复位
- write(0,0x30); //8 位介面,基本指令集
- write(0,0x0c); //显示打开,光标关,反白关
- write(0,0x01); //清屏,将DDRAM的地址计数器归零
- // delay_ms(100);
- LCD_ClearGM();
-
- // LCD_SetBG(3,1,5,1);
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|