HT1621B段码 LCD屏驱动 51单片机驱动程序
逻辑图
左边三段数字是温度显示 右边两位是湿度
下面是完整的程序 (io口模拟spi发送数据写给ram)个人理解 水平有限
头文件 lcd.h
#ifndef __LCD__H__
#define __LCD__H__
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define NOP _nop_();_nop_();_nop_();_nop_();_nop_();_nop_()sbit DATA=P1^0;
sbit W_R=P1^1;
sbit CS=P1^3;
/*************************/
uchar num_data[];
//char flag;
char cache[];
void initial();
void Write_Bits(uchar buffer,uchar i);
void tran_data(uchar *p);
void wave();
void delay(uchar);
void witre_clear();
void write_data_by_8bit(uchar num,uchar ad);
void Write_Temperature(uint t,uchar p1,uchar t46);//温度显示
void Write_Humidity(uint h ,uchar t3);//湿度显示
void Write_Mode(uchar a,uchar m);//AUTO//Manual 模式
void Write_Wifi(uchar h);//wifi显示
void Write_Water(uchar w);//缺水显示
void Write_Level(uchar s7,uchar s14,uchar s21); //风力档位
void Show_cache();//将显存写入HT1621的ram#endif
源文件
#include<reg51.h>
#include<intrins.h>
#include"lcd.h"uchar num_data[]={0xf5,0x05,0xb6,0x97,0x47,0xd3,0xf3,0x85,0xf7,0xd7};//0到9的字库
char cache[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};///显存数组
char flag=1 ;
void initial()
{CS=0;DATA=1; wave(); //command mode命令模式 配置HT1621DATA=0; wave(); DATA=0; wave();Write_Bits(0x18, 8);//RC 256KWrite_Bits(0x00, 8);Write_Bits(0x01, 8);//turn on system oscilator Write_Bits(0x03, 8);//turn on bias generatorWrite_Bits(0x29, 8);//1/3 bias 4 commons// 1/2 bias 3 commons//0x04
// tran_inst(0xe0); //turn on lcd outputCS=1;}void write_data_by_8bit(uchar p,uchar ad)
{ unsigned char i,address=((ad*2)<<2);///对应ram地址 两个4位一写CS=0;DATA=1;wave();//数据模式DATA=0;wave();DATA=1;wave();for(i=0;i<6;i++)6位地址 { DATA=((address&0x80)==0x80);wave();address<<=1; }Write_Bits(p,8);
//delay(4);CS= 1;
}void Write_Bits(uchar buffer,uchar j) //按j位写数据
{ uchar i;for(i=0;i<j;i++){DATA=((buffer&0x80)==0x80);wave();buffer<<=1;}
// DATA=0;
// wave(); W_R=1; }void delay(uchar time) //延时 50*time ms
{uchar i;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256; TR0=1; for(i=0;i<time;i++){while(~TF0) ; TF0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256; }
}void wave() // generate a waveform 模拟clk
{W_R=0; NOP;W_R=1; NOP;W_R=0; NOP;
}
void witre_clear() //清cache
{uchar j;for(j=0;j<10;j++) {cache[j]=0x00;}}
void Write_Temperature(uint t,uchar p1,uchar t46)//3位温度数据写到cache p1 为小数点 0 1亮灭 /t46 1 ℃摄氏度 2℉华氏度 0灭
{unsigned char a0,a1,a2;a2=(t/100)%10;//百位a1=(t/10)%10;///十位a0=t%10;个位cache[2]=num_data[a0];cache[1]=num_data[a1];cache[0]=num_data[a2];if(p1==1)cache[1]=cache[1]|(1<<3);elsecache[1]=cache[1]&~(1<<3);if(t46==1){flag=1;//解决T6被湿度覆盖cache[2]=cache[2]|(1<<3); //T4cache[3]=cache[3]|(1<<3); //T6cache[0]=cache[0]&~(1<<3);//T5}else if(t46==2){flag=0;//
cache[2]=cache[2]|(1<<3);
cache[3]=cache[3]&~(1<<3);cache[0]=cache[0]|(1<<3);}else{flag=0;cache[2]=cache[2]&~(1<<3);cache[3]=cache[3]&~(1<<3);cache[0]=cache[0]&~(1<<3);}}void Write_Humidity(uint h,uchar t3)//写两位湿度 T3 %
{unsigned char a0,a1;a1=(h/10)%10;///a0=h%10;if(flag)cache[3]=num_data[a1]|(1<<3);elsecache[3]=num_data[a1]&~(1<<3); cache[4]=num_data[a0];if(t3==1)cache[4]=cache[4]|(1<<3);elsecache[4]=cache[4]&~(1<<3);}void Write_Mode(uchar a,uchar m)//if(a==1)cache[5]=cache[5]|(1<<6);elsecache[5]=cache[5]&~(1<<6);if(m==1)cache[5]=cache[5]|(1<<7);elsecache[5]=cache[5]&~(1<<7);}void Write_Wifi(uchar h);//void Write_Water(uchar w)//
{if(w==1)cache[7]=cache[7]|(1<<3);elsecache[7]=cache[7]&~(1<<3);
}void Write_Level(uchar s7,uchar s14,uchar s21)//S7/S14/S21 第几个叶子代表档位 1单叶 2双叶 0:灭 单页和双叶循环转动
{if(s7==1){cache[7]=cache[7]|(1<<1);cache[7]=cache[7]|(1<<2);cache[7]=cache[7]|(1<<4);cache[7]=cache[7]|(1<<6);cache[7]=cache[7]&~(1<<0);cache[7]=cache[7]&~(1<<5);cache[7]=cache[7]&~(1<<7);}else if(s7==2){cache[7]=cache[7]|(1<<1);cache[7]=cache[7]|(1<<0);cache[7]=cache[7]|(1<<5);cache[7]=cache[7]|(1<<7);cache[7]=cache[7]&~(1<<2);cache[7]=cache[7]&~(1<<4);cache[7]=cache[7]&~(1<<6);}else{cache[7]=cache[7]&~(1<<1);cache[7]=cache[7]&~(1<<2);cache[7]=cache[7]&~(1<<0);cache[7]=cache[7]&~(1<<4);cache[7]=cache[7]&~(1<<5);cache[7]=cache[7]&~(1<<6);cache[7]=cache[7]&~(1<<7);}
// if(s14==1){cache[6]=cache[6]|(1<<1);cache[6]=cache[6]|(1<<2);cache[6]=cache[6]|(1<<4);cache[6]=cache[6]|(1<<6);cache[6]=cache[6]&~(1<<0);cache[6]=cache[6]&~(1<<5);cache[6]=cache[6]&~(1<<3);}else if(s14==2){cache[6]=cache[6]|(1<<1);cache[6]=cache[6]|(1<<0);cache[6]=cache[6]|(1<<5);cache[6]=cache[6]|(1<<3);cache[6]=cache[6]&~(1<<2);cache[6]=cache[6]&~(1<<4);cache[6]=cache[6]&~(1<<6);}else{cache[6]=cache[6]&~(1<<1);cache[6]=cache[6]&~(1<<2);cache[6]=cache[6]&~(1<<0);cache[6]=cache[6]&~(1<<4);cache[6]=cache[6]&~(1<<5);cache[6]=cache[6]&~(1<<6);cache[6]=cache[6]&~(1<<3);}
/if(s21==1){cache[5]=cache[5]|(1<<2);cache[5]=cache[5]|(1<<4);cache[5]=cache[5]|(1<<1);cache[6]=cache[6]|(1<<7);//cache[5]=cache[5]&~(1<<0);cache[5]=cache[5]&~(1<<5);cache[5]=cache[5]&~(1<<3);}else if(s21==2){cache[5]=cache[5]|(1<<2);cache[5]=cache[5]&~(1<<4);cache[5]=cache[5]&~(1<<1);cache[6]=cache[6]&~(1<<7);//cache[5]=cache[5]|(1<<0);cache[5]=cache[5]|(1<<5);cache[5]=cache[5]|(1<<3);}else{cache[5]=cache[5]&~(1<<2);cache[5]=cache[5]&~(1<<4);cache[5]=cache[5]&~(1<<1);cache[6]=cache[6]&~(1<<7);//cache[5]=cache[5]&~(1<<0);cache[5]=cache[5]&~(1<<5);cache[5]=cache[5]&~(1<<3);}}void Show_cache()
{ unsigned int j;for(j=0;j<8;j++) {write_data_by_8bit(cache[j], j);}
}
main.c
#include<reg51.h>
#include<intrins.h>
#include"lcd.h"void main()
{unsigned long h=0,i=0;CS=1;W_R=0;initial();//³õʼ»¯ ÉèÖÃlcdwitre_clear(); while(1){ i++;h++; Write_Temperature(i,1,1);//Write_Humidity(h,1);//***********//Write_Mode(0,0);Write_Water(1);Write_Level(1,1,1);if(i>=1000) i=0;if(h>=100) h=0;Show_cache();delay(10);//500msWrite_Temperature(i,1,2);Write_Humidity(h,0);Write_Mode(1,1);Write_Water(0);Write_Level(2,2,2);Show_cache();delay(10);}
}
HT1621B段码 LCD屏驱动 51单片机驱动程序相关推荐
- 【解决方案】STM32L152单片机驱动段码LCD屏,执行HAL_LCD_Init函数失败返回HAL_TIMEOUT,长时间卡在LCD_FLAG_RDY的while循环里面的解决办法
STM32L152单片机驱动段码LCD屏,HAL_LCD_Init函数执行失败,卡在LCD_FLAG_RDY里面,函数返回HAL_TIMEOUT /*!< Wait Until the LCD ...
- 段码液晶屏驱动IC你知道怎么选吗?
段码液晶屏因其简易便捷的动态显示,灵便的反应速率,不用人为因素的长期的实际操作而遭受众多客户的应用.那麼,段码液晶屏的驱动IC该如何选择就由液晶屏生产厂家来给你详细介绍. 段码液晶屏的驱动 ...
- DSP28035驱动HT1621B显示段码LCD屏
最近做的项目里面使用的控制芯片为TI公司的28035,在控制程序以外,需要用该芯片控制显示LCD屏幕,其中驱动LCD屏幕的是HT1621B芯片,由于这也是我第一次写驱动LCD的程序以及第一次接触162 ...
- 段码LCD研究 | 用HT1621B驱动段码LCD屏
[本文发布地址https://blog.csdn.net/Stack_/article/details/117532877,未经许可不得转载,转载须注明出处] 一.探索 这是一个从乐心血压计上拆下来的 ...
- LCD段码液晶屏驱动方法介绍
LCD段码屏的驱动基本原理是:具备偶极矩的lcd段码屏针状分子结构在另加电场的施加下其排序情况产生变化,促使根据液晶显示器件的光被调配,进而展现明与暗或透光与不透的表明实际效果.液晶显示器件中的每一个 ...
- 超低功耗 段码LCD液晶显示驱动IC-VKL060 SSOP24 15SEG*4COM,超低工作电流约7.5微安,多用于传感器/水电表/工控仪表等
产品品牌:永嘉微电/VINKA 产品型号:VKL060 封装形式:SSOP24 概述: VKL060 SSOP24是一个点阵式存储映射的LCD驱动器,可支持最大60点(15SEGx4COM)的 LCD ...
- 裸片IC液晶驱动多种封装选择VK1621SS香熏机/计算器/额温枪段码LCD液晶显示驱动IC,DICE(邦定COB)/COG(绑定玻璃用)
型号:VK1621SS 品牌:永嘉微电/VINKA 封装形式:SSOP48/ LQFP48/LQFP44/SDIP28/DICE 裸,片:DICE(邦定COB)/COG(绑定玻璃用) 年份:新年份 K ...
- VK1621是段码LCD液晶显示屏驱动IC,具省电模式,替代市面上1621 LQFP44/48、SSOP48、DICE,最大支持32*4点阵 FAE技术支持
产品品牌:永嘉微电/VINKA 产品型号:VK1621 封装形式:LQFP44/48.SSOP48.SDIP28.DICE裸片 概述: VK1621是一个点阵式存储映射的LCD驱动器,可支持最大128 ...
- 64*8点阵 段码LCD液晶显示驱动IC-VK1625 LQFP/QFP100,兼容替代市面上1625,适用机车仪表/跑步机面板等
产品品牌:永嘉微电/VINKA 产品型号:VK1625 封装形式:LQFP100/QFP100.DICE/COG(定制) 概述: VK1625是一个点阵式存储映射的LCD驱动器,可支持最大512点(6 ...
最新文章
- 不是广告--如何学Java,我说点不太一样的学习方式
- 为什么 Pi 会出现在正态分布的方程中?
- 独家 | 攀登数据科学家和数据工程师之间的隔墙
- 每日一皮:据说PM就是这样忍受你的!
- windows环境下设置Redis自启动
- sklearn综合示例9:分类问题的onehot与预测阈值调整
- 什么叫临界资源和临界区?
- 使用Docker运行SQL Server
- MySQL中保存emoji表情
- EasyUI 中combobox利用拼音进行检索
- 使用Unified Communications Managed API获取Lync在线会议的链接地址
- 周云蓬献唱《杜甫三章》实证“把古人唱成亲人”
- Excel输入公式计算只显示公式不出结果
- SEO优化之浅谈蜘蛛日志
- java背包问题程序_背包问题-java实现
- 单目相机标定实现--张正友标定法
- 手机QQ2008聊天记录导入手机QQ2009 塞班第三版Python全代码
- 一行css代码让整个网站变灰, 通过js控制定点触发和关闭
- oracle的catalog,Oracle 配置 catalog
- python控制电脑定时开机关机_如何实现电脑在指定的时间自动开机?